Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2018, 23:02
Новичок на форуме
Отправить личное сообщение для alexwhite Посмотреть профиль Найти все сообщения от alexwhite
 
Регистрация: 15.05.2018
Сообщений: 3

Не работает removeEventListener
Не могу понять в чем ошибка.При ресайзе экрана от большего к меньшему, при mouseenter на li, начиная с 700px должен удаляться обработчик, но он не удаляется. Все равно лишка красится. Буду признателен за помощь

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.red {
color: red;
}
li {
border: 1px solid black;
width: 200px;
}
</style>
</head>
<body>
<ul>
<li>
something
</li>
</ul>
<script>
let li = document.querySelector('li')
function fn() {
function addClass() {
li.classList.add('red')
}
if(window.innerWidth > 700) {
li.addEventListener('mouseenter', addClass)
}else {
li.removeEventListener('mouseenter', addClass)
}
}
fn()
window.addEventListener('resize', function () {
fn()
})
</script>
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2018, 23:20
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,252

Во-первых и главных: при каждом ресайзе локальная функция addClass создаётся заново во время вызова fn. Соответственно та addClass которую пытается убрать removeEventListener при ширине меньше 700 - это совсем не та addClass что была установлена до этого, а совсем новая, только что созданная. Следовало бы вынести addClass за пределы fn.
Во-вторых: во время ресайза обработчик вызывается несколько раз и, хотя одна функция и не может быть повешена на одно событие дважды - всё равно получается весьма некрасиво.
В-третьих: логичнее и надёжнее было бы просто один раз повесить addClass на mouseenter и уже внутри addClass проверять размеры.
__________________
29375, 35

Последний раз редактировалось Aetae, 15.05.2018 в 23:23.
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2018, 23:28
Новичок на форуме
Отправить личное сообщение для alexwhite Посмотреть профиль Найти все сообщения от alexwhite
 
Регистрация: 15.05.2018
Сообщений: 3

Спасибо за совет! Буду разбираться.
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2018, 23:35
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 2,967

alexwhite,

let li = document.querySelector('li');

function addClass() {
	if(window.innerWidth > 700) li.classList.add('red');
}

li.addEventListener('mouseenter', addClass);
Ответить с цитированием
  #5 (permalink)  
Старый 15.05.2018, 23:40
Новичок на форуме
Отправить личное сообщение для alexwhite Посмотреть профиль Найти все сообщения от alexwhite
 
Регистрация: 15.05.2018
Сообщений: 3

вау, j0hnik. Большое спасибо! Заработало как часики.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS: работает на сервере, не работает из папки -majestic- Общие вопросы Javascript 2 02.08.2012 13:41
Не работает push! Динамическая вставка TSEH25 ExtJS 5 03.07.2012 12:00
jQyery функция странно работает! Midel Общие вопросы Javascript 4 08.04.2012 12:40
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 14:41
Safari + ajax некорректно работает, а в других работает demi AJAX и COMET 35 15.07.2009 13:11