我在浏览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()之后,无法恢复到原始包装器。
提前致谢。
答案 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();