Javascript内联脚本和延迟脚本的执行顺序
我有一个关于混合脚本类型的执行顺序的问题 这是我的密码:Javascript内联脚本和延迟脚本的执行顺序,javascript,Javascript,我有一个关于混合脚本类型的执行顺序的问题 这是我的密码: <script> if(document.documentMode) { const firstScriptInDOM = document.getElementsByTagName('script')[0]; const polyfill = document.createElement('script'); polyfill.
<script>
if(document.documentMode) {
const firstScriptInDOM = document.getElementsByTagName('script')[0];
const polyfill = document.createElement('script');
polyfill.src = "/static/js/polyfills/polyfills.js";
firstScriptInDOM.parentNode.insertBefore(polyfill, firstScriptInDOM);
}
</script>
<script src="static/js/lib1.js" defer></script>
<script src="static/js/lib2.js" defer></script>
<script src="static/js/lib3.js" defer></script>
<script src="static/js/myOwnScriptFile.js" defer></script>
if(document.documentMode){
const firstScriptInDOM=document.getElementsByTagName('script')[0];
const polyfill=document.createElement('script');
polyfill.src=“/static/js/polyfills/polyfills.js”;
firstScriptInDOM.parentNode.insertBefore(polyfill,firstScriptInDOM);
}
如果浏览器是IE,则第一个脚本标记的目的是为IE加载多边形填充。
然后它应该加载其他脚本并执行我的代码
我的问题是:polyfills脚本会阻止延迟脚本的执行吗?
非常感谢您抽出时间 未延迟的脚本将在解析时运行。 其他脚本将在文档按照它们在文档中出现的顺序解析后执行,然后再触发DOMContentLoaded 更新 凯伊多是正确的,我的结论是错误的。 脚本中添加多边形填充的部分将首先运行,但它加载的脚本将在下载后立即异步运行。 你可以看到更多的细节
您可以尝试使用。脚本同步加载,除非指定使用
async
属性异步加载,否则defer
属性的作用是仅在加载DOM后加载脚本。如果动态附加脚本,它将异步加载
在您的场景中
这应该是执行链:
- 检查polyfill脚本是否执行
- lib1
- lib2
- 溴化锂
- myOwnScriptFile
- polyfills(仅在解析器完成执行后下载)
IF IE
load polyfills, and load other scripts in the onload event of the polyfills script.
ELSE
load all other scripts
问题:您的第一个脚本:if(document.documentMode){const firstScriptInDOM=document.getElementsByTagName('script')[0];const polyfill=document.createElement('script');polyfill.src=“/static/js/polyfills/polyfills.js”;firstScriptInDOM.parentNode.insertBefore(polyfill,firstScriptInDOM);}是myOwnScriptFile.js脚本的源代码吗?不,不是。如果需要,我的第一个脚本只加载IE的polyfill。myOwnScriptFile.js是我的主脚本,包含所有浏览器的代码(包括需要时已填充的IE)。有趣…这可能是随机的吗?通过DOM manips插入的脚本是异步加载的。因此,如果加载它比解析DOM花费的时间少,它们以前会触发吗?…无论如何,不要依赖于此,它们不会被执行的可能性更大。解决方案是:为每个人加载polyfill,或者从中加载所有脚本DOM manips(如果需要,您可以等待polyfills.onload)有趣的Kaido。我将进行一些测试。我不想为不需要它的浏览器加载额外的文件:(谢谢你的回答。你对@kaido上面的评论有什么看法?谢谢!我会看一下文档。写信看看我是否能让它工作。哦,那对我想做的事情不太好。那么有没有一个解决方案可以避免现代浏览器加载polyfills.js呢?@Mourtazag在回答中添加了一个基本的想法。:)非常感谢!我会深入研究。:)