如何在包含脚本之前测试脚本是否有效

时间:2012-02-02 16:37:18

标签: javascript html

这可能是一个愚蠢的问题,但我会抓住机会。

在我的网站上,我包含以下脚本文件:

<script src="http://connect.facebook.net/en_US/all.js"></script>

通常,这样可以正常工作。但是,在我工作的地方,我们有一个防火墙可以阻止任何到facebook.com或facebook.net域名的流量,因为很明显没有员工有足够的自我控制来阻止他们整天玩Farmville而不是工作。

因此,当脚本加载时,实际上会收到一堆HTML,说该网站被阻止了。由于这是HTML而且无效的Javascript,浏览器会弹出脚本错误。注意,我仍然得到一个HTTP 200,所以我无法捕捉错误。

我愿意接受这是一个边缘案例,因为只有一小部分用户会试图从阻止Facebook流量的防火墙后面访问我的网站,但我仍然发现自己想知道是否有相对的东西我可以轻松地测试以确保链接返回有效的Javascript,或者可能包含在巨大的try / catch块中加载脚本并优雅地处理错误。任何想法将不胜感激!

更新

这是防火墙错误页面中的HTTP标头。也许我可以看一下“内容类型”标题,如果内容有效,我认为它是text / javascript。

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Content-Length: 4774

3 个答案:

答案 0 :(得分:1)

这是后备的完成方式:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>  
<script>window.jQuery || document.write("<script src='js/libs/jquery-1.6.4.min.js'>\x3C/script>")</script>

在这种情况下,它会尝试从googleapis.com加载jquery。如果它被阻止或不可用,则加载本地jQuery。

您可以使用相同的技术。制作第二个脚本以检测facebook脚本文件是否已加载。如果它尚未加载,则不要运行任何相关的脚本。

答案 1 :(得分:1)

查看您的编辑内容,您可以通过ajax查看回复的内容类型,以及何时text/html不附加脚本:使用<xhr>.getResponseHeader("Content-Type");

编辑:正如josh3736指出的那样,不允许通过javascript进行跨站点请求,因此您还需要调用作为代理的内部资源(用服务器端语言编写)并尝试获取脚本,返回其内容类型(例如,查看此讨论:php, curl, headers and content-type

答案 2 :(得分:1)

不幸的是,您无法测试connect.facebook.net是否被阻止,因为它是从与您的文档不同的Origin提供的。

这意味着您无法使用XHR发出HEAD请求并确保内容类型确实为text/javascript - XHR默认情况下不会发出跨源请求,并且连接。 facebook.net不支持CORS

OPTIONS http://connect.facebook.net/en_US/all.js HTTP/1.1
Host: connect.facebook.net
Access-Control-Request-Method: GET
Access-Control-Request-Headers: Origin, X-Requested-With, Accept

HTTP/1.1 501 Not Implemented
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 272
Connection: close

从技术上讲,有问题的过滤/防火墙软件不正确,当它阻止某个网站时,它会提供成功状态代码(200),因为它应该提供错误代码(4xx5xx)。如果它确实正确地响应了错误条件,则浏览器不会将响应主体解析为脚本(从而导致错误)。