Почему JS не находит нужный элемент?
let currentLink = document.getElementsByClassName('.open_link'), infoBlock = document.getElementsByClassName('.info_block'); for (var i = 0; i < infoBlock.length; i++); for (var i = 0; i < currentLink.length; i++); currentLink.onmouseover = function openInfoBlock() { let currentTextBlock = currentLink[i].parentNode; if (currentTextBlock.contains(infoBlock[i])) { let currentInfoBlock = infoBlock[i]; if (currentInfoBlock.style.display == 'none') { currentInfoBlock.style.display = 'block'; } } } |
let currentLink = document.getElementsByClassName('.open_link'), infoBlock = document.getElementsByClassName('.info_block'); for (var i = 0; i < infoBlock.length; i++); for (var i = 0; i < currentLink.length; i++); currentLink.onmouseover = function openInfoBlock() { let currentTextBlock = currentLink[i].parentNode; if (currentTextBlock.contains(infoBlock[i])) { let currentInfoBlock = infoBlock[i]; if (currentInfoBlock.style.display == 'none') { currentInfoBlock.style.display = 'block'; } } }
<div class="safety-block"> <div class="flex"> <div class="image_box"> <img src="images/smth.png"> </div> <div class="text-part"> <span class="date">Дата</span> <p class="title"><b>Название</b></p> <a href="#" class="open_link">Читать далее >></a> <div id="info_block"> <p>Информация</p> </div> </div> </div> </div> |
<div class="safety-block"> <div class="flex"> <div class="image_box"> <img src="images/smth.png"> </div> <div class="text-part"> <span class="date">Дата</span> <p class="title"><b>Название</b></p> <a href="#" class="open_link">Читать далее >></a> <div id="info_block"> <p>Информация</p> </div> </div> </div> </div>
Нужно, чтобы при наведении на a.open_link дисплей div.info_block, который по умолчанию none, менялся на block. Т.к. JS не особо моя страсть, а уж массивы так тем более, то и код получился посредственным. Попытался сделать следующим образом:
1. Объявление переменных
2. for var для обозначения конкретного элемента из массива нашёл в интернете)) С currentLink работает, а вот с infoBlock не хочет (ну либо я неправильно использую)
3. Если курсор мыши наведён на currentLink, то нужно найти родительский элемент конкретно данной ссылки, и если там есть infoBlock (он как бы есть во везде, но это не суть :)), то infoBlock из этого родительского элемента становится currentInfoBlock.
4. Если у currentInfoBlock дисплей 'none', то нужно поменять на 'block'
Дополнительно:
При такой структуре разметки вам не нужен для этого JS.
Поменяйте id="info_block" на class="info_block" и добавьте css
.info_block { disply: none; } .open_link:hover + .info_block { disply: block } |
.info_block { disply: none; } .open_link:hover + .info_block { disply: block }
Правда, лучше немножечко видоизменить, чтобы наведение было на общего родителя.
- Спасибо, помогло! А если :hover условно надо будет поменять на onclick?
- всё, разобрался.
Ответы:
Любой из этих ошибок достаточно для того, чтобы ваш код не работал так, как вы хотите:
1. при запросе getElementsByClassName не нужна точка перед именем класса, как archelon уже сказал. В результате элементы не найдены.
2. блока с классом info_block у вас в разметке вообще нет. Есть с id=info_block, и его можно получить при помощи getElementById() или querySelector('#info_block')
3. феерическая трешанина при использовании for. Похоже, вы совсем не понимаете как его применять и не знаете даже зачем.
4. currentLink.onmouseover не сработает, т.ак как там пустая коллекция, из-за лишней точки в п.1
Даже если б была не пустая, пользы никакой не будет, т.к. нужно вешать обработчик на конкретные элементы, а не на коллекцию.
5. currentLink[i].parentNode - всегда будет ссылаться на последний найденный элемент, т.к. цикл for уже отработал. Но в вашем случае не ссылается никуда, т.к. элементы не найдены из-за лишней точки в п1.
6. currentInfoBlock = infoBlock[i] то-же самое, элементы info_block не найдены, и индекс i указывает на последний линк.
7. Если предположить, что приведенный фрагмент разметки у вас повторяется сколько-то раз на странице, тогда грубая ошибка - несколько элементов с одинаковым id.
- феерическая трешатина))0)
Не нужна точка перед названием класса.
Правильно:
document.getElementsByClassName('open_link')
Или так:
document.querySelectorAll('.open_link')
- Спасибо! Пытался уже через querySelector, забыл убрать. Но всё равно не помогло)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема с тем, что JavaScript не может найти нужный элемент на странице, может возникать по нескольким причинам. Ниже представлен список возможных причин и способы их решения:
1. Некорректный селектор: Проверьте, что вы используете правильный селектор для поиска элемента. Например, если вы используете getElementById, убедитесь, что ID элемента указан правильно.
2. Момент выполнения скрипта: Если ваш скрипт выполняется до того, как элемент появляется на странице (например, если скрипт находится в шапке страницы), то JavaScript не сможет найти элемент. Решение - переместить скрипт в конец тела страницы или использовать событие загрузки страницы.
3. Ошибка в коде: Проверьте ваш JavaScript код на наличие ошибок, которые могут привести к тому, что элемент не будет найден. Используйте отладчик браузера для выявления проблем.
4. Асинхронная загрузка: Если элемент добавляется на страницу динамически (например, с помощью AJAX запроса), убедитесь, что ваш JavaScript код выполняется после добавления элемента.
Пример:
document.addEventListener('DOMContentLoaded', function() { var element = document.getElementById('myElement'); if(element) { // Действия с найденным элементом } else { console.error('Элемент не найден'); } });
Следуя этим рекомендациям, вы сможете успешно решить проблему с тем, что JavaScript не находит нужный элемент на странице.