我似乎无法想出这个有点令人尴尬的事情!
我试图遍历几组元素,然后在这些元素中我需要能够检查其中是否有其他元素(ul li ul)
<nav id="hamburger-nav" style="z-index: 100; opacity: 1;">
<ul>
<div class="cell_3 first_cel">
<ul class="r-list">
<li>
<h1>
<span class="collapse resp-toogle"><i class="fa fa-caret-right fa-lg"></i></span>
<a class="category cars_1" href="#">Cars</a> <span>(4)</span>
</h1>
<ul>
<li>
<a class="category sub-category slow-ones" href="#">Slow ones</a> <span>(0)</span>
</li>
<li>
<a class="category sub-category fast-ones" href="#">fast ones</a> <span>(4)</span>
</li>
</ul>
</li>
</ul>
</div>
<div class="cell_3">
<ul class="r-list">
<li>
<h1>
<a class="category trucks" href="#">Trucks</a> <span>(0)</span>
</h1>
</li>
</ul>
</div>
</ul>
</nav>
JS如下:
$('#hamburger-nav ul div.cell_3').each(function(index) {
if ($(this).has('ul li ul')) {
console.log('found one');
}
});
我将在此处获得三个控制台日志,如果我要注销$(this).find(&#39; ul li ul&#39;) - 我将获得一个prevObject,其中我不会#39 ; t知道循环的第二次迭代是什么。
任何帮助都会很棒。
谢谢。
答案 0 :(得分:1)
jQuery的.has()
返回元素的子集而不是布尔值,您只需要更改以下内容:
if ($(this).has('ul li ul'))
到
if ($(this).has('ul li ul').length)
答案 1 :(得分:1)
$('#hamburger-nav ul div.cell_3').each(function(index) {
if ($(this).has('ul li ul').length > 0) {
console.log('found one');
console.log($(this).has('ul li ul'))
}
});
正在使用 Fiddle
大于&gt; 0,是可选的,但我把它放在那里是为了便于阅读。 您为每个列表获取控制台的原因是因为$(selector).has()方法返回一个对象,无论它是否找到某个对象。你正在调整IF(任何东西),并且这将传递为有效,因为显示无结果的对象仍然是一段数据(即在你的情况下为prevObject)。添加长度,如果没有结果,则返回0,在JavaScript中将0视为false。
这应该对你有用,并希望它也清楚为什么会发生这种情况:)
答案 2 :(得分:1)
$(this).find('ul li ul')
是一个jQuery对象,因此您在浏览器控制台中看到的输出似乎就是该对象。
如果你想要一个实际DOM元素的数组,而不是一个包含它们的jQuery对象,你可以使用.get()函数
var elementArray = $(this).find('ul li ul').get();