当脚本是从加载的脚本动态创建的DOM节点时,脚本onload和window.onload的顺序是否很好定义?

Lon*_*ner 6 html javascript callback

档案loader.js:

function main()
{
  if (typeof window !== 'undefined') {
    var script = window.document.createElement('script')
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.min.js'
    script.onload = function () { console.log('script loaded') }
    window.onload = function () { console.log('window loaded') }
    window.document.head.appendChild(script)
  } else {
    console.log('window not available yet')
  }
}

if (typeof module !== 'undefined' && module.exports) {
  exports.main = main
}

main()
Run Code Online (Sandbox Code Playgroud)

档案window.html:

<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>
    <script src="loader.js"></script>
  </head>
  <body>
    <div>Test</div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

打开此HTML页面时的控制台输出:

script loaded
window loaded
Run Code Online (Sandbox Code Playgroud)

我的问题:

在上面的代码中,是否保证脚本onload事件总是在窗口onload之前触发?

Cer*_*nce 9

是的,您看到的输出是有保证的,因为load事件是在"资源及其相关资源已完成加载时" 触发的.该window直到不会满载每一个东西来下载元素已下载完毕,包括脚本和图像.所以,<script>必须在负载之前window加载.

事实上,动态创建的脚本不会产生影响(假设main在窗口完全加载之前调用,就像在代码中一样) - 一旦插入到DOM中,它现在就是窗口所依赖的东西,所以必须load在窗前.