Контекст 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> |
Цитата:
|
Цитата:
Boolean_Type, ты неправильно сравнение делаешь. <button onclick='alert(this);'>this в атрибуте (кликни)</button> <button id="button2">this в свойстве (кликни)</button> <script> button2.onclick = function() { alert(this); }; </script> |
А теперь добавляем вызов функции:
<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, осознал косяк? |
Указываем контекст при вызове функции:
<button onclick='f.call(this, event)'>this в атрибуте (кликни)</button> <script> function f(event) { alert(this); } </script> |
Цитата:
|
Цитата:
|
Цитата:
|
Все равно не понял почему, видимо так было задумано в эпоху зарождения браузеров со скриптами http://www.quirksmode.org/js/events_early.html
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
function f(event) { alert(this); } button2.onclick = function(event) { alert(this); //здесь покажет, kostyanet прав f(event); //а здесь нет, т.к. вызов не в контексте DOM-элемента }; |
Спасибо всем, кто отписался, дали ответ на сайте-учебнике:
Атрибут onclick создает в качестве обработчика анонимную функцию, а код который вставлен в значение атрибута выполняется в этой функции. Т.е. onclick="f(event);" эквивалентно el.onclick = function() { f(event); } Т.к. функция f вызывается просто так, а не в контексте чего-то, то в качестве this в ней будет глобальный объект. Похоже, что так, как бы глупо это ни звучало. Хотя всё равно это неприятный момент с учётом того, что ф-ция срабатывает при определённом действии польз-ля, а не просто так. Цитата:
|
Ну вы укурки ))) Два укурка ))
Цитата:
Ниче не напоминает ? :D Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
http://learn.javascript.ru/introduct...событий |
Цитата:
Вот именно, напоминает, ибо ты написал то же самое, где вызов идёт не в контексте элемента, а контексте Window. Об этом и писал мне отвечающий. Цитата:
<button id="l" onclick="f();">инлайн-метод, не передаю this</button> <button onclick="f(this);">инлайн-метод, передаю this</button> <script type="text/javascript"> function f(obj_this){ alert(this); alert(obj_this); } //здесь в вызове не передаётся this, но в ф-ции обработчики контекст устанавливается правильно, метод не инлайновый document.getElementById('l').onmouseover = function (e) { console.log(this) } </script> Накурился я или нет, а пример налицо. При инлайн-вызове надо просто this передавать, я запомню. И видна эта this будет лишь ф-ции, в кот-ую передаётся, а вот это говнище работать нормально не будет: button2.onclick = function(event) { f(event); }; т.к. внутри обработчика вызывается левая ф-ция в контексте Window. Вот это будет: button2.onclick = function(event) { alert(this); //требуем this прямо в обработчике, а не посредством левой ф-ции }; danik.js, меня отпустило :thanks: Спасибо всем отписавшимся, вот бы на сайтах, пхп посвящённых, так же оперативно и с примерами отвечали... |
Цитата:
|
Вот тебе функция f:
function f(event) { alert(this); } |
Цитата:
И в чем тут логика? |
Вот инлайн обработчик. Что блядь в нем не так? Куда там this не показывает?
<button onclick="console.log(this)">Button</button> |
Цитата:
Эй, а кому же я предыдущий пример печатал??? Вот кусок из него: <button id="l">тут НЕ инлайн</button> <script type="text/javascript"> //ещё раз, об этом Костянет писал тоже: здесь в вызове не передаётся this, но в ф-ции обработчики контекст устанавливается правильно, метод не инлайновый document.getElementById('l').onclick = function () { //НИ ХЕРА НЕ ПЕРЕДАЮ alert(this); //ОХРЕНЕТЬ, this - это [object HTMLButtonElement] } </script> |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Онологично как я задаю атрибут onclick с телом функции. |
Покажи, где тут разничия в поведении?
1) <a onclick = " alert(this) "> 2) a.onclick = function() { alert(this) }; |
Цитата:
Вот именно, я не понимал, почему при вызове левой f() контекст не передаётся. Я думал - раз событие, так this во всех ф-циях будет показываться, которые запущены этим событием. Ошибался. |
Цитата:
Ладно, danik.js, ну отстань уже, я разобрался :D |
Корявые шрифты поломали вырванивание. Вот:
|
Цитата:
|
Цитата:
Мы ведь это уже проходили, только вместо some_fucking_func() было f(). У тя провалы в памяти? Так будет разница или нет? |
Цитата:
http://javascript.ru/forum/events/50...tml#post335773 |
Цитата:
Цитата:
Можешь не гадать, я уже пример накидал: http://javascript.ru/forum/events/50...tml#post335625 |
Цитата:
<button onclick='f(event)'>this в атрибуте (кликни)</button> <button id="button2">this в свойстве (кликни)</button> <script> function f(event) { alert(this); } button2.onclick = function(event) { alert(this); //нахер тут было f вызывать? Я уже понял, что там Window) И ты ещё говоришь, что я хитрая жопа?:D }; </script> |
Boolean_Type,
А кто сказал, что там правильно написано? f=function(){alert(this.foo)} el1.onclick=f el2.onhuy=f Здесь f -- обработчик какого события, какого эдемента? |
Цитата:
|
danik.js, нахер вообще что-то вписываете? какие-то ивенты-шмывенты.
смысла дискуссии я не уловил. Если у функции аргументы не обозначены явным образом - значит не обозначены явным образом, а this ну просто обожает появляться неявным образом, собственно как и все прочие переменные дружеского и вражеского окружения. http://learn.javascript.ru/play/eG9lQ |
Часовой пояс GMT +3, время: 02:34. |