jQuery parent () - обрабатывает каждый уровень отдельно - PullRequest
2 голосов
/ 23 февраля 2012

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

$(".myWidespreadClass").parents() // [immediateParent1, immediateParent2, deeperAncestor1, deeperAncestor2]

Я хотел бы иметь возможность запускать что-то вроде .each (), но где первыйитерация проходит по ближайшим родителям, вторая - по более глубоким предкам на следующем уровне и т. д. *

1 Ответ

5 голосов
/ 23 февраля 2012

Увлекательный вопрос.Я думаю, что вам понадобится цикл, примерно такой:

var parents = $(".myWidespreadClass").parent(); // Not plural!
while (parents[0]) {
    // Process them, e.g.
    parents.each(function() { /* ... */ });

    // Get the next tier
    parents = parents.parent(); // Not plural!
}

Живой пример | Живой источник - Обновление , но смотри ниже, что может завершиться досрочно

Возможно, вы захотите завершить работу немного раньше, например:

while (parents[0] && parents[0].nodeName !== "BODY") {

... в зависимости от ваших потребностей.Я сделал в примере. См. Ниже.

Обновление На самом деле, вы должны быть осторожны с ранним завершением, возможно, лучше отфильтровать, когда вы обрабатываете родителей вместо этого,как то так:

Живой пример | Живой источник

var parents = $(".myWidespreadClass").parent();
while (parents[0]) {
    // Process them, e.g.
    parents.each(function() {
        if ($.contains(document.body, this)) {
            // This one is under `body`, process it
            display("Visiting " + this.nodeName + "." + this.className);
        }
    });

    // Get the next tier
    parents = parents.parent(); // Not plural!
}

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

...