是否有可能在添加到HTML文档的头部后停止加载脚本标记?
我想有这样的事情:
var script_tag = document.createElement('script');
script_tag.setAttribute('type', 'text/javascript');
script_tag.setAttribute('src', 'http://fail.org/nonexistant.js');
document.getElementsByTagName('head')[0].appendChild(script_tag);
// something like this!!!
script_tag.abort();
答案 0 :(得分:3)
以任何跨浏览器的方式都无法实现。只要将脚本标记添加到头部,它就会被下载并解析,甚至删除节点也不会阻止它。
话虽如此,Firefox有document.onbeforescriptexecute
,可以取消(默认操作是执行目标脚本)。此事件最初是在标准轨道上,但由于缺乏有效的用例,最近已从HTML规范中删除。
答案 1 :(得分:3)
不,你不能这样做。但是你可以通过XMLHTTPRequest(AJAX)加载它。这样,如果花费太长时间,您可以中止连接
例如,如果使用jQuery,则可以使用timeout
选项:
$.ajax({ url: "a.js", dataType: "script", timeout: 1000});
这样,如果脚本在1秒(1000毫秒)内没有加载请求将被中止。此外,您可以使用{async:false}
来防止在加载脚本时执行代码(如果需要)。
检查http://api.jquery.com/jQuery.ajax/以获取更多选项。
答案 2 :(得分:0)
Microsoft Edge和Internet Explorer允许您取消加载脚本:
从页面中删除脚本,例如<script id=blah src=...></script>
和blah.parentNode.removeChild(blah);
然后进行垃圾收集window.CollectGarbage && CollectGarbage();
(并不总是必要的,因为大页面无论如何都会导致GC发生)
不要尝试使用调试程序进行测试(它会干扰,例如GC)
你需要一个<script async
(或defer?)属性,否则以后的脚本不会在页面上执行(注意你的脚本必须正确处理无序脚本加载,因为async
财产)。
IE / Edge仅表现为加载了脚本,但它们实际上并未关闭连接(如果脚本最终加载,则不确定它的作用)。
这种技术可以阻止throbber,使页面加载事件触发(非常对jQuery很重要),并调整事件大小(否则他们不会在页面为&#34;装载&#34;。)
该技术不适用于Chrome或Firefox
XMLHttpRequest(必要时为CORS)可能是一个更好的实现,因为你可以控制超时并中止()
我只测试了Internet Explorer 11和Edge 13