这就是我构建它的方式:
var fs = require("fs");
var jsdom = require("jsdom");
var htmlSource = fs.readFileSync("./test.html", "utf8");
var doc = jsdom.jsdom(htmlSource, {
features: {
FetchExternalResources : ['script'],
ProcessExternalResources : ['script'],
MutationEvents : '2.0'
},
parsingMode: "auto",
created: function (error, window) {
console.log(window.b); // always undefined
}
});
jsdom.jQueryify(doc.defaultView, 'https://code.jquery.com/jquery-2.1.3.min.js', function() {
console.log( doc.defaultView.b ); // undefined with local jquery in html
});
html:
<!DOCTYPE HTML>
<html>
<head></head>
<body>
<script src="./js/lib/vendor/jquery.js"></script>
<!-- <script src="http://code.jquery.com/jquery.js"></script> -->
<script type="text/javascript">
var a = $("body"); // script crashes here
var b = "b";
</script>
</body>
</html>
只要我用html源替换html中的jquery路径就行了。本地路径完全相对于shell /实际节点脚本的工作目录。说实话,我甚至不知道为什么我需要jQueryify,但没有它,窗口永远不会有jQuery,即使有了它,它仍然需要html文档中的http源。
答案 0 :(得分:4)
你没有告诉jsdom你网站的基础在哪里。它不知道如何解决你给它的(相对)路径(并试图从默认的about:blank
解决,这是行不通的)。这也是它使用绝对(http)URL的原因,它不需要知道从哪里解决,因为它是绝对的。
您需要在初始化时提供url
选项,以便为其提供基本网址(应该看起来像file:///path/to/your/file
)。
jQuerify只是插入一个脚本标签和你给它的路径 - 当你在html工作中获得引用时,你不需要它。
答案 1 :(得分:0)
我发现了。我将Sebmasters的答案标记为已被接受,因为它解决了两个问题之一。另一个原因是我没有正确等待加载事件,因此外部脚本之外的代码尚未解析。
我需要做的是在jsdom()调用之后向doc.defaultView添加一个加载侦听器。
使用jQuerify时它起作用的原因仅仅是因为它为嵌入式脚本加载了足够的超时时间。
答案 2 :(得分:0)
当jquery库与jQueryify
函数的完全相对路径时,我遇到了同样的问题。我通过提供完整路径来解决这个问题。
const jsdom = require('node-jsdom')
const jqueryPath = __dirname + '/node_modules/jquery/dist/jquery.js'
window = jsdom.jsdom().parentWindow
jsdom.jQueryify(window, jqueryPath, function() {
window.$('body').append('<div class="testing">Hello World, It works')
console.log(window.$('.testing').text())
})