Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.08.2019, 14:51
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

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>
Ответить с цитированием
  #2 (permalink)  
Старый 04.08.2019, 15:10
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

скажу пару слов а вы сами догадаетесь, нодлист это не массив.
Ответить с цитированием
  #3 (permalink)  
Старый 04.08.2019, 15:18
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Все забыли, хотя на эту тему мы с вами уже говорили
напишите в консоле NodeList.prototype. и посмотрите какие методы и свойства доступны, есть ли там findIndex ?
Ответить с цитированием
  #4 (permalink)  
Старый 04.08.2019, 15:35
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

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>

теперь работает.
Ответить с цитированием
  #5 (permalink)  
Старый 04.08.2019, 16:52
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

есть ещё пару вариантов: унаследовать метод или сделать массив из нодлиста.
Ответить с цитированием
  #6 (permalink)  
Старый 04.08.2019, 17:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,136

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>
Ответить с цитированием
  #7 (permalink)  
Старый 04.08.2019, 17:20
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Сообщение от j0hnik Посмотреть сообщение
есть ещё пару вариантов: унаследовать метод или сделать массив из нодлиста.
Ага, исправил так:
<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, перебирая варианты один глупее другого.
Ответить с цитированием
  #8 (permalink)  
Старый 04.08.2019, 17:49
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Сообщение от рони
let listItem = [...this.children];
        let index = listItem.indexOf(el);
Спасибо!
А я в самом начале делал вообще так:
let listItems = el.parentNode.childNodes

и у меня в массиве помимо моих лишек оказались ещё и переносы с прочим мусором...

Исправил у себя на ваш вариант - работает, понятен и смотрится красивее чем моё findIndex.
Ответить с цитированием
  #9 (permalink)  
Старый 05.08.2019, 02:49
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от рони
        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>
Ответить с цитированием
  #10 (permalink)  
Старый 05.08.2019, 07:14
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Malleys,
Помнится, ты был противником такого способа )
https://javascript.ru/forum/misc/758...tml#post498471
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно найти порядковый номер элемента с заданным id RioEiner jQuery 3 16.11.2015 23:50
Как найти текст последнего элемента, если id немного отличаются. mastersss Элементы интерфейса 15 01.03.2015 13:49
Помогу получить индекс элемента массива visman Javascript под браузер 7 03.05.2014 03:23
Как определить индекс элемента jeysmook jQuery 2 09.11.2012 21:03
Как найти индекс по элементу в двумерном массиве? bayah Общие вопросы Javascript 5 22.04.2010 16:26