2012-02-02 37 views
4

这可能是一个愚蠢的问题,但我会抓住我的机会。如何在包含它之前测试一个脚本是否有效

我的网站上,我有以下脚本文件:

<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块中加载脚本并优雅地处理错误。任何想法将不胜感激!

UPDATE:

下面是从防火墙的错误页面的HTTP标头。也许我可以看看“内容类型”标题,如果内容有效,我认为它会是文本/ 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 
+0

您可以使用AJAX“GET”请求获取脚本并确保它不以HTML标记开头? – Pointy 2012-02-02 16:38:52

+0

或者您可以检查某些响应标头是否被某些防火墙设置覆盖 – fcalderan 2012-02-02 16:41:29

+0

当此资源被阻止时,响应长度是否始终为4774字节?回应的内容是什么? – fcalderan 2012-02-02 16:51:34

回答

1

不幸的是,你没有办法测试connect.facebook.net没有被阻止,因为它来自不同的Origin比你的文件。

这意味着你不能使用XHR发出HEAD请求,并确保内容类型是真的text/javascript – XHR不会让在默认情况下,和connect.facebook一个跨域请求。网络不支持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)。如果它确实以错误状态正确响应,则browswer不会将响应主体解析为脚本(从而导致错误)。

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脚本文件是否已加载。如果它尚未加载,则不要运行任何关联的脚本。

+0

我认为,无论如何,第一个脚本包含会产生错误(如果我很好理解) – fcalderan 2012-02-02 16:42:57

+0

同意 - 这是从其他地方回退并加载脚本的好方法,但它仍然会弹出语法错误。 – 2012-02-02 16:47:52

+0

我想如果没有在脚本标记的src中指定协议,会导致导航器中默认协议不是http的问题。 – Jack 2012-02-02 16:56:17

1

看你的编辑,你可以通过AJAX检查响应的内容类型时,它的text/html没有附加脚本:使用<xhr>.getResponseHeader("Content-Type");

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

+0

我会运行这个,看看我能不能工作。我使用的是YUI2框架,它有各种各样的工具。 – 2012-02-02 16:57:52

+0

getResponseHeader()是xmlHttpRequest对象的JavaScript方法。因此,拥有* xhr *对象,无论您的库是什么,都可以在任何地方使用它 – fcalderan 2012-02-02 17:00:45

+0

这不起作用。 XHR不允许跨源请求。 – josh3736 2012-02-02 17:10:09

相关问题