代码之家  ›  专栏  ›  技术社区  ›  ccppjava

IE6不解析加载的JavaScript文件(Recaptcha由Google托管)

  •  3
  • ccppjava  · 技术社区  · 16 年前

    我提到了谷歌的js: http://www.google.com/recaptcha/api/challenge?k=the_key 它是根据fiddler2&加载的;“onreadystatechange”事件(readystate=='已加载')

    正常的工作流程应该是对加载的JS进行解析,并请求另一个JS,然后从google加载图像。我的问题是第一个加载的JS文件(内容类似于下面的内容):

    var RecaptchaState = {
        site : 'xxxxxxxxxxxx',
        challenge : 'xxxxxxxxxxxxxxxxxxxxxxxxx',
        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>');
    

    未分析。首先,进行以下JS测试:

     typeof RecaptchaState == 'undefined'
    

    其次,没有第二个脚本请求(根据fiddler2),更不用说recaptcha图像了。。。

    function GetJavaScript(url, callback) {
        var script = document.createElement('script');
        script.src = url;
        var head = document.getElementsByTagName('head')[0];
        var done = false;
    
        // Attach handlers for all browsers
        script.onload = script.onreadystatechange = function () {
            if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
                done = true;
                callback();
    
                // remove the hanlder
                script.onload = script.onreadystatechange = null;
                head.removeChild(script);
            }
        };
    
        head.appendChild(script);
    }
    

    同样的行为。。。最让我困惑的是: 只有当页面从另一个页面重定向时,才会偶尔发生此问题(在新的浏览器窗口中直接打开url或刷新页面总是可以正常工作,但是使用JavaScript刷新页面不起作用……)

    请帮助,任何建议和/或想法将不胜感激。。。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Joel Kline    15 年前

    仔细检查页面源代码中的脚本src是否不是api.recaptcha.net(有些库使用它,我知道我使用的Java库使用它)。如果是的话,那就转到www.google.com/recaptcha/api,这似乎会导致IE6出现问题。有一次我改用www.google.com/recaptcha/api 作为src的实际脚本,IE6非常高兴。祝你好运!

        2
  •  1
  •   CGK    15 年前

    this 加入reCaptcha的Google组。

        3
  •  0
  •   ccppjava    16 年前

    这不是一个解决办法,只是一个变通办法。

    请求第一个js文件: http://www.google.com/recaptcha/api/challenge?k=the_key

    var RecaptchaState = {
        site : 'xxxxxxxxxxxx',
        challenge : 'xxxxxxxxxxxxxxxxxxxxxxxxx',
        is_incorrect : false,
        programming_error : '',
        error_message : '',
        server : 'http://www.google.com/recaptcha/api/',
        timeout : 18000
    };
    

    然后,使用GetJavaScript函数和/或JQuery.getScript()函数加载第二个脚本: http://www.google.com/recaptcha/api/js/recaptcha.js

    基于我的测试,这个解决方案适用于IE6,为了减少服务器的负载,我在服务器端和客户端检测用户的浏览器,注入不同的逻辑。

        4
  •  -1
  •   foret    16 年前

    不回答(或者是?):fou Ok ie6。说真的,算了吧。如果没有这种态度,ie6将永远存在。它就像古老的恶魔,直到有人相信它,它才会复活。