JQuery:封装嵌套元素父级的最后一个子级

JQuery:封装嵌套元素父级的最后一个子级,jquery,jquery-selectors,Jquery,Jquery Selectors,我有以下HTML: //'[popup]' hook nested at random depths, using <ul> or <ol>, no classes or id's <ol> <li>Blah</li> <li>Blah</li> <li>Foo <ol> <li>[popup]Bar</li

我有以下HTML:

//'[popup]' hook nested at random depths, using <ul> or <ol>, no classes or id's
<ol>
    <li>Blah</li>
    <li>Blah</li>
    <li>Foo
        <ol>
            <li>[popup]Bar</li>
        </ol>
    </li>
</ol>
这对于嵌套一层的目标来说是没有问题的,但不能超过那个层。当显示目标嵌套在两层深的列表时,会出现以下情况:

<ol>
    <li>Blah</li>
    <li class="popup pop1 arrow arr1">Blah
        <ol>
            <li class="arrow arr0">Foo
                <ol>
                    <li class="popup pop0">[popup]Bar</li>
                </ol>
            </li>
            <li class="arrow arr2">Foo
                <ol>
                    <li class="popup pop2">[popup]Bar</li>
                </ol>
            </li>
        </ol>
    </li>
</ol>

  • 废话
  • 诸如此类
  • Foo
  • [popup]栏
  • Foo
  • [popup]栏
  • 您可以看到,一旦到达最后一个(始终是列表中的最后一个):最后一个子元素,不知何故,它的父元素的父元素被赋予了目标和父元素的类,然后这些类被添加到它自己

    如果有人能指出我的错误,我将不胜感激


    (我尝试了
    .parents().eq(1);
    而不是
    .parent().parent()
    ,以获得相同的结果。)

    对箭头这件事不是100%确定,但我认为您的主要问题是嵌套的li内容也会成为:contains的目标

    测试“以[popup]开头”的文本内容可能会有所帮助

    var num = 0;
    
    //Find [popup] instances, increment the number
    $("li:contains('[popup]')").each(function() {    
        if($(this).text().indexOf("[popup]")==0){
        var nextnumber = num++;
        $(this).addClass('popup' + ' ' + 'pop' + nextnumber);
    }
    
    });​
    
    请看这里:


    如果我不明白这个问题,请告诉我:-)

    你能试着发布你想要的结果吗,这样我们就可以将它与你得到的结果进行比较。我对你想要实现的目标有点困惑——用你的源代码@Marco-demoncles创建了一个JSFIDLE——这里是实际的用例。A部分是我想要的,D部分是当目标嵌套超过一个级别时发生的事情。这看起来很棒,+1以及我不知道的indexOf-解决了这个问题!
    var num = 0;
    
    //Find [popup] instances, increment the number
    $("li:contains('[popup]')").each(function() {    
        if($(this).text().indexOf("[popup]")==0){
        var nextnumber = num++;
        $(this).addClass('popup' + ' ' + 'pop' + nextnumber);
    }
    
    });​