【问题标题】:detect and suppress errors loading javascript file检测并抑制加载 javascript 文件的错误
【发布时间】:2010-09-03 19:49:23
【问题描述】:

我想从 facebook http://connect.facebook.net/en_US/all.js 获取一个 javascript 文件

我工作的组织有一个阻止访问 Facebook 的防火墙,它只是进入一个 html 页面,上面写着“访问被拒绝等等等等”

我希望能够放置一个 javascript src 标记 <script src="http://... "> </script> 并在浏览器尝试将 html 评估为 javascript 时检测并抑制警告。

有人知道怎么做吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    看起来jQuery.getScript 是您所需要的,如前所述。或者你可以手动执行:

    $.ajax({
      url: url,
      dataType: 'script',
      success: function(){document.write('<script src="http://... "> </script>');}
    });
    

    并在成功加载时使用&lt;script&gt;&lt;/script&gt; 标记附加您的html。

    【讨论】:

    • 由于 src url 与包含页面位于不同的域中,因此您的 ajax 请求将始终失败。
    • 他试图做相反的事情——如果它没有加载,就会发现错误。
    • 澄清一下,问题是如果代理返回一个 html 文件而不是脚本,他会得到一个 HTML 页面。如果我更改您的 jsfiddle 以加载 html 文件,警报仍然会触发:jsfiddle.net/J3NjY
    • 从问题中可以看出,当脚本不可用时,Quinn 想要“抑制警告”。如果 Quinn Wilson 可以加入我们的对话,那将有所帮助:)
    • 实际上,在上面的示例中它没有成功并且警报触发。所以确实会发生一些事情。我看不出您的示例与仅将 '
    【解决方案2】:

    使用标准的&lt;script&gt; 标签,这是不可能的。当脚本的 src 被命中并下载内容时,并没有真正运行,因此您不能将其包装在 try/catch 块中。关于如何动态加载脚本有一些技巧here。也许浏览器会在创建的 DOM 元素中添加一些你可以检查的东西。

    【讨论】:

    • 你发布的链接不见了,你有没有其他地方有这些提示?
    【解决方案3】:

    这是一种解决方法,而不是直接答案,但您可以简单地在 Facebook 的防火墙外设置 reverse proxy 并从那里加载脚本。它不会更优雅地失败,而是让脚本不会失败。

    【讨论】:

      【解决方案4】:

      试试这个,看看它是否适合你:

      <script type="text/javascript" onerror="throw('An error occurred')" src="http://connect.facebook.net/en_US/all.js"></script>
      

      或者,如果您可以访问代理脚本来抓取外部内容,我会通过 xmlHttpRequest 使用它来抓取 JS 内容。如果成功,eval 内容(是的,eval 是邪恶的,我知道)。

      我要补充一点,如果你知道 JS 会失败,那何必呢?

      【讨论】:

        【解决方案5】:

        你为什么不以非常简单的方式做到这一点?:

        if(!window.FB) { // or (typeof window.FB === "undefined")
            alert ("ERROR: http://connect.facebook.net/en_US/all.js is not loaded");
        }
        if(!window.jQuery) { // or (typeof window.jQuery === "undefined")
            alert ("ERROR: jQuery is not loaded");
        }
        // and so on
        

        【讨论】:

        • 不过,他也想抑制错误。这可能是更大的问题。
        • @Reinis I. : alert 只是一个例子。如果检测到typeof window.FB === "undefined" 可能在浏览器正文中有警告,那么可以用另一个想要的 HTML 代码覆盖正文。但我不知道防火墙是如何工作的。如果它重定向到另一个页面并且我们的脚本页面将不会显示,那么我们无法解决任何 JavaScript 的问题。如果可以尝试使用jQuery.ajax 加载脚本并测试结果是否以&lt;html&gt; 开头,那么我们加载了错误页面而不是JS。可以使用jQuery.getScript 加载和启动 JS。
        • 我没有特别提到alert(),由于同源策略,您无法通过 Ajax 从 Facebook 加载脚本。
        • @Reinis I. 但是可以使用 Ajax 测试 http://connect.facebook.net/en_US/all.js 的加载结果(如果需要,可以使用数据类型“文本”)并确定文件是否被阻止。
        • 不,不能。如果您可以通过 Ajax 加载和解析任何网页,那将是一个严重的浏览器安全漏洞。没有什么可以阻止任何人监视用户。
        【解决方案6】:

        请尝试下面的函数,如果脚本已经加载,它只会调用 onload_function。您可以设置超时来取消脚本。

        function include_js(url, onload_function) { 
            var script = document.createElement("script");
            script.type = "text/javascript";
        
            if (script.readyState) { 
                script.onreadystatechange = function(){
                    if (script.readyState == "loaded" || script.readyState == "complete"){
                        script.onreadystatechange = null;
                        onload_function();
                    }
                };
            } else {  
                script.onload = function(){
                    onload_function();
                };
            }
            script.src = url;
            document.getElementsByTagName("head")[0].appendChild(script);
        }
        

        【讨论】:

        • 这将尝试将 HTML 页面作为脚本加载。您需要添加一些逻辑来检测您是否收到了 Javascript 或 HTML(例如通过解析 getResponseHeader("Content-Type")
        • AFAIK,您只能从 XHR 获取响应标头(不能从加载脚本标签)。 XHR 不支持跨域请求,因此不能像原始问题中那样用于从 facebook 抓取脚本。
        【解决方案7】:

        在 Firefox 和 IE 中,您应该能够为此使用 window.onerror。您可以利用脚本按照它们在 HTML 中列出的顺序运行这一事实,仅在 facebook 脚本周围包装一个错误处理程序:

        <script>
        // Remember old error handler, if there is one.
        var oldOnError = window.onerror;
        // Special error handler for facebook script
        window.onerror = function(message, url, linenumber) {
          // Potentially alert the user to problem
          alert('Problem with facebook: ...');
          // Return true to suppress default error handling
          return true;
        }
        </script>
        
        <!-- Load facebook script -->
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        
        <script>
        // Remove error handler for facebook script
        window.onerror = oldOnError;
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2012-10-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多