jQuery pushStack函数如何工作?

我无法理解jQuery pushStack函数(在http://api.jquery.com/pushStack/上有记录 )。 我试图在这个小提琴中添加一个项目列表给选择器。

http://jsfiddle.net/johnhoffman/hTh8D/

JS:

$(function() { var listStuff = $("p"); listStuff.pushStack($("div")); listStuff.css("color", "#f00"); });​ 

HTML:

 

foo

bar

但是,div元素的文本不是红色的。 将元素推送到jQuery堆栈意味着什么?

.pushStack()创建一个新的jQuery对象,该对象从先前的jQuery对象inheritance状态。

这种inheritance状态允许像.end().self()这样的方法正常工作。 在您的特定代码示例中,您没有使用.pushStack()的返回值,它是新的jQuery对象。

使用jQuery对象时,重要的是要知道更改jQuery对象中DOM对象的大多数操作都会返回一个新的jQuery对象,而不是修改现有的jQuery对象。 正是这种设计特性允许它们维护这堆先前修改过的jQuery对象。

在你的情况下,我认为你根本不需要使用.pushStack() ,你可能只需要使用.add() (它也返回一个新的jQuery对象),但我不清楚你是什么重新尝试这样做我不确定要推荐什么代码。

要获得您在问题中显示的最终结果HTML,您可以这样做:

 $(function() { $("p").add("div").css("color", "#f00").appendTo(document.body); });​ 

您显然可以将.appendTo()更改为您想要对新DOM对象执行的任何操作。

在你的评论中,你问了一些关于何时使用pushStack()更多信息。 我认为主要用途是在jQuery方法中返回一个新的jQuery对象。 在这种情况下,您可以在新的jQuery对象中创建所需的新元素列表,然后将其转换为常规jQuery对象并返回它,然后调用return this.pushStack(elems) 。 这最终会创建一个新的jQuery对象并返回它,但它也会将该新对象链接到前一个对象,以便在链接中使用时, .end()等特殊命令可以正常工作。

jQuery .add()方法是一个经典的例子。 在伪代码中,它的作用是:

 add: function(selector, context) { // get the DOM elements that correspond to the new selector (the ones to be added) // get the DOM elements from the current jQuery object with this.get() // merge the two arrays of elements together into one array return this.pushStack(combinedElems); } 

你没有推动对象,试试这个:

 $(function() { var listStuff = $("p"); listStuff.css("color", "#f00"); this.pushStack( listStuff.get() ); });​