Получить индекс элемента как дочернего по отношению к родительскому
Скажем, у меня есть эта разметка:
<ul id="wizard">
<li>Step 1</li>
<li>Step 2</li>
</ul>
И у меня есть этот jQuery:
$("#wizard li").click(function () {
// alert index of li relative to ul parent
});
Как я могу получить индекс дочернего элемента li
по отношению к нему родительский, при нажатии этого li
?
Например, когда вы нажимаете "Шаг 1", появляется сообщение alert
с "0".
Ответы
Ответ 1
$("#wizard li").click(function () {
console.log( $(this).index() );
});
Однако вместо того, чтобы прикреплять один обработчик кликов для каждого элемента списка, лучше (с точки зрения производительности) использовать delegate
, который будет выглядеть следующим образом:
$("#wizard").delegate('li', 'click', function () {
console.log( $(this).index() );
});
В jQuery 1.7+ вы должны использовать on
. В приведенном ниже примере привязывается событие к элементу #wizard
, работающему как событие делегата:
$("#wizard").on("click", "li", function() {
console.log( $(this).index() );
});
Ответ 2
что-то вроде:
$("ul#wizard li").click(function () {
var index = $("ul#wizard li").index(this);
alert("index is: " + index)
});
Ответ 3
Взгляните на этот пример.
$("#wizard li").click(function () {
alert($(this).index()); // alert index of li relative to ul parent
});
Ответ 4
Делегировать и жить просты в использовании, но если у вас больше не будет li: s добавлено динамически, вы можете использовать eventagalation с нормальным bind/click. При использовании этого метода должно быть некоторое усиление производительности, поскольку DOM не нужно отслеживать для новых совпадающих элементов. У меня нет фактических чисел, но это имеет смысл:)
$("#wizard").click(function (e) {
var source = $(e.target);
if(source.is("li")){
// alert index of li relative to ul parent
alert(source.index());
}
});
Вы можете проверить его на jsFiddle: http://jsfiddle.net/jimmysv/4Sfdh/1/
Ответ 5
Еще один способ
$("#wizard li").click(function ()
{
$($(this),'#wizard"').index();
});
Демо https://jsfiddle.net/m9xge3f5/
Ответ 6
Для этого не требуется большая библиотека, такая как jQuery, если вы этого не хотите. Для достижения этой цели со встроенной манипуляции DOM, получить коллекцию li
братьев и сестер в массиве, и по щелчку, проверка функции indexOf
на Clicked элемент в этом массиве.
const lis = [...document.querySelectorAll('#wizard > li')];
lis.forEach((li) => {
li.addEventListener('click', () => {
const index = lis.indexOf(li);
console.log(index);
});
});
<ul id="wizard">
<li>Step 1</li>
<li>Step 2</li>
</ul>