Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   назначение события и this внутри него (https://javascript.ru/forum/events/39940-naznachenie-sobytiya-i-vnutri-nego.html)

Василий Б. 17.07.2013 18:46

назначение события и this внутри него
 
объясните поведение, почему в IE this - это window?
нет, я конечно понимаю, что так даже в статье написано на сайте, но почему остальные браузеры this ставят как ссылку на объект, который и породил событие?
кто тут прав?

var click_event = function(e) {
	// В IE this - это window. Не работает в IE!
	alert(this.getAttribute('alt'));

	// А так работает везде
	var event = e || window.event;
	var target = event.target || event.srcElement; 

	alert(target.getAttribute('alt'));
}

if (document.attachEvent) {
	element.attachEvent("onclick", click_event);
} else if (document.addEventListener) {
	element.addEventListener("click", click_event, false);
}

devote 17.07.2013 18:49

if (document.addEventListener) {
    element.addEventListener("click", click_event, false);
} else if (document.attachEvent) {
    element.attachEvent("onclick", function() {
        click_event.call(window.event.srcElement, window.event);
    });
}

Василий Б. 17.07.2013 19:09

прикольный код. но вопрос был в том, какое из проведений в моем коде правильное. мне так, для общего развития.

devote 17.07.2013 19:18

Цитата:

Сообщение от Василий Б.
в моем коде правильное

оба правильные, просто первый исключает старые ИЕ, второй дает возможность их поддерживать.

Василий Б. 17.07.2013 19:34

не понимаю

мне кажется как раз тут IE ведет себя правильно - он ставить this ссылкой на window. в соответствии с этой шпаргалкой.. или я что-то не понимаю?

dmitriymar 17.07.2013 19:46

Цитата:

Сообщение от Василий Б. (Сообщение 262841)
не понимаю

мне кажется как раз тут IE ведет себя правильно - он ставить this ссылкой на window. в соответствии с этой шпаргалкой.. или я что-то не понимаю?

addEventListener метод объектов HTMLDocument и HTMLElement

Василий Б. 18.07.2013 11:25

я понимаю. почему в функции, которая вешается на клик, в FF this устанавливается на объект, на котором произошло событие, а в IE - объект window??

dmitriymar 18.07.2013 22:42

Цитата:

Сообщение от Василий Б.
я понимаю. почему в функции, которая вешается на клик, в FF this устанавливается на объект, на котором произошло событие, а в IE - объект window??

потому что
Цитата:

Сообщение от dmitriymar
addEventListener метод объектов HTMLDocument и HTMLElement

а в ие старых свойство event window - делай выводы почему так всё

danik.js 18.07.2013 22:55

Цитата:

Сообщение от Василий Б.
я понимаю. почему в функции, которая вешается на клик, в FF this устанавливается на объект, на котором произошло событие, а в IE - объект window??

Потому что разработчики IE так захотели. А addEventListener придумали позже (основываясь на модели IE), но при этом решили что удобней будет если this будет указывать на объект, чей обработчик вызван.

Василий Б. 19.07.2013 12:35

Цитата:

Сообщение от dmitriymar (Сообщение 263021)
потому что

а в ие старых свойство event window - делай выводы почему так всё

проверил в 10 версии - там тоже window

danik.js 19.07.2013 12:42

Цитата:

Сообщение от Василий Б.
проверил в 10 версии - там тоже window

Ясное дело. В этом то и смысл поддержки старого API )))

devote 19.07.2013 12:45

Цитата:

Сообщение от Василий Б.
проверил в 10 версии - там тоже window

вы как проверяете? своим кодом что указали выше? у вас в коде приоритеты не те, вы сначала проверяете существование метода attachEvent, а это не правильно, так как нужно проверять существование нового функционала в браузере, а уж затем использовать устаревший.

Так же отмечу, ИЕ10 поддерживает attachEvent лишь для совместимости старых сайтов, но рекомендуется использовать новые возможности addEventListener

Я писал пост выше. у меня стоят иные приоритеты в коде.


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