Как искать глубокие вложенные элементы, не просматривая вложенные копии верхнего элемента?

Например, у меня есть 4 неупорядоченных списка на странице:

<div class="UL-GROUP">
    <div>
        <ul class="UL">
            <li><a href="#something1"></a></li>
            <li><a href="#something2"></a></li>
            <li><a href="#something2"></a></li>
            <li><a href="#something3"></a>
                <div class="UL-GROUP">
                    <div>
                        <ul class="UL">
                            <li><a href="#something4"></a></li>
                            <li><a href="#something5"></a></li>
                            <li><a href="#something6"></a></li>
                            <li><a href="#something7"></a>
                                <div class="UL-GROUP">
                                    <div>
                                        <ul class="UL">
                                            <li><a href="#something8"></a></li>
                                            <li><a href="#something9"></a></li>
                                            <li><a href="#something10"></a></li>
                                            <li><a href="#something11"></a></li>
                                        </ul>
                                        <div class="contents">Loads of elements in here</div>
                                    </div>
                                </div>
                            </li>
                        </ul>
                        <div class="contents">Loads of elements in here</div>
                    </div>
                </div>
            </li>
        </ul>
        <div class="contents">Loads of elements in here</div>
    </div>
</div>
<div class="UL-GROUP">
    <div>
        <ul class="UL">
            <li><a href="#something12"></a></li>
            <li><a href="#something13"></a></li>
            <li><a href="#something14"></a></li>
            <li><a href="#something15"></a></li>
        </ul>
        <div class="contents">Loads of elements in here</div>
    </div>
</div>

И мне нужно перебрать все из них, а затем отследить, какой из 4 UL содержит ссылку, которая соответствует определенному ключу, то есть "#some4"...

Кажется, я не могу найти лучший способ их итеративного итеративного обхода независимо от того, какой из UL содержит соответствующее значение ключа. По крайней мере, без некоторого очень уродливого создания цепочки с использованием.children (см. Код jQuery ниже). Итак, как я должен делать это с учетом производительности?

Примечание. Вложенные уровни и структура HTML останутся неизменными, однако это не для таких простых элементов, как навигационные элементы, в них будет содержаться смешанный контент в виде элементов одного из элементов.UL, которых я также стараюсь избегать.

JS:

console.log($('.UL-GROUP').children('div').children('.UL').find('a[href*="#something4"]'))

Редактировать для пояснения: я подумал об упрощении этого, но используя приведенный ниже код, я застрял / неуверен относительно того, как я буду отслеживать, какой.UL-GROUP имеет ключ, который я ищу (т.е. с.data):

$('.UL-GROUP > div > ul > li').length

2 ответа

Решение

Решение @Sushanth хорошо, вы также можете использовать :has селектор

$('.UL-GROUP:has( > div > ul > li > a[href*="#something4"])').each(function(i, ul) {
    console.log(ul);
});

Почему бы вам не использовать селектор напрямую и не получить его ближайший родительский UL

$('a[href*="#something4"]').closest('ul');
Другие вопросы по тегам