Найти ближайшего родителя в отношении (а не только внутри) контекста - PullRequest
2 голосов
/ 25 февраля 2011

со следующим html

<ul id="accordion">
    <li>
        <ul>
            <li><h3>title</h3></li>
        </ul>
    </li>
    <li>
        <ul>
            <li><h3>title</h3></li>
        </ul>
    </li>
    <li>
        <ul>
            <li><h3>title</h3></li>
        </ul>
    </li>       
</ul>

У меня внешний ul хранится в переменной

var acc = $("#accordion")[0]  

в общем случае я только что передал элемент DOM и не могу обязательно указать селектор

Когда нажимается h3, я хочу получить верхний уровень li, который его содержит. В общем случае может быть любая разметка между аккордеоном ul и элементом, который я хочу получить, и между элементом, который нужно выбрать, и h3 ... но у меня будет селектор, который Позволяет мне добраться до элемента из аккордеона с помощью селектора ">".

например. var items = $ ("> li", acc);

Проблема в том, что когда я начинаю с h3, на который нажали («this» внутри обработчика щелчка), трудно найти конкретный элемент.

$(this).closest(">li", acc);

возвращает пустой jQuery (может быть, ошибка? Хотя трудно определить, что означает ">" в этом случае, когда элемент верхнего уровня является динамическим)

$(this).parents(">li")

не позволяет устанавливать контекст, поэтому потенциально может вернуть слишком много элементов

Есть ли способ сделать то, что я хочу?

* edit: html теперь делает проблему яснее

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

Как насчет $(h3).closest(".item");? Согласно «ближайшей» документации, он будет проходить DOM вверх от текущего узла, пока не найдет узел, соответствующий вашему селектору.

1 голос
/ 25 февраля 2011

Иди в другую сторону, чтобы гарантировать отношения ребенка:

acc.children('li').has(this);
0 голосов
/ 26 февраля 2011
$(">li",acc).has(this)

работает в целом;установка контекста в исходном jQuery, по-видимому, единственное место, где стартовый селектор с «>» работает в jQuery

0 голосов
/ 25 февраля 2011
jQuery(this).parents('li:last');
...