使用具有破坏性方法的jQuery end()函数

时间:2011-04-11 01:47:13

标签: javascript jquery javascript-framework

我在浏览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(),text()和get()之后,无法恢复到原始包装器。

提前致谢。

3 个答案:

答案 0 :(得分:3)

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

someDivs.eq(0).end();

如果您需要从dom元素返回到jQuery对象上下文。您始终可以将元素抛出到$()中。例如,可以重写上述语句:

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

^这正是您在大多数事件处理程序中执行$(this)的原因。你正在传递DOM元素而不是jQuery对象。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

  

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

由于未修改原始jQuery对象,而不是使用.end(),因此您只需引用原始对象:

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