2015-10-20 233 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()) 
}) 
相關問題