脚本加载发生在 JSDOM 中的 window 加载之后
Script onload happens after window onload in JSDOM
这是一个新问题,源于我在以下内容中学到的知识:
在上一个问题中我们了解到,当window正在加载脚本时,任何脚本(直接加载的脚本以及脚本动态加载的脚本)都会先完成加载,然后才完成加载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()
这里是通过JSDOMwindow伪装的驱动代码
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
事件触发之前触发。为什么 JSDOM 认为 window 已加载,即使由直接包含在 HTML 中的脚本加载的动态脚本尚未加载?这是 JSDOM 中的错误还是相关 W3C 标准允许这种行为?
这是一个新问题,源于我在以下内容中学到的知识:
在上一个问题中我们了解到,当window正在加载脚本时,任何脚本(直接加载的脚本以及脚本动态加载的脚本)都会先完成加载,然后才完成加载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()
这里是通过JSDOMwindow伪装的驱动代码
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
事件触发之前触发。为什么 JSDOM 认为 window 已加载,即使由直接包含在 HTML 中的脚本加载的动态脚本尚未加载?这是 JSDOM 中的错误还是相关 W3C 标准允许这种行为?