2017-02-07 13 views
0

Я хотел бы вернуть объект предыдущего вхождения класса в часть дерева Dom и если нет предыдущего события, то мне нужно сказать так.Используйте jQuery, чтобы найти предыдущее появление класса в Dom Tree

Определение предыдущего вхождения: предыдущее появление «21ld» из $ (this) в течение каждого цикла - в основном там, где вы его находите, при поиске текстов всего исходного кода «.window» назад для «21ld» из $ (это).

HTML (очень, очень упрощенная, фактическая структура очень хаотичным и непредсказуемым):

<div class='window'> 

    <div class='093a'> 
      <div class='a9a3'> 
       <div class='21ld'></div> 
     </div> 
     <div class='99l1'> 
       <div class='uuu99l1'> 
        <div class='saved'></div> 
       </div> 
     </div> 
    </div> 
    <div class='i93d'> 
      <div class='ad9l3'> 
       <div class='ool1ld'></div> 
     </div> 
    </div> 
    <div class='j93d'> 
      <div class='aid9l3'> 
       <div class='okl1ld'></div> 
     </div> 
    </div> 
    <div class='a93d'> 
      <div class='9l3'> 
       <div class='21ld'></div> 
     </div> 
    </div> 
    <div class='rbl1'> 
     <div class='4l1'> 
       <div class='saved'></div> 
     </div> 
    </div> 
    <div class='r0l1'> 
     <div class='0adl1'> 
       <div class='0l1'> 
         <div class='21ld'></div> 
       </div> 
     </div 
    </div> 
</div> 

JS:

$('.window').find('.21ld').each(function(index){ 
     console.log($(this).fromHereFindPreviousOccurence('.saved')); 
}); 

так что ожидать выход:

1: undefined/false/whatever 
2: jQuery Object of first saved class from my example 
3: jQuery Object of second saved class from my example 

Я был бы очень рад, если бы кто-нибудь мог помочь мне здесь? :)

+0

почему вы хотите это сделать? я думаю, что ответ здесь будет довольно сложным и, возможно, придется задействовать всю DOM каждый раз, когда вы ищете класс – Cruiser

+0

«предыдущий», как написано в вашем HTML, не означает то же самое, что и предыдущее в DOM дерево. Я не думаю, что вы сможете сделать это, как написано. Но, как сказал @Cruiser, если вы скажете нам, ПОЧЕМУ вы хотите это сделать, мы можем помочь вам спланировать лучшее решение. – andi

+0

Другая функция сохраняет элементы из dom и в этой функции мне нужно значение данных из последнего «.saved» элемента, идущего назад от элементов в каждом цикле в источнике. – Jessica

ответ

1

Этот фрагмент кода будет пересекать DOM, чтобы найти предыдущий сохранить. Он будет работать, только если структура останется прежней. Если есть какая-то рифма или причина родительских имен div, тогда вы можете написать ее немного лучше.

var $window = $('.window'), 
 
    //immediate div children 
 
    $parentContainers = $('.window > div'); 
 

 
$window.find('.21ld').each(function() { 
 
    var $currentElement = $(this), 
 
    $prevSave; 
 

 
    $parentContainers.each(function(i) { 
 
    var $this = $(this), 
 
     parentContainer = $(this).find($currentElement).length > 0, 
 
     $innerSave = $this.find('.saved'); 
 

 
    if (parentContainer) { 
 
     //breaks out of iteration if we've found the current element 
 
     return false; 
 
    } else if ($innerSave.length > 0) { 
 
     //cache the most recent save elemen 
 
     $prevSave = $innerSave; 
 
    } 
 
    }); 
 

 
    var text = typeof $prevSave === 'undefined' ? 'undefined' : $prevSave.text(), 
 
    parent = typeof $prevSave === 'undefined' ? '' : ' in ' + $prevSave.parent().attr('class') 
 

 
    //shows results using the parent class names 
 
    console.log($currentElement.parent().attr('class') + ' found ' + text + parent); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
 
<div class='window'> 
 
    <div class='093a'> 
 
    <div class='a9a3'> 
 
     <div class='21ld'></div> 
 
    </div> 
 
    <div class='99l1'> 
 
     <div class='uuu99l1'> 
 
     <div class='saved'>first save</div> 
 
     </div> 
 
    </div> 
 
    </div> 
 
    <div class='i93d'> 
 
    <div class='ad9l3'> 
 
     <div class='ool1ld'></div> 
 
    </div> 
 
    </div> 
 
    <div class='j93d'> 
 
    <div class='aid9l3'> 
 
     <div class='okl1ld'></div> 
 
    </div> 
 
    </div> 
 
    <div class='a93d'> 
 
    <div class='9l3'> 
 
     <div class='21ld'></div> 
 
    </div> 
 
    </div> 
 
    <div class='rbl1'> 
 
    <div class='4l1'> 
 
     <div class='saved'>second save</div> 
 
    </div> 
 
    </div> 
 
    <div class='r0l1'> 
 
    <div class='0adl1'> 
 
     <div class='0l1'> 
 
     <div class='21ld'></div> 
 
     </div> 
 
    </div </div> 
 
    </div>

+0

вы попадаете моя проблема прямо в глаза;) Моя самая большая проблема заключается в том, что может быть динамическое число родителей выше $ (это), и я никогда не знаю, сколько уровней подниматься. имена классов также различаются каждый раз, а также уровни, в которых .saved и 21ld вложены, по имени класса я могу перейти только к «.window», после чего я полностью потерял бы следы от того, откуда я пришел. – Jessica

+0

Я обновил код в своем вопросе, чтобы отразить это немного. – Jessica

+0

@Jessica Обновлен фрагмент для вас. Это может быть оптимизировано лучше, но я не могу потратить на это много времени. Надеюсь, поможет. – Kevin

0

Прошло некоторое время, так как я использовал jQuery, но я только что протестировал это, и я думаю, что он должен работать.

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

function findClass(el, needle) { 
    let element = el 

    while (element.nodeName !== 'HTML') { 

     if ($(element).find(needle).length) { 
      return $(element).find(needle) 
     } 

     element = element.parent() 
    } 
} 
+0

Я добавил определение, фактическое дерево dom слишком сложно для чего-то подобного, чтобы правильно работать, и мне всегда нужно предыдущее (как в предыдущем слове в тексте) появление – Jessica

+0

@Jessica Я вижу, что вы получаете, и начиная с чем-то вроде выше, или какой-то рекурсивной функцией является то направление, в котором вы собираетесь идти, но учитывая отношение «близость», вы, вероятно, захотите найти экземпляр * last * класса один раз вы получаете определенное расстояние от узла происхождения. – thesublimeobject

0

Таким образом, вы можете использовать .prev(). jQuery reference. JS будет выглядеть примерно так:

$(window).each('.21ld', function (i){ 
    var saved =$(this).prev('.saved'); 
    console.log(saved); 
    if(saved.length < 0){ 
     console.log('.saved not found on occurance: ' + i); 
    } 
}); 
+0

это не будет работать в моем случае использования, потому что $ (это) может находиться в полном месте, чем класс .saved - они оба находятся только в «.window», кроме того, что они находятся в совершенно разных деревьях. – Jessica

 Смежные вопросы

  • Нет связанных вопросов^_^