使用jQuery .closest()遍历DOM

All*_*Liu 5 jquery jquery-selectors closest

我认为这将是一个容易.closest()处理的事实证明不是(或者我可能犯了一个愚蠢的错误).

我想要做的是<label><div>内部文本访问元素I AM HERE::

<li>
    <label>I WANT TO ACCESS THIS ELEMENT</label>
    <div>...</div>
    <div>
        <input/>
        <input/>
        <input/>
        <div id="start">I AM HERE</div>
    </div>
</li>
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测是尝试这个:

$('#start').closest('label') 
Run Code Online (Sandbox Code Playgroud)

但它不会返回任何东西.

Jas*_*per 14

.closest()仅查找初始选择的祖先元素.你想要.closest().siblings()or 的组合.children():

//find closest parent `<li>` element and then find that element's child `<label>` element
$('#start').closest('li').children('label');

//find the closest parent `<div>` element and then find that element's sibling `<label>` element
$('#start').closest('div').siblings('label');
Run Code Online (Sandbox Code Playgroud)

更新

一个非常快的选择器将使用.prev()两次,.parent()像这样:

$('#start').parent().prev().prev();
Run Code Online (Sandbox Code Playgroud)

  • 虽然`.parent().prev().prev()`可能会节省一两毫秒,如果在`label`之后将一个元素添加到`li`,或者`#start,则需要更新它`被感动了.我猜这是微优化的代价. (3认同)

use*_*654 5

.closest只查找所选元素的父项.试试这个:

$("#start").closest("li").children("label");
Run Code Online (Sandbox Code Playgroud)

更新

更改为.children,"> label"选择器已折旧.

  • 而不是使用`.find("> label")`,它需要用字符串来解决问题:`.children('label')`或更快``.children().first()`. (2认同)
  • 除非你正在处理经历数百个元素的循环,否则不值得花时间.如果您担心,请在http://jsperf.com上为它创建一个测试.我建议使用哪个更舒服的阅读. (2认同)