Загрузка сценария происходит после загрузки окна в JSDOM - PullRequest
0 голосов
/ 31 октября 2018

Это новый вопрос, вытекающий из того, что я узнал: Правильно ли определен порядок загрузки сценариев и 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?

1 Ответ

0 голосов
/ 07 ноября 2018

Похоже, ошибка в 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
...