我尝试搜索类似的问题,但是当我们在不使用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
均未执行。我该如何解决?
答案 0 :(得分:0)
为了使浏览器加载script
元素,它必须是文档的一部分。 JSDOM和Chrome,Firefox等浏览器都是如此。
您创建了一个script
元素,但是我看不到您将其添加到window.document
的任何位置。 (创建与将其添加到文档中是不同的。)诸如window.document.body.appendChild(script)
这样简单的操作就可以完成。
JSDOM将无法找到您的脚本,除非您告诉它它在哪里。由于您要它解析字符串,因此JSDOM使用的基本URL并不是您所需要的。您可以通过指定一个url
来解决此问题,该问题告诉JSDOM使用什么路径来解析相对路径。例如:
var window = new jsdom.JSDOM(html, { url: "file://.", runScripts: "dangerously", resources: "usable" }).window
这将添加url: "file://."
。如果bar.js
文件与调用JSDOM的脚本位于同一位置,则它将起作用。
答案 1 :(得分:0)
这可能有效:jsdom版本:16.4.0,nodejs版本:12.6.0
const jsdom = require("jsdom");
var html = '<!DOCTYPE html><html><head><title>Foo</title></head><body><script></script><div></div></body></html>'
var window = new jsdom.JSDOM(html, { url: "file://.", runScripts: "dangerously", resources: "usable" }).window
var script = window.document.createElement('script')
script.src = 'bar.js'
window.document.body.appendChild(script); // <== need to append the script child
script.onload = function () { console.log('script loaded') }
window.onload = function () { console.log('window loaded') }