脚本加载在JSDOM中的窗口加载之后发生

时间:2018-10-31 13:36:39

标签: javascript node.js callback onload jsdom

这是我从Is order of script onload and window.onload well defined when the script is a DOM node created dynamically from a loaded script?

中学到的新问题。

在上一个问题中,我们了解到,当窗口正在加载脚本时,任何脚本(直接加载的脚本以及脚本动态加载的脚本)都将首先且仅在window.onload之后才完成加载。会开火。

但是JSDOM的行为似乎有所不同。

这是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()

这是通过JSDOM伪装成假窗口的驱动程序代码。

var jsdom = require('jsdom')
var loader = require('./loader.js')

var html = `<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>
    <script src="loader.js"></script>
  </head>
  <body>
    <div>Test</div>
  </body>
</html>`

global.window = new jsdom.JSDOM(html, { runScripts: "dangerously", resources: "usable" }).window

这是输出:

$ node fakewindow.js 
window not available yet
window loaded
script loaded

window.onload事件触发之前触发script.onload事件。即使尚未直接加载HTML中直接包含的脚本加载的动态脚本,JSDOM为什么也考虑加载窗口?这是JSDOM中的错误,还是相关的W3C标准允许这种行为?

1 个答案:

答案 0 :(得分:1)

好像是JSDOM中的错误。

似乎在最新版本13.0.0中已解决,请尝试更新JSDOM。

我已经为jsdom 13尝试了相同的代码,并且可以使用。

window not available yet
script loaded
window loaded

jsdom 11确实显示了问题:

window not available yet
window loaded
script loaded