确定元素是否具有带X标记的子元素

时间:2011-11-19 13:33:41

标签: javascript jquery traversal

我正在遍历一些元素,需要确定一个元素是否有一个带有li标签的子(孙子?),就像下面的信息元素一样。 li元素的id会有所不同,所以我没有这样引用它们。我目前正在循环使用li元素,如果我检查孩子,它总是返回true,因为有一个“a”标签的孩子,我只是想检查'lil'标签的孩子。

            <ul id="navMenu">
                <li id="home"><a href="#home" rel="ajax">Home</a></li>
                <li id="information"><a href="#information" rel="ajax">Information</a>
                    <ul>
                       <li><a href="#credits" rel="ajax">Credits</a></li>
                       <li><a href="#lorem_ipsum" rel="ajax">Lorem Ipsum</a></li>
                    </ul>
                </li>
                <li id="contact"><a href="#contact" rel="ajax">Contact</a></li>
            </ul>

这就是我现在拥有的......

        $('#test').load('../common.html #navMenu', function() {
            $.each($("#test #navMenu li"), function(i,v) {
                var theElement = $(v);
                if ($(theElement).children('li')){
                    alert('This Element has children');
                }
            });
        });

再次感谢你, 托德

4 个答案:

答案 0 :(得分:2)

你可以试试 -

$('#test').load('../common.html #navMenu', function() {
    $.each($("#test #navMenu li"), function(i,v) {
        var theElement = $(v);
        if ($(theElement).find('li').length > 0){
            alert('This Element has children');
        }
    });
});

find会比children更深入到当前元素,{{1}}只搜索一个级别。

答案 1 :(得分:1)

$(theElement).children('li')返回一个jQuery对象,该对象总是传递if子句,即使它是空的。

此外,您需要.find,因为.children仅返回直接子女而不是孙子。

所以:

if ($(theElement).find('li').length > 0) {

或:

if ($(theElement).find('li').length) {
// 0 won't pass an if clause, and all other numbers will, so you can eliminate `> 0`

答案 2 :(得分:1)

假设:

> var theElement = $(v); 
> if ($(theElement).children('li')) {  
>   alert('This Element has children'); 
> }

没有$(v)返回一个jQuery对象?所以$(theElement)是多余的。

无论如何,如果v是对传递给 .each 的其中一个元素的引用,那么您可以将以上所有内容替换为:

if (v.getElementsByTagName('li').length) {
  /* v has li descendants */
]

答案 3 :(得分:0)

您还可以在查询中添加额外的li:“#test #navMenu li li”