Jquery Первое появление дерева обход родителей / братьев и сестер - PullRequest
3 голосов
/ 15 февраля 2011

Каков наилучший способ получить ближайший (вверх по дереву) заданный класс, но это может быть брат или сестра родителя.

Я хочу, чтобы элемент "errors1" начинался с элемента ".start"

<div>
    ...
    <div class="errors">errors2</div>
    <div>
        .....
        <div class="errors">errors1</div>
        ...
        <div>...</div>
        <div>
            .....
            <div class="start"></div>            
        </div>     
    </div>
</div>

Сделал скрипт, но он действительно плохой и вообще не работает.

http://jsfiddle.net/9DfCJ/1/

Спасибо

РЕДАКТИРОВАНИЕ: Добавлено «...» для улучшения динамической структуры. Смысл в том, чтобы найти ближайшее «.errors» дерево вверх.

Ответы [ 6 ]

1 голос
/ 07 октября 2014

Функция, возвращающая элемент в виде объекта jQuery, чтобы он был более пригоден для повторного использования.

Это более эффективно, чем ответ Бирана, потому что он смотрит только на один уровень за раз, а не загружает всех родителей и проверяет всеуровни потомков через find (http://api.jquery.com/find/) каждый раз.

Чтобы использовать, просто вставьте функцию в файл javascript или теги сценария после загрузки jQuery.

$('.start').closestParentsAndSibling( '.errors').html('found!');

(function( $ ){
   $.fn.closestParentsAndSibling = function(search) {
        // Get the current element's siblings
        var siblings = this.siblings(search);

        if (siblings.length != 0) { // Did we get a hit?
            return siblings.eq(0);
        }

        // Traverse up another level
        var parent = this.parent();
        if (parent === undefined || parent.get(0).tagName.toLowerCase() == 'body') {
            // We reached the body tag or failed to get a parent with no result.
            // Return the empty siblings tag so as to return an empty jQuery object.
            return siblings;
        }
        // Try again
        return parent.closestParentsAndSibling(search);
   }; 
})( jQuery );
1 голос
/ 15 февраля 2011

Отличный вопрос. Код ниже должен работать для вас. Он перебирает каждый родительский элемент .start, пока не найдет элемент с .errors. Затем он предупреждает текст элемента .errors, ближайший к .start.

jQuery(function($){

    var $start = $('.start'),
        $parents = $start.parents();

    $parents.each(function(){
        var $this = $(this),
            $thisErrors = $this.find('.errors'),
            numErrors = $thisErrors.length;

        if(numErrors){
            alert($thisErrors.eq(numErrors-1).text());
            return false;
        }

    });

});
1 голос
/ 15 февраля 2011
$(this).parent().siblings(':first')
1 голос
/ 15 февраля 2011

Исследовать команду jQuery prev().Например, чтобы найти и скрыть предыдущие «ошибки» в контексте класса «старт», вы должны использовать следующее:

$('.start').click(function(){
  $(this).prev('.errors').hide();
});

Подробнее здесь: http://api.jquery.com/prev/

ОБНОВЛЕНИЕ:

Возможно, вам повезет больше, если использовать parent() для перемещения вверх, если оно сильно вложено.parent() также принимает селектор в качестве аргумента ... без аргумента захватывает родителя текущего узла.

http://api.jquery.com/parent/

0 голосов
/ 26 января 2012

Я немного покопался и нашел что-то, чтобы получить первый элемент, соответствующий селектору, начиная с текущего элемента и продвигаясь вверх:

var myText = $(".start").closest($(".errors")).text(); 

Подробнее об этом здесь , и вы можете использовать свое событие для вызова этого кода.

0 голосов
/ 15 февраля 2011

Если вы хотите пойти вверх по дереву и получить все ошибки, вы можете сделать что-то вроде этого:

var start = $(".start"),
    current = start.parent(),
    parent = current,
    end_class = "stop",
    get_errors = function(elt) {
        return elt.children(".errors");
    },
    errors = get_errors(current)

    while (parent = current.parent()) {

        $.merge(errors, get_errors(parent));
        if (parent.hasClass(end_class)) {
           break;
        }   
        current = parent;
    }

В конце errors будет содержать все ошибки.

Вы должны добавить end_class к вашему верхнему div.

<div class="stop">
    ...
    <div class="errors">errors2</div>
    ...
</div>
...