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

Javascript 如何在包含脚本之前测试脚本是否有效,javascript,html,Javascript,Html,这可能是个愚蠢的问题,但我会冒险的 在我的站点上,我包含以下脚本文件: <script src="http://connect.facebook.net/en_US/all.js"></script> 这就是回退的方式: <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script> <script>window.jQuery || do

这可能是个愚蠢的问题,但我会冒险的

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

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

这就是回退的方式:

<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>

window.jQuery | | document.write(“\x3C/script>”)
在本例中,它尝试从googleapis.com加载jquery。如果被阻止或不可用,它将加载本地jQuery


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

查看编辑,您可以通过ajax检查响应的内容类型,当响应为
text/html
时,不要附加脚本:使用
.getResponseHeader(“内容类型”)


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

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

这意味着您不能使用XHR发出
HEAD
请求并确保内容类型确实是
text/javascript
–默认情况下XHR不会发出跨源请求,并且connect.facebook.net不支持:

选项http://connect.facebook.net/en_US/all.js HTTP/1.1
主持人:connect.facebook.net
访问控制请求方法:GET
访问控制请求头:来源、X请求、接受
HTTP/1.1 501未实现
服务器:AkamaiGHost
Mime版本:1.0
内容类型:text/html
内容长度:272
连接:关闭

从技术上讲,所讨论的过滤/防火墙软件是不正确的,因为当它阻止一个站点时,它提供了一个成功状态代码(
200
),而它应该提供一个错误代码(
4xx
5xx
)。如果它正确地响应了错误条件,浏览器将不会将响应正文作为脚本进行解析(从而导致错误)。

您能用AJAX“GET”获取脚本吗请求并确保它不是以HTML标记开始的?或者,您可以检查一些响应头是否被某些防火墙设置覆盖。当此资源被阻止时,响应长度始终为4774字节?回答的内容是什么?@FabrizioCalderan-是的,你可能了解了一些东西,因为如果回答是HTML,内容类型会有所不同。我认为一种方法是使用AJAX对文件进行测试加载,查看内容类型,然后将脚本标记插入DOM(理想情况下,这将只下载一次文件,因为它将被缓存)。。或者我可以先发出HTTP HEAD命令。@FabrizioCalderan-响应的内容是公司特定的“此站点被阻止”错误消息。对于我们来说,它总是4774字节,但当然会有所不同,这取决于您的防火墙如何处理这些违规行为。我认为第一个包含的脚本无论如何都会产生错误(如果我理解的很清楚的话),同意-这是一个从其他地方回退并加载脚本的好方法,但是它仍然会弹出语法错误。我认为如果没有在script标记的src中指定协议,可能会导致导航器出现问题,默认协议不是http。@Jack:否,无模式或协议相关URL。唯一需要注意的是从无模式URL加载样式表时出现了一些IE怪癖。您可以使用
而不是
\x3C/script>
。看,我会用这个,看看我能不能找到工作。我使用的是YUI2框架,它有各种用于这类事情的实用程序。getResponseHeader()是xmlHttpRequest对象的javascript方法。因此,拥有xhr对象后,无论您的库是什么,您都可以在任何地方使用它。这将不起作用。XHR不允许跨源请求。@对,他需要一个用服务器端语言(例如使用CURL)编写的代理来返回内容type@FabrizioCalderan:除了他的服务器在有问题的防火墙之外,所以它总是说“ok!”这是一个客户端问题。
<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>