错误:jQuery需要一个包含文档的窗口
所以,在进行npm更新之前,一切都很好,很好,现在事情不像以前那样正常了 一点背景:在我的代码中,我使用jquery解析文本html。我不使用窗口,也不使用jsdom。它曾经可以很好地完成这项工作:错误:jQuery需要一个包含文档的窗口,jquery,node.js,Jquery,Node.js,所以,在进行npm更新之前,一切都很好,很好,现在事情不像以前那样正常了 一点背景:在我的代码中,我使用jquery解析文本html。我不使用窗口,也不使用jsdom。它曾经可以很好地完成这项工作: $ = require("jquery"); $(html).find("<h1>").html("The title"); $=require(“jquery”); $(html.find(“”.html(“标题”); 但现在我明白了: jQuery需要一个包含文档的窗口 我该
$ = require("jquery");
$(html).find("<h1>").html("The title");
$=require(“jquery”);
$(html.find(“”.html(“标题”);
但现在我明白了:
jQuery需要一个包含文档的窗口
我该如何解决这个问题 jQuery的npm包肯定包含jsdom,这就是它在Node中工作的原因:jQuery需要某种DOM环境来工作 您可以通过执行
npm安装来检查旧版本是否有它jquery@1.8.3
。您将看到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());
});
var jsdom=require(“jsdom”);
var window=jsdom.jsdom().defaultView;
jQueryify(窗口,“http://code.jquery.com/jquery.js“,函数(){
var$=窗口。$;
$(“正文”)。前缀(“标题”);
log($((“h1”).html());
});
可以将路径更改为不同版本的jQuery或本地文件
注意:jsdom的早期版本,包括3.x系列,需要行
var window=jsdom.jsdom().parentWindow
而不是var window=jsdom.jsdom().defaultView代码>。4.x使得父窗口不再工作。我解决了它。必须首先删除jsdom和jquery,然后npm安装jsdom jquery
那么这个,
var jsdom = require("jsdom");
$ = require("jquery")(jsdom.jsdom().createWindow());
事实证明,我有最新版本是很重要的。否则就不行了 您可以在包.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>
文件
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);
});
var jsdom=require(“jsdom”).jsdom;
var fs=需要('fs');
readFile('page.htm',{encoding:'utf8},函数(err,markup){
如果(错误)抛出错误;
var doc=jsdom(标记);
var window=doc.parentWindow;
var$=require('jquery')(窗口)
var outerLeft=$(“.left”).clone().wrap(“”).parent().html();
var innerLeft=$(“.left”).html();
console.log(outerLeft,“and…”,innerLeft);
});
将输出:
<div class="left">
<p>left content</p>
</div> and ...
<p>left content</p>
左内容
而且。。。
左内容
node.js-jQuery定义在一行中:
// definition
var $ = require('jquery')(require("jsdom").jsdom().parentWindow);
// usage
$("body").append("<div>TEST</div>");
console.log($("body").html());
//定义
var$=require('jquery')(require(“jsdom”).jsdom().parentWindow);
//用法
$(“正文”)。附加(“测试”);
log($(“body”).html());
我将其放在Node.js(服务器)文件的顶部,该文件使用jQuery帮助呈现html文本
var jsdom = require("jsdom").jsdom;
jsdom.env({
html : "<html><body></body></html>",
done : function(errs, window) {
global.window = window;
}
});
var jsdom=require(“jsdom”).jsdom;
jsdom.env({
html:“”,
完成:功能(错误,窗口){
global.window=窗口;
}
});
一切都很顺利。您必须提供一个窗口对象。为此,只需从jsdom传递parentWindow:
var jsdom = require("jsdom");
var $ = require("jquery")(jsdom.jsdom().parentWindow);
我目前使用的方式是:检查
我在node命令行上使用了neoRiley的两行代码,并在命令行上测试了jQuery承诺。
通过npm将jquery添加到节点命令行
//请示
npm install -S 'jquery@>=2.1'
npm install -S 'jsdom@3.1.2'
/主/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();
承诺决定成功回调,将打印“开始游戏…”
控制台输出
Starting game..
(2018)-新的jsdom API
var jsdom=require('jsdom'),
{JSDOM}=JSDOM,
jsdom_选项={
运行脚本:“危险”,
资源:“可用”
};
//外部脚本示例:
var DOM=新的JSDOM(``,JSDOM_选项);
//本地脚本示例:
var jQuery=fs.readFileSync(“../../jQuery.js”,{encoding:“utf-8”});
var DOM=newjsdom(``,{runScripts:“危险的”});
var scriptElm=window.document.createElement(“脚本”);
scriptElm.textContent=jQuery;
DOM.window.document.head.appendChild(scriptElm);
参考资料:
这对我有用
var jsdom = require('jsdom');
$ = require('jquery')(new jsdom.JSDOM().window);
我知道我在这里的年份不对,但我可能找到了一个更好的方法,然后是这里提供的方法。如果您从.html文件调用脚本,脚本将知道文档,它为我解决了问题(至少现在是这样)。例如:
index.html:
<html>
<head>
<meta charset="UTF-8">
<!--Scripts-->
<script>
window.$ = window.jQuery = require('../js/libs/jQuery.js');
</script>
<script src="../js/libs/materialize.js"></script>
<script>
const init = require("../js/initialize/initialize.js");
init.initializer.main_init();
</script>
<!--Styles-->
<!--Libraries-->
<link rel="stylesheet" href="../scss/libs/materialize.css" />
</head>
</html>
如果有错误,请告诉我,我今天才开始使用这个框架。jsdom
似乎有了一个新版本,因此现在它的工作方式略有不同。这里有一个例子:
const { JSDOM } = require("jsdom");
const myJSDom = new JSDOM (html);
const $ = require('jquery')(myJSDom.window);
现在,您可以像以前一样在jQuery上进行搜索:
$("<h1>").html("The title");
$(“”)html(“标题”);
注意jQuery的安装,因为您应该编写jQuery
所有小写字母,比如npm install jQuery
2021答案
最近也面临同样的问题
这适用于“jquery”:“^3.5.1”和“jsdom”:“^16.4.0”
constjsdom=require(“jsdom”);
const{JSDOM}=JSDOM;
常量jquery=require('jquery')
getHtmlFromSomewhere(函数(错误,数据){
手柄错误(err)
log(“html是”,数据)
const dom=新的JSDOM(数据);
const$=jquery(dom.window);
const someData=$(“#dataTable tbody tr:last td:eq(1)”)
log(“某些数据为:”,某些数据为.text())
});
解决方案的要点是使用JSDOM解析HTML以获得窗口对象。然后使用jquery包装所述窗口对象
就是这样,您可以在解析文档中使用jquery选择器函数,该函数不适用于我的版本(v0.10.28)和当前的jquery和jsdom模块。@Michael您必须使用parentWindow
属性<代码>createWindow()
不存在。这不起作用,未定义父窗口。在fixed it.run:npm安装中使用类似的defaultView
jsdom@3.x资料来源:我很难找到答案,这取决于
var jQuery = require('jquery');
(function($, global, undefined) {
"use strict";
var Initialize = function() {
var initializer;
initializer = {
materialize_init: function () {
console.log(document.getElementsByClassName("tooltipped"));
},
main_initialize: function () {
this.materialize_init();
}
};
return {
main_init: function () {
initializer.main_initialize();
return this;
}
};
};
// AMD and window support
if (typeof define === "function") {
define([], function () { return new Initialize(); });
} else if (typeof global.initializer === "undefined") {
global.initializer = new Initialize();
}
})(jQuery, this);
const { JSDOM } = require("jsdom");
const myJSDom = new JSDOM (html);
const $ = require('jquery')(myJSDom.window);
$("<h1>").html("The title");