Zoylander
@Zoylander

Как обратиться ко всем элементам через querySelectorAll?

Добрый день.

Не могу победить querySelectorAll.
Идея такая - есть блоки, при наведении на них должен выхватываться скрытый в них элемент и привязываться к движению курсора. С первым найденным элементом срабатывает, с остальными нет. Пробовал использовать addEventListenerAll с перебором, но не выходит.

Вот тут мой пример на codepen

<div class="block">
  <img class="block2">
</div>
<br>
<div class="block">
  <img class="block2">
</div>


.block2 {
     display: none;
     background-color: black;
     margin-right:10px;
     width: 100px;
     height: 50px;
     position: absolute;
}

.block {
     background-color: red;
     width: 1000px;
     height: 100px;
}

.block:hover .block2 {
     display: block;
}


document.querySelector('.block').addEventListener('mousemove', function(e) {
  Object.assign(document.querySelector('img').style, {
    left: `${e.layerX+30}px`,
    top: `${e.layerY+30}px`,
  });
})
  • Вопрос задан
  • 370 просмотров
Решения вопроса 2
@goshaLoonny
Можно реализовать циклом, но не рекомендую так как если DOM дерево обновится (например, вы добавите новый элемент) вам придется искать его и ручками добавлять ему слушатель. А так как вы добавляли слушатели циклом то соответственно функция обработчик вероятнее всего анонимная. По этому придется еще и функцию выносить в необходимую область видимости.
Лучше вешать слушатель на родителя и проверять таргет.
Например, у вас есть много элементов с классом block, значит вешать слушатель стоит на их родителя, предположим что он имеет класс wrapper
<div class="wrapper">
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
</div>

document.querySelectorAll('.wrapper').addEventListener('mousemove', e => {
  if (!e.target.classList.contains('block')) return; // Если элемент который вызвал это событие не имеет класса block, то отправляем return, тем самым код ниже выполнятся не будет

  // тут писать код который будет выполнятся если элемент который вызвал это событие имеет класса block

})
Ответ написан
Dr_Elvis
@Dr_Elvis
В гугле забанен
Может дело в том что addEventListenerAll не существует?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы