错误:jQuery需要一个包含文档的窗口

所以一切工作都很好,很好,直到做npm更新,现在事情不像以前那样工作。

一点背景:在我的代码中,我使用jquery来parsing文本的HTML。 我不使用窗口,也不使用jsdom。 它曾经工作得很好,做到这一点:

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

但现在我明白了这一点:jQuery需要一个带有文档的窗口

我该如何解决?

node.js-jQuery定义在一行中:

 // definition var $ = require('jquery')(require("jsdom").jsdom().parentWindow); // usage $("body").append("<div>TEST</div>"); console.log($("body").html()); 

jQuery的npm包肯定包含了jsdom,这就是为什么它可以在Node中工作:jQuery需要有某种DOM环境来处理。

您可以通过执行npm install jquery@1.8.3来检查旧版本。 你会看到与它一起安装jsdom。 出于某种原因,他们似乎已经从最近的版本中删除了jsdom。 我不知道为什么。

但是,使用jsdom 7.x来运行jQuery代码很简单:

 var jsdom = require("jsdom"); var window = jsdom.jsdom().defaultView; jsdom.jQueryify(window, "jquery-latest.js", function () { var $ = window.$; $("body").prepend("<h1>The title</h1>"); console.log($("h1").html()); }); 

path可以被改变为不同版本的jQuery或本地文件。

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

我解决了它。 必须先删除jsdom和jquery然后npm安装jsdom jquery。

那么这个:

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

事实certificate,我有最新版本是重要的。 否则,它不工作..

(似乎所有的答案已被弃用)

在这里,我是如何工作的(主要使用摩卡 ):

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

我在我的Node.js(服务器)文件的顶部使用jQuery来帮助呈现html文本…

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

每件事都出现了玫瑰。

您可以在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创build一个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> 

你必须提供一个窗口对象。 为此,只需从jsdom传递parentWindow:

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

我目前正在使用这种方式:检查jsdom的文档

  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: ["jquery-latest.js"], done: function (err, window) { var $ = window.$; //start using jquery now $("p").each(function(index) { console.log("paragraph ", index, $(this).text()); }); } }); 

我在节点命令行上使用了neoRiley的2行代码,并在命令行上testing了jQuery的promise。 通过npm // https://github.com/UncoolAJ86/node-jquery添加jquery到节点命令行获得指示信息。;

 npm install -S 'jquery@>=2.1' npm install -S 'jsdom@3.1.2' 

/ home / sridhar $节点

 // 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(); 

承诺解决成功callback,“开始游戏”将打印控制台输出

 Starting game..