Dun*_*zzz 13 jquery dom-traversal
这些有什么区别?一个比另一个更有效吗?我有点困惑他们为什么都存在.说我有这个标记:
<table>
<tr>
<td>...</td>
<td><span class='toggle'>Toggle</span></td>
</tr>
<tr>
<td>...</td>
<td><span class='toggle'>Toggle</span></td>
</tr>
<tr>
<td>..</td>
<td><span class='toggle'>Toggle</span></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
从<span>标签我可以使用 两种 $(this).closest('tr');或$(this).parents('tr');访问父/最接近的<tr>标签.
T.J*_*der 18
(注意:这个问题是在被问到后的第二天编辑的,将问题从即将parent改为关注parents[注意复数].哪种情况有所不同!)
关于(奇异)与你的原始问题:只有一个级别.从当前元素(不仅仅是父元素)开始,并继续搜索祖先,直到找到匹配(或用完祖先).parentclosestparentclosest
关于(复数)与你的最新问题:有两点不同:parentsclosest
是否考虑当前元素(它是closest,它不是parents).
搜索是否与第一场比赛(它与停止closest,它不会parents).
从你原来的问题:
从标签我可以使用$(this).closest('tr'); 或$(this).parent('tr');
不,实际上.$(this).parent('tr');会返回一个空的jQuery对象,因为它的父级span与选择器不匹配.
从您更新的问题:
从标签我可以使用$(this).closest('tr'); 或$(this).parents('tr');
你可以,提供你tr不也是在另一个tr(例如,包含一个表的表).如果是这样的话,你会得到相同的结果.但是如果你在一个表中有一个表,parents你将获得多个trs(所有的祖先tr元素).
考虑这个结构:
<div class="wrapper">
<div class="inner">
<p>Testing <span>1 2 3</span></p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
如果我们勾click对span,这就是我们从三个相关的方法得到的结果:
$(this).parent('div')-空jQuery对象,的母体span不是div.$(this).parents('div')- 带有两个 div s的jQuery对象,"内部"和"包装器"div(按此顺序).$(this).closest('div')- jQuery对象,其中 包含一个div "内部" 对象.这里的结果,如果我们钩click上span,并使用span作为选择:
$(this).parent('span')-空jQuery对象,的母体span不是span.$(this).parents('span')- 空jQuery对象,span没有祖先spans.$(this).closest('span')- span点击了jQuery对象.