自动加载无效的javascript文件

自动加载无效的javascript文件,javascript,html,Javascript,Html,我创建了一个脚本,根据用户的位置自动加载javascript文件。与其他加载程序一样,我创建了一个元素,设置它的src属性,并将其添加到。然后,我侦听onload和onreadystatechanged等事件,然后检查是否存在文件公开的值。这很有效 问题是,当提供了无效的跨源url“”时,我的ISP返回HTML(指示浏览器使用其他地址重新加载)。我可以在onload事件中捕捉到这一点,但为时已晚。HTML已经被注入页面的标记中。这会导致浏览器(至少是firefox)发出SyntaxError异常

我创建了一个脚本,根据用户的位置自动加载javascript文件。与其他加载程序一样,我创建了一个
元素,设置它的
src
属性,并将其添加到
。然后,我侦听
onload
onreadystatechanged
等事件,然后检查是否存在文件公开的值。这很有效

问题是,当提供了无效的跨源url“”时,我的ISP返回HTML(指示浏览器使用其他地址重新加载)。我可以在
onload
事件中捕捉到这一点,但为时已晚。HTML已经被注入页面的
标记中。这会导致浏览器(至少是firefox)发出
SyntaxError
异常

我所能做的就是从DOM中删除有问题的元素。但是,我不知道这是否会在其他浏览器中引起问题,所以我更希望根本没有错误

检查有效的javascript文件然后将其注入页面的最佳方法是什么

更新:


由于浏览器中的“交叉源”保护,发出HEAD或GET请求以检查文件是否存在/是否有效无法工作。我没有访问CDN的权限,因此这是一个无法解决的问题。

您可以发送
头请求并解析响应头,以查看页面是否成功返回,即不返回,或返回响应代码。任何适当实现的服务器都应该设置正确的响应代码

理想情况下,如果服务器设置正确,您还应该检查
内容类型
,以包括
应用程序/javascript

如果匹配,您就知道脚本存在,因此您可以像现在一样继续加载它


或者,您已经通过
get
request获得了这些头,所以您可以通过单个请求完成所有这些。但是如果请求不正确,您将等待所有有效负载,然后再确定它是否不正确,这将占用更多时间并浪费数据传输。后者是一个值得考虑的问题,如果你期待移动用户,你不会希望像那样浪费数据计划

正如Sumit所建议的,您可以通过Ajax请求加载脚本,然后以某种方式检查它(例如,因为您知道它包含特定的字符串)

成功后,只需像您所做的那样继续—使用“src”属性集向head或body元素添加一个
标记。如果对URL启用了缓存,浏览器将不会对该URL执行另一个HTTP请求

直接使用Ajax加载的JS代码(通过设置scriptElem.text而不是“src”属性)是另一种选择,但没有那么好,因为它受CORS限制。参见jQuery的DOMEval函数(第77行)


由于您希望从Google服务器加载代码,“src”-属性版本更好。

您是否尝试了
$.get()
内部try catch?@SumitSahay
$。get()
是jQuery,问题用
javascript
标记。此外,我不确定是否可以从AJAX请求中添加javascript。最好的办法是加载有效的JS文件。否则,你可以先用AJAX检查它是否存在。@MikeC,这是“谷歌地图api”,如果你问我的话,这是非常有效的。问题是在谷歌被封锁的国家从.com加载时。ISP正在发回无效数据。我将尝试发送一个HEAD请求,看看它会返回什么。@Twifty我没有说它无效,我说最好只加载已知存在的脚本。有鉴于此,请使用AJAX测试它的存在性。我刚刚尝试发送HEAD,但现在firefox抱怨“跨源请求被阻止”。当我用谷歌搜索时,有没有发现这个问题?响应中需要“Access Control Allow Origin”标题(原因:内容类型不是“简单”类型之一)。请参见此处:查看开发人员控制台“网络”选项卡中的响应,并检查设置了哪些响应头。你能从自己的服务器上提供google JavaScript文件吗?(不确定这是否是谷歌允许的,是否有效)如果你在谷歌CORS上搜索,你会发现更多的信息。基本上,服务器返回的响应是不允许从您的域获取的。这是一种常见的配置,它可以防止网站从其他可能是恶意的来源(即服务器)加载内容。如果您有权访问服务器,您可以更改它响应的标题。否则,唯一的解决方案是通过代理服务器获取数据,但如果设置不正确,很容易被滥用。在谷歌搜索之后,有一项服务可以做到这一点:基本上,如果不遇到这个CORS问题,我将无法进行AJAX调用。试图绕过它超出了我的范围,因为我已经有了一个后备机制。真正的问题是浏览器将HTML注入到标记中。这是一个安全问题,因为ISP可以响应任何内容。这就是我建议验证
内容类型的原因。HTML响应将不是内容类型
application/javascript