Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.06.2016, 01:25
Интересующийся
Отправить личное сообщение для pomidor_makaronus Посмотреть профиль Найти все сообщения от pomidor_makaronus
 
Регистрация: 19.04.2016
Сообщений: 18

Про обработчики событий
Всем привет!

Кто может пояснить такое поведение обработчиков:
Данный пример работает если обработчик вешать на this...
Если же this заменить на bod[i] то не работает, хотя в bod[i] по идее нормальный елемент и если вывести его в консоль то мы увидим, что у него присутствует свойство className...

<style>
.mini {
  width: 200px;
  height: 30px;
}

.maxi {
  width: 600px;
  height: 300px;
}
</style>
        <div class="zid">
		<div  class="mini"></div>
		<div  class="mini"></div>
		<div  class="mini"></div>
	</div>

var bod = document.querySelectorAll(".mini");

for (var i = 0 ; i < bod.length; i++){
	bod[i].addEventListener("mouseover", function() {
		this.className = "maxi";
	}, false );

	bod[i].addEventListener("mouseout", function() {
		this.className = "mini";
	}, false );
	
}

т.е.
bod[i].addEventListener("mouseover", function() {
		bod[i].className = "maxi";
	}, false );

не работает .

Последний раз редактировалось pomidor_makaronus, 14.06.2016 в 01:50.
Ответить с цитированием
  #2 (permalink)  
Старый 14.06.2016, 02:23
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

pomidor_makaronus, когда цикл закончится i будет равно 3. А индекс элементов начинается с 0. Соответственно bod[3] - undefined.

И цикл тут не нужен, можно делегированием обойтись.
Ответить с цитированием
  #3 (permalink)  
Старый 14.06.2016, 11:05
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от pomidor_makaronus Посмотреть сообщение
т.е.
bod[i].addEventListener("mouseover", function() {
		bod[i].className = "maxi";
	}, false );
не работает .

pomidor_makaronus, когда ты присваиваешь обработчику "mouseover", то событие происходит не при присваивании, а позже и поэтому функция не знает ни объект "bod" ни переменную "i". Они лежат вне области видимости этой функции. При срабатывании события обработчик ссылается на объект, на котором он сработал и поэтому тут именно this надо применять.

Вот, в учебнике, всё подробно об этом:
Замыкания, область видимости
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где лучше вешать обработчики событий? BETEPAH Events/DOM/Window 5 26.12.2013 21:40
Можно ли вынести обработчики событий в отделные функции Evgeny_Dedov jQuery 1 06.10.2013 17:53
Drag'n'drop обработчики событий zaytsewa Общие вопросы Javascript 7 27.06.2011 14:32
DOM и обработчики событий radmir4eg Events/DOM/Window 7 31.03.2011 11:52
Скопировать обработчики событий с одного элемента на другой. Jurasmi Events/DOM/Window 3 10.11.2010 19:03