Просмотр полной версии : findIndex - найти индекс элемента
MC-XOBAHCK
04.08.2019, 14:51
Не пойму какой должен быть синтаксис для метода findIndex.
Нужно при клике на пункт определить его индекс:
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
<script>
function navigation(e) {
let el = e.target;
let listItem = el.parentNode.querySelectorAll('li');
let index = listItem.findIndex(item => item == el); // ?????
console.log(index);
}
document.querySelector('ul').addEventListener('cli ck', navigation);
</script>
скажу пару слов а вы сами догадаетесь, нодлист это не массив.
Все забыли, хотя на эту тему мы с вами уже говорили
напишите в консоле NodeList.prototype. и посмотрите какие методы и свойства доступны, есть ли там findIndex ?
MC-XOBAHCK
04.08.2019, 15:35
j0hnik,
Спасибо вам за науку. Действительно у меня не массив.
Исправил так:
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
<script>
function navigation(e) {
let el = e.target;
let listItem = el.parentNode.querySelectorAll('li');
let index;
listItem.forEach((item, i) => item == el ? index = i : 0);
console.log(index);
}
document.querySelector('ul').addEventListener('cli ck', navigation);
</script>
теперь работает.
есть ещё пару вариантов: унаследовать метод или сделать массив из нодлиста.
MC-XOBAHCK,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</head>
<body>
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
<script>
function navigation(e) {
let el = e.target;
let listItem = [...this.children];
let index = listItem.indexOf(el);
console.log(index);
}
document.querySelector('ul').addEventListener('cli ck', navigation);
</script>
</body>
</html>
MC-XOBAHCK
04.08.2019, 17:20
есть ещё пару вариантов: унаследовать метод или сделать массив из нодлиста.
Ага, исправил так:
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
<script>
function navigation(e) {
let el = e.target;
let listItems = el.parentNode.querySelectorAll('li');
let index = [...listItems].findIndex(item => item == el);
console.log(index);
}
document.querySelector('ul').addEventListener('cli ck', navigation);
</script>
оказывается я с самого начала правильно findIndex применял, только запарка получилась с типом данным. А я от отчаянья чего только не пихал в findIndex, перебирая варианты один глупее другого.
MC-XOBAHCK
04.08.2019, 17:49
let listItem = [...this.children];
let index = listItem.indexOf(el);
Спасибо!
А я в самом начале делал вообще так:
let listItems = el.parentNode.childNodes
и у меня в массиве помимо моих лишек оказались ещё и переносы с прочим мусором...
Исправил у себя на ваш вариант - работает, понятен и смотрится красивее чем моё findIndex.
let listItem = [...this.children];
let index = listItem.indexOf(el);
indexOf, как и многие другие методы массива, является обобщённым методом, this в определении не обязательно должен указывать на представителя типа Array. А это значит, что его можно использовать и с экземпляром NodeList, который не нужно приводить к массиву.
<ul>
<li><button>Пункт 1</button></li>
<li><button>Пункт 2</button></li>
<li><button>Пункт 3</button></li>
</ul>
<script>
function navigation(e) {
const el = e.target;
const index = Array.prototype.indexOf.call(this.children, el.closest("li"));
console.log(index);
}
document.querySelector("ul").addEventListener("click", navigation);
</script>
Alexandroppolus
05.08.2019, 07:14
Malleys,
Помнится, ты был противником такого способа )
https://javascript.ru/forum/misc/75871-poluchit-koordinaty-yachejjki-iz-table.html#post498471
Помнится, ты был противником такого способа )
хотя этот вариант весьма неплох
Помнится, ты был противником такого способа ) В моём примере не используется экземпляр типа Array. Почему вы решили, что способ, указанный в приведённой вами теме, со временем становится эффективным с моей точки зрения? Способ перечисления объектов, который показывает в примере Nexus, указанный в приведённой вами теме, является неэффективным.
Способ перечисления объектов, который показывает в примере Nexus, указанный в приведённой вами теме, является неэффективным.
это еще почему? Один циклический метод против двух.
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot