jQuery 发现在 Node.js 中无法正常工作

jQuery find not working correctly in Node.js

我正在使用 jQuery 查询由 jsdom 在 Node.js 中创建的 dom:

var html = '<p class="widget">one</p><p class="widget">two</p><p class="widget">three</p>';
var jsdom = require('jsdom');
var jquery = require('jquery');
var document = jsdom.jsdom(html);
var widgets = jquery(document.parentWindow).find('.widget');
var arr = widgets instanceof Array; //true
widgets.each(function() { }) //each is not defined, its not a jquery object

我知道文档很好。它包含 3 个元素 class widget.

然而,jQuery 的 find 函数是 returning 这些 dom 元素的常规 JS 数组,而不是 jQuery 对象包装 dom 元素的集合。显然,由于 return 值是一个 JS 数组,我不能再链接更多 jQuery 函数,例如 each.

我得到的错误是:

TypeError: Object [object HTMLDivElement],[object HTMLDivElement],[object HTMLDivElement] has no method 'each'

有谁知道这里发生了什么?为什么 find 不是 return 一个 jQuery 对象?我是不是遗漏了一些明显的东西或者是一个错误?

版本: "jquery": "2.1.1", "jsdom": "2.0.0",

这个有效:

var html = '<p class="widget">one</p><p class="widget">two</p><p class="widget">three</p>';
var jsdom = require('jsdom');
var jquery = require('jquery');
var document = jsdom.jsdom(html);
var widgets = jquery(document.parentWindow)('.widget');
widgets.each(function() {
    console.log(this);
});

发生的事情是 jquery() returns 在浏览器中可以访问的内容 window.jQuery。所以你正在调用 jQuery.find,这与使用 jQuery().find 不同。后者在 jQuery 对象的 实例 中调用 find。在上面的代码中,我正在做我们通常在浏览器中做的事情 $('.widget')。如果您想使用 find:

也可以这样做
var widgets = jquery(document.parentWindow)(document).find('.widget');

虽然有 jQuery().find 的文档,但我没有找到 jQuery.find 的文档。我相信这是一个实用函数,不能在 jQuery 自己的代码之外使用。