2010-09-13 3 views
4

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

например. делая вид, что у вас есть следующая структура:

<div> 
    ... 
    <div> 
    <ul> 
     <li> 
     <a href="..."><img class="foo"/></a><!-- "previous" --> 
     </li> 
     <li> 
     <a href="..."><img class="bar"/></a> 
     </li> 
     <li> 
     <a href="..."><img class="foo"/></a><!-- I'm at this node --> 
     </li> 
     <li> 
     <a href="..."><img class="baz"/></a> 
     </li> 
     <li> 
     <a href="..."><img class="foo"/></a><!-- "next" 1 --> 
     </li> 
    </ul> 
    </div> 
    ... 
    <div> 
    <ul> 
     <li> 
     <a href="..."><img class="foo"/></a><!-- "next" 2 --> 
     </li> 
     <li> 
     <a href="..."><img class="baz"/></a> 
     </li> 
     <li> 
     <a href="..."><img class="foo"/></a><!-- "next" 3 --> 
     </li> 
     <li> 
     <a href="..."><img class="bar"/></a> 
     </li> 
    </ul> 
    </div> 
</div> 

Я в обработчик событий JQuery, связанный с выделенным"foo" узлом выше. Я хочу найти «следующий» img элемент, который является "foo".

Однако есть 2 проблемы.

  1. Я только хочу, чтобы выбрать элементы «Foo», которые далее в DOM, чем текущий узел я на (например, «предыдущий» Foo, и текущий Foo не требуется)
  2. Хотя Я показал вложенность как следующий точный шаблон, сгенерированный код есть/может быть вставлен в любой уровень ... таким образом, я не могу просто выполнить .parent(). Parent(). Parent() .siblings(). find() ... и т. д.

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

var here = $(this).getIndexInDOM();//e.g. returns 347 
$('img.foo').each(function(){ 
    if($(this).getIndexInDOM() > here){//is this past our current index? 
    doSomething($(this));//use it 
    break; 
    } 
}); 

.getIndexInDOM() метода, очевидно, не существует в jQuery ... но мне любопытно, есть ли у кого-нибудь решение получить следующий элемент, который мне нужен.

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

//using vanilla JavaScript 
var thisImg = theCurrentImageIHave;//some reference to the DOM element 
var found = false; 
for(var i=0;i<document.images.length;i++){ 
    if(found){ 
    if(document.images[i].className == 'foo'){ 
     doSomething(document.images[i]); 
     break; 
    } 
    } else { 
    if(document.images[i] == thisImg){ 
     found = true; 
    } 
    } 
} 

ответ

14

Внутри обработчика щелчка, попробуйте следующее:

Пример:http://jsfiddle.net/QVphP/(нажмите синюю коробку, чтобы добавить рамку к следующему)

var $foo = $('img.foo'); // get all .foo images 

var idx = $foo.index(this); // get the index position of "this" 
           // relative to all the .foo images found 

var next = $foo.eq(idx + 1); // grab the .foo for the incremented index 
+0

awesome! .index() - это именно то, что мне нужно здесь ... и если бы я использовал jQuery v1.4, я бы набросился на него в одно мгновение ;-) но, увы, я еще не там, поэтому я буду нужно немного зациклиться, чтобы получить индекс сам. – scunliffe

+1

@scunliffe - jQuery 1.4 не требуется, когда вы передаете элемент DOM (как в примере выше). Два других использования '.index()' требуют 1.4. : o) Вот такой же пример, но вместо этого используйте 'jQuery 1.3.2': http://jsfiddle.net/QVphP/1/ – user113716

+0

О, человек, я слишком долго смотрел на свой код, вы правы. .. .index (элемент) поддерживается в jQuery 1.0+, чтобы добавить исправление к моему исправлению ;-) – scunliffe

2

Заканчивать next. Он делает именно то, что вы хотите.

$('img.foo').next().css('background-color', 'red'); 

Если вы хотите, чтобы получить все элементы после выбранного в данный момент элемента И вы знаете, в каком положении она находится в вашем DOM, вы можете использовать gt selector, чтобы выбрать все элементы «больше, чем» сам ,

Например:

$('img.foo:gt(4)') 

даст вам обратно все элементы, которые «больше, чем» 4-го пункта в отборе (AKA, после того, как и не текущий).

+2

'next()' только ищет родных братьев, я думал? –

+0

JasCav - '.next()' работает только для братьев и сестер. Прочтите вопрос еще раз. OP states * «Я в обработчике событий jQuery, связанном с выделенным выше« foo »узлом.» * В выделенном '.foo 'нет братьев и сестер. Необходим какой-то «перевернутый» ход. : o) – user113716

+0

@JasCav - согласно документам http://api.jquery.com/next/ .next() обходит только братья и сестры текущего узла (это в моем примере оно найдет только «следующее 1». .. если бы «следующий 1» не был там, он не нашел бы «следующий 2» или «следующий 3») – scunliffe

0

Отъезд this jsfiddle. Нажмите любое изображение с красной рамкой (foo), а следующая красная рамка (следующая foo) изменится на желтый.

В зависимости от количества foo, которое у вас есть на странице, это решение может быть немного удачным. Но так как вы еще не на 1.4, это будет работать.

+1

Nate - OP ошибся в необходимости 1.4. Ваше решение будет работать, но вам не нужно будет использовать что-либо достаточно сложное, используя '.data()'. Вот ваш пример: http://jsfiddle.net/Bs2M5/2/ Он просто использует '==' для сравнения элементов DOM. : o) – user113716

+0

@patrick очень приятно :) –

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