Как выполнить другой узел сценария, динамически созданный в JSDOM? - PullRequest
0 голосов
/ 30 октября 2018

Я пробовал искать похожие вопросы, но ни один из существующих вопросов не решает эту конкретную проблему, когда мы используем jsdom.JSDOM() без jsdom.env() и когда мы динамически создаем новый узел script в объекте JSDOM.

Вот код в bar.js.

console.log('bar says: hello')

Вот код в foo.js.

var jsdom = require('jsdom')
var html = '<!DOCTYPE html><html><head><title>Foo</title></head><body><div></div></body></html>'
var window = new jsdom.JSDOM(html, { runScripts: "dangerously", resources: "usable" }).window
var script = window.document.createElement('script')
script.src = 'bar.js'
script.onload = function () { console.log('script loaded') }
window.onload = function () { console.log('window loaded') }

Когда я запускаю это, я получаю только этот вывод:

$ node foo.js
window loaded

Ни bar.js, ни script.onload не выполняется. Как я могу это исправить?

1 Ответ

0 голосов
/ 30 октября 2018

Чтобы браузер мог загрузить ваш элемент script, он должен быть частью документа. Это относится и к JSDOM, и к таким браузерам, как Chrome, Firefox и т. Д.

Вы создаете элемент script, но я не вижу, чтобы вы добавляли его в window.document. ( Создание это не то же самое, что добавление к документу.) Это может сделать что-то столь же простое, как window.document.body.appendChild(script).

JSDOM не сможет найти ваш скрипт, если вы не скажете ему, где он находится. Поскольку вы просите его проанализировать строку, базовый URL, который использует JSDOM, не тот, который вам нужен. Вы можете исправить это, указав url, который сообщает JSDOM, какой путь использовать для разрешения относительных путей. Например:

var window = new jsdom.JSDOM(html, { url: "file://.", runScripts: "dangerously", resources: "usable" }).window

Это добавляет url: "file://.". Если файл bar.js находится в том же месте, что и ваш скрипт, который вызывает JSDOM, он будет работать.

...