Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Контекст this для событий (https://javascript.ru/forum/events/50869-kontekst-dlya-sobytijj.html)

Boolean_Type 15.10.2014 02:03

Контекст this для событий
 
Привет всем! Давненько влотную не работал с JS, посему забыл мелочи. Необходимо вспомнить следующее:
<li id='l' onclick='f(event);'>11111111</li>
<script type="text/javascript">
function f(e){
    alert(e.target); //всё нормально, здесь li
    alert(this); //почему в контексте this - Window? Ф-ция же срабатывает лишь при наведении на li, => и this должен указывать на этот эл-т...
}

document.getElementById('l').onmouseover = function (e) {
	console.log(this) //вот здесь всё нормально, передаётся li. Но ведь в обоих случаях ф-ция является обработчиком СОБЫТИЯ на КОНКРЕТНОМ элементе, в чём же тут дело?
}
</script>

ksa 15.10.2014 08:09

Цитата:

Сообщение от Boolean_Type
Но ведь в обоих случаях ф-ция является обработчиком СОБЫТИЯ на КОНКРЕТНОМ элементе, в чём же тут дело?

В разнице атрибутов и свойств...

danik.js 15.10.2014 08:38

Цитата:

Сообщение от ksa
В разнице атрибутов и свойств...

Неправда.

Boolean_Type, ты неправильно сравнение делаешь.

<button onclick='alert(this);'>this в атрибуте (кликни)</button>
<button id="button2">this в свойстве (кликни)</button>
<script>
    button2.onclick = function() {
        alert(this);
    };
</script>

danik.js 15.10.2014 08:41

А теперь добавляем вызов функции:


<button onclick='f(event)'>this в атрибуте (кликни)</button>
<button id="button2">this в свойстве (кликни)</button>
<script>
    function f(event) {
        alert(this);
    }
    button2.onclick = function(event) {
        f(event);
    };
</script>


Boolean_Type, осознал косяк?

danik.js 15.10.2014 08:44

Указываем контекст при вызове функции:

<button onclick='f.call(this, event)'>this в атрибуте (кликни)</button>
<script>
    function f(event) {
        alert(this);
    }
</script>

kostyanet 15.10.2014 12:59

Цитата:

Сообщение от Boolean_Type
Ф-ция же срабатывает лишь при наведении на li, => и this должен указывать на этот эл-т...

Ответ надо искать в спецификациях. Нафиг, просто знайте что инлайновые вызовы требуют явного присвоения аргументов (this,event). Так всегда было, лежи оно так вовек.

danik.js 15.10.2014 13:14

Цитата:

Сообщение от kostyanet
просто знайте что инлайновые вызовы требуют явного присвоения аргументов

А не-инлайновые что-ли не требуют?

danik.js 15.10.2014 13:15

Цитата:

Сообщение от kostyanet
Ответ надо искать в спецификациях

Ответ надо искать в ECMA, он не имеет вообще никакого отношения к HTML-атрибутам, и вообще HTML

kostyanet 15.10.2014 13:15

Все равно не понял почему, видимо так было задумано в эпоху зарождения браузеров со скриптами http://www.quirksmode.org/js/events_early.html

kostyanet 15.10.2014 13:16

Цитата:

Сообщение от danik.js
А не-инлайновые что-ли не требуют?

Не требуют. Браза без базаров подгоняет this.


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