Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   findIndex - найти индекс элемента (https://javascript.ru/forum/misc/78162-findindex-najjti-indeks-ehlementa.html)

MC-XOBAHCK 04.08.2019 14:51

findIndex - найти индекс элемента
 
Не пойму какой должен быть синтаксис для метода 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('click', navigation);
</script>

j0hnik 04.08.2019 15:10

скажу пару слов а вы сами догадаетесь, нодлист это не массив.

j0hnik 04.08.2019 15:18

Все забыли, хотя на эту тему мы с вами уже говорили
напишите в консоле 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('click', navigation);
</script>

теперь работает.

j0hnik 04.08.2019 16:52

есть ещё пару вариантов: унаследовать метод или сделать массив из нодлиста.

рони 04.08.2019 17:10

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('click', navigation);
</script>


</body>
</html>

MC-XOBAHCK 04.08.2019 17:20

Цитата:

Сообщение от j0hnik (Сообщение 511207)
есть ещё пару вариантов: унаследовать метод или сделать массив из нодлиста.

Ага, исправил так:
<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('click', 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.

Malleys 05.08.2019 02:49

Цитата:

Сообщение от рони
        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/758...tml#post498471


Часовой пояс GMT +3, время: 15:57.