IE6中未显示ReCaptcha

我今天遇到了ReCaptcha和IE6的一个问题,所以我会写一些有关其他问题的信息(Google上没有很多有关此问题的东西),所以我可以记住什么我将来会做。

我使用的表单是一个多阶段表单,第二部分包含对ReCaptcha函数的调用,该函数recaptcha_get_html()是我正在使用的PHP库的一部分(在本例中为1.11)。当使用IE6的用户进入此页面时,“ ReCaptcha”框丢失了,但是刷新页面后出现了该框。ReCaptcha通过从Google下载并运行一段JavaScript来工作。经过一些研究,当通过表单发布重定向到页面时,IE6似乎不会下载此JavaScript(可能会发生其他异常),但是如果直接访问或刷新后会访问。以下代码段(如果应要求从Google返回的代码):

var RecaptchaState = {
 site : 'xxxxxxxxxxxx',
 challenge : 'xxxxxxxxxxx',
 is_incorrect : false,
 programming_error : '',
 error_message : '',
 server : 'http://www.google.com/recaptcha/api/',
 timeout : 18000
};
 
document.write('<scr'+'ipt type="text/javascript" s'+'rc="' +RecaptchaState.server+ 'js/recaptcha.js"></scr'+'ipt>');

解决方案是recaptcha_get_html()使用PHP函数强制在函数中上面下载所需的JavaScript,file_get_contents()并打印出脚本中的内容。这是原始recaptcha_get_html()功能,可以recaptchalib.php在ReCaptcha库文件夹的第106行找到。

function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
{
	if ($pubkey == null || $pubkey == '') {
		die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>");
	}
 
	if ($use_ssl) {
                $server = RECAPTCHA_API_SECURE_SERVER;
        } else {
                $server = RECAPTCHA_API_SERVER;
        }
 
        $errorpart = "";
        if ($error) {
           $errorpart = "&amp;error=" . $error;
        }
        return '<script type="text/javascript" xx_src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
 
	<noscript>
  		<iframe xx_src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
  		<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
  		<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
	</noscript>';
}

下面是否在原始函数中添加了一个子句以检查用户是否正在使用IE6。如果它们是脚本,则使用下载file_get_contents()并打印出脚本。

function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
{
	if ($pubkey == null || $pubkey == '') {
		die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>");
	}
 
	if ($use_ssl) {
                $server = RECAPTCHA_API_SECURE_SERVER;
        } else {
                $server = RECAPTCHA_API_SERVER;
        }
 
        $errorpart = "";
        if ($error) {
           $errorpart = "&amp;error=" . $error;
        }
 
        // 添加了强制IE6工作的子句。
        if ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0;') !== false)) {
            $javaScriptEmbed = file_get_contents($server . '/challenge?k=' . $pubkey . $errorpart);
            return '<script type="text/javascript">' . $javaScriptEmbed . '</script>
 
        <noscript>
            <iframe xx_src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
            <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
            <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
        </noscript>';
 
        } else {
 
            return '<script type="text/javascript" xx_src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
 
        <noscript>
            <iframe xx_src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
            <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
            <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
        </noscript>';
        }
}

这似乎很好地解决了这个问题。如果要检查代码是否已加载,请使用调用alert(typeof RecaptchaState);致电ReCaptcha之后。如果页面上存在RecaptchaState对象,这将打印“对象”,这意味着所有这些工作都已经完成。