2013-10-24 2 views
1

Когда я нажимаю на ссылку, мне нужно найти следующий <section>, который имеет атрибут ID и возвращает его идентификатор.Как найти следующий элемент с атрибутом ID с помощью jQuery

Поэтому, учитывая следующую разметку и javascript, я ожидаю, что нажимаю на ссылку, чтобы написать «section_3» на консоли.

<section id="section_1"> 
    <a href="#" class="findNext">Find</a> 
</section> 
<section></section> 
<section id="section_3"></section> 
<section id="section_4"></section> 

и

$('a.findNext').click(function() { 
    var nextSectionWithId = $(this).closest("section").next("section[id]"); 
    if (nextSectionWithId) { 
     var sectionId = nextSectionWithId.attr('id'); 
     console.log(sectionId) 
    } 
}); 

Но это не работает. Я установил the code up here in jsFiddle.

Любые идеи, почему это не работает?

+2

.next не выполняет поиск по всем следующим братьям и сестрам, он смотрит только на ближайший следующий. это в api docs. –

+0

Если предусмотрен селектор, он получает следующий брат, только если он соответствует этому селектору. В следующем разделе нет идентификатора. – marcellscarlett

+0

Отлично, я, очевидно, неправильно истолковал его как «следующий, чтобы соответствовать критериям», а не «следующий, если он соответствует критериям». – Digbyswift

ответ

5

Try:

var nextSectionWithId = $(this).closest("section").nextAll("section[id]:first"); 

или

var nextSectionWithId = $(this).closest("section").nextAll("section[id]").filter(':first'); 

Fiddle

Вы не можете использовать следующий, потому что следующий будет искать совпадение только в следующем элементе. Таким образом, вы можете использовать nextAll в сочетании с :first в селекторе.

Update

Вы можете использовать метод first() в JQuery для извлечения первого элемента в коллекции, а что кажется более быстрым вариантом.

var nextSectionWithId = $(this).closest("section").nextAll("section[id]").first(); 

Вероятно, может быть эта причина:

Потому что: первое является расширением JQuery и не является частью спецификации CSS, запросы с помощью: первые не могут воспользоваться преимуществами увеличения производительности, предоставляемой родной DOM querySelectorAll(). Для достижения наилучшей производительности при использовании: сначала для выбора элементов, сначала выберите элементы, используя чистый селектор CSS, затем используйте .filter («: first»).

Coutesy @ T.J. Crowder

+0

@ T.J.Crowder, Вы нашли его? Разве это не ваш вопрос :) Полезно знать !! – Liam

+1

@ Liam: Да, это так. :-) Я имел в виду «я нашел», как в «Я узнал» (в данном случае, от Ника [и экспериментов]). –

+0

@ T.J.Crowder Да, вероятно, позвольте мне добавить это также ... в ответ ... :) Спасибо! – PSL

2

Использование .nextAll()

DEMO

var nextSectionWithId = $(this).closest("section").nextAll("section[id]")[0].id; 

DEMO

var nextSectionWithId = $(this).closest("section").nextAll("section[id]").eq(0).attr('id'); 

DEMO

var nextSectionWithId = $(this).closest("section").nextAll("section[id]").attr('id'); 
+0

почему вниз проголосовали за проверку DEMO. –

+0

Я не спускал вниз, но причиной могло быть то, что OP хочет найти только следующий элемент с условием, а не все из них. 'attr ('id')' работает, потому что он рассматривает только первый элемент в коллекции. – PSL

+0

nextAll возвращает список, а не отдельный элемент. Вам также нужен: первый селектор – Liam

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