Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Про обработчики событий (https://javascript.ru/forum/misc/63538-pro-obrabotchiki-sobytijj.html)

pomidor_makaronus 14.06.2016 01:25

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

Кто может пояснить такое поведение обработчиков:
Данный пример работает если обработчик вешать на 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 );

не работает .

Decode 14.06.2016 02:23

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

И цикл тут не нужен, можно делегированием обойтись.

pureJS 14.06.2016 11:05

Цитата:

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


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

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


Часовой пояс GMT +3, время: 13:39.