1

可能重复:
jQuery pushStack 函数是如何工作的?

在 jQuery API 中,我看到了一个函数pushStack。描述是:Add a collection of DOM elements onto the jQuery stack.

有谁知道 jQuery 堆栈是什么以及它可以用来做什么?它与DOM有关系吗?

4

4 回答 4

3

当您将多个 jQuery 方法链接在一起并且每个方法返回一个新的 jQuery 对象时,jQuery 会跟踪堆栈中的所有 jQuery 对象。这允许您返回到以前使用的 jQuery 对象,而不必将其保存在局部变量中。为了使这个工作,当 jQuery 方法作为方法调用的结果创建一个新的 jQuery 对象时,它调用pushStack()以允许新对象参与堆栈。

jQuery 方法.end()有点相反.pushStack(),它返回堆栈中的一项以获取先前的 jQuery 对象,并且可以多次调用它以继续返回堆栈。有关更多信息,.end()请参阅文档

对于 using 的示例,.pushStack()假设您想要一个可以获取容器中所有文本节点的方法,您可以这样做并使用以下方法返回新的结果 jQuery 对象.pushStack()

jQuery.fn.textNodes = function() {
    var nodes = [];
    this.each(function() {
        var node = this.firstChild;
        while (node) {
            if (node.nodeType == 3) {
                nodes.push(node);
            }
            node = node.nextSibling;
        }
    });
    return this.pushStack(nodes, "textNodes");
};
于 2012-08-10T06:57:46.393 回答
0

大多数 jQuery 的 DOM 遍历方法对 jQuery 对象实例进行操作并生成一个新的对象实例,以匹配一组不同的 DOM 元素。当这种情况发生时,就好像新的元素集被推到了一个在对象内部维护的堆栈上。每个连续的过滤方法都会将一个新元素集推入堆栈。您有不同的功能可以直接在此堆栈上进行操作,例如:

于 2012-08-10T06:59:53.660 回答
0

查看 core.js 的 jQuery 源代码行 203,堆栈指的是 jQuery 对象实例中的当前元素集。把它想象成链接......当你过滤时,你正在添加到堆栈中。调用 end() 将弹出该集合并返回堆栈中的前一个集合。.pushStack()允许您向此堆栈添加一组新元素。

// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems, name, selector ) {

    // Build a new jQuery matched element set
    var ret = jQuery.merge( this.constructor(), elems );

    // Add the old object onto the stack (as a reference)
    ret.prevObject = this;

    ret.context = this.context;

    if ( name === "find" ) {
        ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
    } else if ( name ) {
        ret.selector = this.selector + "." + name + "(" + selector + ")";
    }

    // Return the newly-formed element set
    return ret;
},
于 2012-08-10T07:00:51.417 回答
0

您可以将其与 .end() 一起使用

参见: jQuery pushStack

也: http ://www.bennadel.com/blog/1739-Using-PushStack-In-jQuery-Plugins-To-Create-New-Collections.htm

于 2012-08-10T07:02:42.513 回答