2014-01-26 30 views
36

因此,在執行npm更新之前,所有的工作都很好,現在情況不像以前那樣工作得很好。錯誤:jQuery需要一個包含文檔的窗口

一點背景:在我的代碼中我使用jquery解析文本html。我不使用窗口,也不使用jsdom。它曾經工作得很好,要做到這一點:

$ = require("jquery"); 
$(html).find("<h1>").html("The title"); 

但現在我得到這樣的: jQuery的要求與文檔

如何解決這個窗口?

回答

13

jpm的npm包肯定用它來包含jsdom,這就是爲什麼它可以在Node中工作:jQuery需要有某種DOM環境才能使用。

您可以通過執行npm install [email protected]來檢查舊版本。你會看到與它一起安裝jsdom。出於某種原因,他們似乎已從最近的版本中刪除了jsdom。我不知道爲什麼。

但是,使用jsdom 7.x中運行jQuery代碼很簡單:

var jsdom = require("jsdom"); 
var window = jsdom.jsdom().defaultView; 

jsdom.jQueryify(window, "http://code.jquery.com/jquery.js", function() { 
    var $ = window.$; 
    $("body").prepend("<h1>The title</h1>"); 
    console.log($("h1").html()); 
}); 

的路徑可以改變到不同版本的jQuery或本地文件。

注意:早期版本的jsdom(包括3.x系列)需要行var window = jsdom.jsdom().parentWindow;而不是var window = jsdom.jsdom().defaultView;。 4.x使它不能再使用parentWindow

8

我解決了它。必須先刪除jsdom和jquery,然後npm install jsdom jquery。

那麼這個:

var jsdom = require("jsdom"); 
$ = require("jquery")(jsdom.jsdom().createWindow()); 

原來,這是重要的,我有最新版本。否則,它沒有工作..

+6

這並沒有與我的版本(v0.10.28)和電流jQuery和jsdom模塊工作。 – Michael

+0

@Michael你必須使用'parentWindow'屬性。 'createWindow()'不存在。 –

2

您可以嘗試使用這些版本設置下面你package.json

"jquery": "^2.1.1", 
"jsdom": "^1.0.0-pre.3" 

假設你有一個名爲page.htm文件:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Document</title> 
</head> 
<body> 
    <h1>Html page</h1> 
    <div class="left"> 
     <p>left content</p> 
    </div> 
</body> 
</html> 

然後,可以從文件中讀取,使用JSDOM創建一個DOM和窗口並將它傳遞給jquery:

var jsdom = require("jsdom").jsdom; 
var fs = require('fs'); 
fs.readFile('page.htm', {encoding: "utf8"}, function (err, markup) { 
    if (err) throw err; 
    var doc = jsdom(markup); 
    var window = doc.parentWindow; 
    var $ = require('jquery')(window) 
    var outerLeft = $(".left").clone().wrap('<div></div>').parent().html(); 
    var innerLeft = $(".left").html(); 
    console.log(outerLeft, "and ...", innerLeft); 
}); 

將輸出:在一行

<div class="left"> 
<p>left content</p> 
</div> and ... 
<p>left content</p> 
+0

謝謝!這工作得很好。 – Michael

+0

不適用於「jsdom」:「^ 11.2.0」 –

32

的node.js,jQuery的定義:

// definition 
var $ = require('jquery')(require("jsdom").jsdom().parentWindow); 

// usage 
$("body").append("<div>TEST</div>"); 
console.log($("body").html()); 
+4

這不起作用,'parentWindow'未定義。在[comment below](http://stackoverflow.com/a/33674128/242365)中使用'defaultView'修復了它。 – cdauth

+0

運行:npm安裝[email protected]來源:http://stackoverflow.com/questions/19969737/node-js-module-works-from-command-line-not-from-script – ChaosPredictor

+0

我有麻煩之後的答案,這取決於jsdom中最近重構的語法。使用jsdom-global爲我工作。 – jlb

3

我屁股此對我的Node.js(服務器)的文件,它使用jQuery來幫助呈現頂部HTML文本...

var jsdom = require("jsdom").jsdom; 
jsdom.env({ 
    html : "<html><body></body></html>", 
    done : function(errs, window) { 
     global.window = window; 
    } 
}); 

和一切都會出現玫瑰。

0

你必須提供一個窗口對象。要做到這一點,僅僅從jsdom通過parentWindow:

var jsdom = require("jsdom"); 
var $ = require("jquery")(jsdom.jsdom().parentWindow); 
-1

我目前使用這種方法:檢查jsdom's documentation

var html = fs.readFileSync("./your_html_file.html"); 

jsdom.env({ 
    //url: "http://url_here", //in case you want to load specific url 
    //html property is used in case of you need to load html string here 
    html: html, 
    scripts: ["http://code.jquery.com/jquery.js"], 
    done: function (err, window) { 
    var $ = window.$; 
    //start using jquery now 
    $("p").each(function(index) { 
     console.log("paragraph ", index, $(this).text()); 
    }); 
    } 
}); 
-1

我用節點命令行neoRiley的2線,和測試的jQuery的命令 - 承諾線。 有關說明,通過npm // https://github.com/UncoolAJ86/node-jquery添加了jquery到節點命令行。

npm install -S '[email protected]>=2.1' 
npm install -S '[email protected]' 

/家庭/斯里達爾$節點

// make $ available on node commandline 
>var jsdom = require("jsdom"); 
>var $ = require("jquery")(jsdom.jsdom().parentWindow); 
>var promise = new $.Deferred(); 
>promise.done(function(){console.log('Starting game ..');}); 
>promise.resolve(); 

承諾解析成功回調, '開始遊戲..' 將被打印 控制檯輸出

Starting game.. 
4

(似乎所有的答案都現在不推薦)

這裏我是如何工作的(gist using mocha ):

var jsdom = require('jsdom'), 
    window = jsdom.jsdom().defaultView; 

jsdom.jQueryify(window, "../js/vendor/jquery.min.js", function(){ 
    var $ = window.$; 
}) 
2

這爲我工作

var jsdom = require('jsdom'); 
$ = require('jquery')(new jsdom.JSDOM().window);