错误: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..