Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:jQuery需要一个包含文档的窗口_Jquery_Node.js - Fatal编程技术网

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

错误: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需要一个包含文档的窗口 我该

所以,在进行npm更新之前,一切都很好,很好,现在事情不像以前那样正常了

一点背景:在我的代码中,我使用jquery解析文本html。我不使用窗口,也不使用jsdom。它曾经可以很好地完成这项工作:

$ = 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");