2011-04-11 55 views
3

在jQuery中处理.end()函数时遇到了一些问题。我读过的文档宣称它是从过滤器或其他选择中“回滚”更改。例如,使用带有破坏性方法的jQuery end()函数

var someDivs = $('div'); 
someDivs 
    .filter('li') 
    .css('color', 'green') 
.end(); // ok, reverted back to original wrapper 

另一方面,这是行不通的。

someDivs 
    .get(0) // get DOM element at index 0 
.end(); // error, executing a jQuery method on a plain javascript object. 

我只是想确认我是正确的,某些链破坏性的方法,如HTML(),文本()和get()之后被调用,这是不可能恢复到原来的包装。

在此先感谢。

+0

这不是不可能的。 '$(someDivs.get(0))端();'。要更新我的答案,并添加此。 – Khez 2011-04-11 01:59:53

+0

@Khez,这不会伤心。这相当于再次从头开始选择元素,在这种情况下...... end()会去哪里? – 2011-04-11 02:06:15

+0

@ Box9 ...呃你错了。 [一个DOM元素包装在一个jQuery对象。](http://api.jquery.com/jQuery/) – Khez 2011-04-11 02:09:40

回答

3

是的,end()只适用于返回jQuery对象的方法。返回字符串(.html().text())或DOM元素(.get())的方法将不允许您随后链接任何jQuery方法。

3

get()返回实际的HTML DOM Element而不是jQuery元素。您需要使用eq()

someDivs.eq(0).end(); 

如果你需要从一个DOM元素返回一个jQuery对象上下文。你总是可以把元素扔到$()中。例如上面的语句可以写成:

$(someDivs.get(0)).end(); 

^这就是为什么你在大多数事件处理程序做$(this)。您正在通过DOM元素而不是jQuery对象。

+0

我认为OP是知道的,因为他提到'.html()'和'.text()'。 – 2011-04-11 01:55:08

+0

不,.end()不会让你回到一些分区。 做.get(0)返回一个DOM元素,并因此失去原始列表历史记录。 – Lathan 2011-04-11 02:17:31

2

是的,你是正确的,因为那些“破坏性”函数返回的值是而不是 jQuery对象。

但是,当您将选择存储在变量(例如someDivs)中时,甚至不需要使用.end()。 jQuery的遍历函数(children()filter()等等)实际上并没有修改它们所应用的jQuery对象,而是返回一个新的jQuery对象。 jQuery的文档的这一部分是非常有帮助的链接中了解什么发生:

大多数的jQuery的DOM遍历方法上一个jQuery对象实例 运行并产生一个新的,匹配 不同组DOM元素。当 发生这种情况时,就好像元素的新集合 被推送到维持在对象内部的堆栈 上。 每个连续的过滤方法 将一个新的元素集推到 堆栈上。如果我们需要更旧的元素 集合,我们可以使用end()将集合 弹出堆栈。

由于原来的jQuery对象没有被修改,而不是使用.end(),您可以直接引用原文:

var html = someDivs.filter('li').html(); 
var text = someDivs.filter('p').text();