Это новый вопрос, вытекающий из того, что я узнал: Правильно ли определен порядок загрузки сценариев и window.onload, когда сценарий является узлом DOM, созданным динамически из загруженного сценария?
В предыдущем вопросе мы узнали, что когда окно загружает сценарии, любые сценарии (как непосредственно загруженные, так и динамически загружаемые сценарием) сначала заканчивают загрузку, и только после этого запускается 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
. Почему JSDOM считает окно загруженным, даже если динамический скрипт, загруженный скриптом, непосредственно включенным в HTML, еще не загружен? Это ошибка в JSDOM или это поведение разрешено соответствующими стандартами W3C?