使用jQuery.closest()遍历DOM
我原以为使用jQuery.closest()遍历DOM,jquery,jquery-selectors,closest,Jquery,Jquery Selectors,Closest,我原以为.closest()很容易处理的事情,结果却不是(或者我犯了一个愚蠢的错误) 我试图做的是从带有内部文本的中访问元素:我在这里: <li> <label>I WANT TO ACCESS THIS ELEMENT</label> <div>...</div> <div> <input/> <input/> <inpu
.closest()
很容易处理的事情,结果却不是(或者我犯了一个愚蠢的错误)
我试图做的是从带有内部文本的
中访问
元素:我在这里
:
<li>
<label>I WANT TO ACCESS THIS ELEMENT</label>
<div>...</div>
<div>
<input/>
<input/>
<input/>
<div id="start">I AM HERE</div>
</div>
</li>
但是它不会返回任何内容。.closest()
只查找初始选择的祖先元素。您需要组合使用.closest()
和.sibbins()
或.children()
:
.closest
仅查找选定元素的父元素。试试这个:
$("#start").closest("li").children("label");
更新
更改为
.children
,>标签“
选择器已折旧。最接近的将从当前元素开始,并向上移动到DOM树,但由于
不是当前元素的父级,因此需要使用两个查找:
$('#start').closest('li').children('label');
这将是您最有效的遍历。我知道这很旧,但这里是最快的方法
$('#start').closest('li').find('label');
find()
使用本机浏览器方法,children()
使用浏览器解释的JavaScript谢谢Jasper!您的解决方案与Kevin提供的解决方案(例如性能)是否有很大差异?@AllenLiu只要您可以从选择器中删除字符串,它们的性能就会更快。我提供的最快的选择器是:$('#start').parent().prev().prev()代码>@AllenLiu。微观差异。不要在上面浪费时间。@AllenLiu我还注意到您正在这样做表单输入:。parent().prev().prev()
可能会为您节省一两毫秒,如果在标签
之后向li
添加一个元素,或者如果移动了#start
,则需要更新它。我想这就是微优化的代价。我会问你和我问贾斯珀一样的问题。您的解决方案与Jasper提供的解决方案(例如性能)有什么大的不同吗?您可以使用.find(“>label”)
而不是.children('label')
或更快的.children().first()
。顺便说一句,谢谢=)我真的很感谢你的帮助。除非你处理的是一个通过数百个元素的循环,否则没有什么值得花时间的。如果需要,请在上为其创建一个测试。我建议您选择更适合阅读的方法。此外,出于微观优化的考虑,.children(“label”)
比我的方法更快,而且在我看来更容易阅读。如果.closest()
似乎不起作用,为什么不看看下面的方法呢?或者遍历方法列表:找到一个更合适的方法…nnnnnn-我确实看过文档,这就是我提出测试的原因。文档特别提到“获取与选择器匹配的第一个元素,从当前元素开始,通过DOM树向上。”我认为我试图访问的标签在DOM树中。好问题!我还没有使用过nearest(),但现在我知道我需要这样做。很好的例子。对不起,艾伦,这么多人在这里发帖而不是使用doco(或谷歌),我想我认为你就是这样一个人。再次抱歉。“通过DOM树向上”的意思是直接向上,而不是横向。例如,父母、祖父母、曾祖父母等,但不包括阿姨/叔叔、表兄弟姐妹、兄弟姐妹。谢谢nnnnnnnn。我理解你想说的=)我们中的一些人只有从文件中我们才能理解的那么好。
$("#start").closest("li").children("label");
$('#start').closest('li').children('label');
$('#start').closest('li').find('label');