2015-10-20 191 views
0

不取脚本这是我如何构建它:当我用HTTP替换HTML jQuery的路径jsdom本地文件系统

<!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> 

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它的工作原理。本地路径完全相对于shell /实际节点脚本的工作目录。说实话,我甚至不知道为什么我需要jQueryify,但没有它的窗口从来没有jQuery,即使有它,它仍然需要HTML文档内的http源。

回答

3

你不告诉jsdom你的网站的基础在哪里。它不知道如何解决你给它的(相对)路径(并且试图从默认的about:blank来解决,这只是不起作用)。这也是它使用绝对(http)URL的原因,它不需要知道从哪里解决,因为它是绝对的。

您需要在初始化时提供url选项,以便为其指定基础网址(它应该看起来像file:///path/to/your/file)。

jQuerify只是插入一个脚本标签与你给它的路径 - 当你在html工作中获得引用时,你不需要它。

+0

谢谢,但不幸的是我测试过,不是这样。即使我使用绝对http路径,我也无法让jquery在没有jQueryify的情况下工作。我也意识到创建的回调是错误的,我必须在jsdom调用之后使用doc.defaultView.b。 但脚本似乎总是崩溃。即使我不调用$,没有jQueryify的任何外部脚本(!)使得b未定义(通过virtualConsole没有错误)。 – brannigan

+0

实际上,如果您提供了juqery包的完整路径,该程序将起作用。我认为这是路径查找器中的问题。 –

0

我找到了。我将Sebmasters的答案标记为接受,因为它解决了两个问题之一。另一个原因是我没有正确地等待加载事件,因此超出外部脚本的代码还没有被解析。

我需要做的是在jsdom()调用后向doc.defaultView添加一个负载监听器。

使用jQuerify时,它的工作原因很简单,因为它为嵌入式脚本加载创建了足够的超时时间。

+1

哦,我忽略了这一点:如果你使用它,你应该使用done选项而不是创建。完成后会捕捉更多生命周期中的错误,并在onload之后执行。 – Sebmaster

+0

@Sebmaster:哦,它就在那里,在文档中。对我感到羞耻,再次感谢。 – brannigan

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()) 
}) 
相关问题