我今天遇到了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 = "&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 = "&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对象,这将打印“对象”,这意味着所有这些工作都已经完成。