2014-11-08 2 views
0

Я хотел бы, чтобы упростить выбор .layer элемента в этом дереве:Упростить предыдущий выбор элементов перед тем родителем

<dt class="item"> 
    <span class="layer"></span> 
    <span class="data"><span class="box"></span></span> 
</dt> 

моего текущее положение $(this) является .box элементом, оттуда я хотел бы, чтобы выбрать .layer элемент.

В моем текущем решении я возвращаюсь к родительскому элементу и выбираю дочерний элемент .parents('.item').find('.layer'), но лучше избегаю пути через родителя. Я пытался сделать это с .prev('.layer'), но он, похоже, не работает, и я не знаю, что здесь может работать здесь.

ответ

2

JQuery имеет родительские и предыдущая селекторы:

$(this).parent().prev(); 
+0

Почему я не думал о подключении двух методов? Отлично, он работает так же, как и сейчас. – t3chb0t

+0

@ t3chb0t - зачем идти с более хрупким методом, который не может переносить какие-либо изменения в HTML? Как правило, вам нужен самый надежный код, который наименее вероятно сломается, если другие вещи будут изменены. – jfriend00

+0

@ jsfriend00: в моем случае это более надежное решение, потому что у меня есть еще один список, в котором аналогичное 'dt' имеет другое имя класса из' .item', и я не хотел заходить слишком далеко назад. Я также не хочу использовать имена элементов в моих селекторах, потому что он еще более чувствителен к более поздним изменениям. – t3chb0t

1

Самый безопасный способ сделать это, что не сломается, если небольшие изменения внесены в HTML будет:

$(this).closest(".item").find(".layer") 

Проблема с .prev() - это то, что элемент должен находиться в точном положении или он не будет работать. Когда вы пробовали $(this).prev(), нет предыдущего брата из .box, так что он ничего не мог найти.

Чем более хрупкий путь к целевой он (который опирается на точное позиционирование всех элементов) будет:

$(this).parent().prev() 

я бы не рекомендовал, потому что незначительные изменения форматирования к HTML может легко сломаться, что (предположим, кто-то решает добавить еще один <span> не в том месте), тогда как моя первая рекомендация терпима к довольно значительным изменениям HTML без нарушения. Если вы не делаете сотни или тысячи из них в цикле, маловероятно, что вы увидите заметную разницу в производительности.

+0

мое окончательное решение представляет собой сочетание обоих ответов '$ (this) .parent (". data "). prev (". layer ")' this way I может добавить больше элементов в будущем, и мне не нужно использовать 'dt.item' – t3chb0t

+0

@ t3chb0t - я не думаю, что' .prev (". layer") 'делает то, что вы думаете. Он смотрит на один и только один элемент '.prev()' и возвращает его только в том случае, если он соответствует «.layer». Он не находит элемент .layer в предыдущем направлении, независимо от того, как далеко он находится. Это распространенное заблуждение. – jfriend00

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