我读过,这defer
不一定会延迟外部脚本的加载,但会延迟脚本的执行,直到HTML解析完毕。
作为实验,我在包含jQuery的文件的底部添加一行,当执行到达JavaScript的末尾时,该行会发出一个事件:
window.dispatchEvent(new Event('jQuery-executed'));
我在测试页中包含具有defer
属性的jQuery文件:
<script src="jquery-3.2.1.js" defer onload="console.log('jQuery loaded', Date.now());"></script>
<script>
window.addEventListener('DOMContentLoaded', function(){
console.log('DOMREADY', Date.now());
});
window.addEventListener('jQuery-executed', function(){
console.log('jQuery executed', Date.now());
});
</script>
我onload
在script标记上有一个处理程序,可以告诉我何时加载文件,以及其他函数在DOMContentLoaded上输出控制台日志以及何时执行jQuery。
为什么当我查看此页面时得到此信息?
当然事情应该以不同的顺序发生吗?不应只在包含jQuery的文件加载后才执行jQuery吗?为什么在DOMContentLoaded之前执行它?
HTML5规范很奇怪而且很难阅读,但是它确实说应该在触发“加载”事件之前评估延迟的脚本内容。如果您考虑一下,那确实是一件好事:如果您有一些等待脚本加载的代码,那可能是因为您想使用脚本提供的一些代码。如果在脚本运行之前触发了“ load”事件,那么拥有“ load”处理程序将毫无用处。
“ DOMContentReady”也是如此:等待该事件正确触发的代码期望该页面导入的所有脚本内容已准备好被利用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句