JSDOM не загружает JavaScript, включенный в тег <script> - PullRequest
0 голосов
/ 30 октября 2018

Примечание: Этот вопрос не является дубликатом других существующих вопросов, поскольку в этом вопросе не используется вызов функции jsdom.env(), который делают другие вопросы.

Файл bar.js:

console.log('bar says: hello')

Файл foo.js:

var jsdom = require('jsdom')
var html = '<!DOCTYPE html><head><script src="bar.js"></script></head><body><div>Foo</div></body>'
var window = new jsdom.JSDOM(html).window
window.onload = function () {
  console.log('window loaded')
}

Когда я запускаю foo.js, я получаю этот вывод.

$ node foo.js
window loaded

Почему bar says: hello вывод не пришел? Похоже, bar.js не был загружен. Как я могу заставить jsdom загрузить файл в тег script?

Проблема решена после предложения в ответе Квентина. Этот код работает:

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

1 Ответ

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

Перейти на домашнюю страницу JSDOM .

Просматривайте заголовки, пока не найдете один отмеченный Выполнение сценариев

Чтобы включить выполнение скриптов на странице, вы можете использовать runScripts: "dangerously" опция:

const dom = new JSDOM(`<body>
  <script>document.body.appendChild(document.createElement("hr"));</script>
</body>`, { runScripts: "dangerously" });

// The script will be executed and modify the DOM:
dom.window.document.body.children.length === 2;

Опять же, мы подчеркиваем, чтобы использовать это только при подаче кода JSDOM вы знаете безопасно. Если вы используете его для произвольного предоставленного пользователем кода или кода из Интернет, вы эффективно запускаете ненадежный код Node.js, и ваша машина может быть взломана.

Если вы хотите выполнить внешние скрипты, включенные через <script src="">, вам также необходимо убедиться, что они их загружают. Сделать это, добавьте параметр resources: "usable" как , описанный ниже .

...