.closest()和.parents(’selector’)之间有什么区别?

这些有什么区别? 一个比另一个更有效吗? 我有点困惑他们为什么都存在。 说我有这个标记:

... Toggle
... Toggle
.. Toggle

标签我可以使用$(this).closest('tr');$(this).parents('tr'); 访问父/最近的

标签。

parent返回直接父项(一个用于调用者对象中的每个元素),如果父项与选择器不匹配,则返回任何内容。 closest返回与每个元素(可以是原始元素)匹配祖先的最近祖先。 第三个类似的函数parents返回所有匹配的祖先(不包括元素本身)。

通常,如果您明智地选择选择器,则closest HTML对代码的重构比parent更具抵抗力。

(注意:问题在被问到的第二天被编辑,将问题从关于parent改为关于parents [注意复数]。哪种有所不同!)

关于parent (单数)与closest原始问题: parent只有一级上升。 closest当前元素(不仅仅是父元素),并继续搜索祖先,直到找到匹配(或用完祖先)。

关于parents (复数)与closest最新问题 :有两点不同:

  1. 是否考虑当前元素(它是closest ,它不是parents )。

  2. 搜索是否在第一次匹配时停止(与closest匹配,但不与parents匹配)。

从你原来的问题:

从标签我可以使用$(this).closest(’tr’); 或$(this).parent(’tr’);

不,实际上。 $(this).parent('tr'); 将返回一个空的jQuery对象,因为span的父级与选择器不匹配。

从您更新的问题:

从标签我可以使用$(this).closest(’tr’); 或$(this).parents(’tr’);

如果您的tr不在另一个tr (例如,包含表格的表格)中,您可以。 如果是这样的话,你会得到相同的结果。 但是如果你在一个表中有一个表,与parents你会得到多个tr所有的祖先tr元素)。

考虑这个结构:

 

Testing 1 2 3

如果我们挂钩click span ,这就是我们从三个相关方法中得到的结果:

  • $(this).parent('div') – 空的jQuery对象, span的父级不是div
  • $(this).parents('div') – jQuery对象,里面有两个 div ,“inner”和“wrapper”divs(按顺序)。
  • $(this).closest('div') – jQuery对象, 其中包含一个 div ,即“内部” div

如果我们挂钩click span并使用span作为选择器,则结果如下:

  • $(this).parent('span') – 空jQuery对象, span的父级不是span
  • $(this).parents('span') – 空jQuery对象, span没有祖先span s。
  • $(this).closest('span') – 带有单击span jQuery对象。

.parent()只上升一级,而.parent()包括当前元素和所有父级。

示例(从底部div选择, x =匹配的元素):

  parent() parent('body') .closest('div') .parents('div') body div x div x  x this--> div x