自动加载无效的javascript文件

时间:2016-09-01 22:04:36

标签: javascript html

我创建了一个脚本,根据用户位置自动加载javascript文件。与任何其他加载器一样,我创建了一个<script>元素,将其设置为src属性并将其添加到<head>。然后我监听onloadonreadystatechanged等事件,然后检查文件公开的值是否存在。这很有效。

问题是,当提供无效的跨源URL“http://fail_on_purpose”时,我的ISP返回HTML(指示浏览器使用不同的地址重新加载)。我可以在onload事件中发现这一点,但为时已晚。 HTML已经在<script>标记内的页面上注入。这会导致浏览器(至少是firefox)发出SyntaxError异常。

我所能做的就是从DOM中删除有问题的元素。但是,我不知道这是否会导致其他浏览器出现问题,所以我宁愿没有错误。

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

更新

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

2 个答案:

答案 0 :(得分:2)

您可以发送HEAD请求并解析响应标头,以查看该网页是否成功返回,即不是redirectionclient errorserver error响应代码。任何体面的服务器都应该设置正确的响应代码。

理想情况下,如果服务器设置正确,您还可以检查content-type是否包含application/javascript

如果匹配,则表示该脚本存在,因此您可以像现在一样继续加载它。

或者,您已经通过GET请求获得了这些标头,因此您可以通过单个请求完成所有这些操作。但是如果请求不正确,您将在确定有效负载之前等待所有有效负载,这会占用更多时间并浪费数据传输。后者是值得考虑的事情,如果你期待移动用户,你不会想要浪费这样的数据计划。

答案 1 :(得分:0)

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

成功时,只需按照您的方式继续操作 - 在设置了“src”属性的头部或主体元素上添加<script>标记。如果为URL启用了缓存,则浏览器将不会为此执行另一个HTTP请求。

直接使用加载Ajax的JS代码(通过设置scriptElem.text而不是“src”属性)是另一种选择,但不是很好,因为它受CORS限制。请参阅jQuery的DOMEval函数https://code.jquery.com/jquery-3.1.0.js(第77行)

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