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

danik.js 15.10.2014 13:24

Цитата:

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

То есть в примере поста #4 у тебя при клике на вторую кнопку показывает [object HTMLButtonElement] ?

Boolean_Type 15.10.2014 14:30

Цитата:

Сообщение от danik.js (Сообщение 335625)
А теперь добавляем вызов функции:


<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, осознал косяк?

По-моему, это то же, о чём писал я в вопросе, только чуть более наворочено) И так, и так в this - Window.

Boolean_Type 15.10.2014 14:35

Цитата:

Сообщение от danik.js (Сообщение 335664)
То есть в примере поста #4 у тебя при клике на вторую кнопку показывает [object HTMLButtonElement] ?

Неинлайновые передают this.
function f(event) {
        alert(this);
    }
    button2.onclick = function(event) {
        alert(this); //здесь покажет, kostyanet прав
        f(event); //а здесь нет, т.к. вызов не в контексте DOM-элемента
      
};

Boolean_Type 15.10.2014 14:47

Спасибо всем, кто отписался, дали ответ на сайте-учебнике:
Атрибут onclick создает в качестве обработчика анонимную функцию, а код который вставлен в значение атрибута выполняется в этой функции. Т.е.
onclick="f(event);"
эквивалентно

el.onclick = function() {
f(event);
}

Т.к. функция f вызывается просто так, а не в контексте чего-то, то в качестве this в ней будет глобальный объект.
Похоже, что так, как бы глупо это ни звучало. Хотя всё равно это неприятный момент с учётом того, что ф-ция срабатывает при определённом действии польз-ля, а не просто так.

Цитата:

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

Да, спасибо. Похоже, остаётся лишь смириться)

danik.js 15.10.2014 15:01

Ну вы укурки ))) Два укурка ))
Цитата:

Сообщение от Boolean_Type
onclick="f(event);"
эквивалентно
el.onclick = function() {
f(event);
}

А теперь выдохни и посмотри на код из http://javascript.ru/forum/events/50...tml#post335625 .
Ниче не напоминает ? :D
Цитата:

Сообщение от Boolean_Type
Да, спасибо. Похоже, остаётся лишь смириться)

Или перестать укуриваться ) Ибо нет никакой разницы инлайн-не инлайн. Повторяю для накуренных: JavaScript не завязан на HTML. Нет никакой разницы между функцией созданной из атрибута, и функцией, присвоенной в js коде. Функция - она и в африке функция. Запусти ее в африке - ничего не изменится.

Цитата:

Сообщение от Boolean_Type
onclick создает в качестве обработчика анонимную функцию

И еще пачку блоков with{}

terminator-101 15.10.2014 15:07

Цитата:

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

Функция не является ничем кроме функции. Это ты, почему-то называешь ее обработчиком чего-то там. А вопрос в чем, вообще непонятно. Вызов функции в топлевеле -- это всегда вызов в контексте window, в браузере. И ты, значит, спрашиваешь, почему this связывается с тем объектом, с которым должна связываться, а не с тем, с которым мне хотелось бы чтобы он связывался, в этом чтоли вопрос? С таким же успехом можно спросить, почему трава зеленого цвета, ведь мне хотелось бы, чтобы она была синяя.

terminator-101 15.10.2014 15:17

Цитата:

Сообщение от Boolean_Type
Похоже, что так, как бы глупо это ни звучало. Хотя всё равно это неприятный момент с учётом того

Все правильно, а глупо это звучит только для поциэнтов с жабой головного мозга в терминальной стадии. В JS Ъ-ООП в стиле смолтока, это куда более сильная модель чем статик-блядство в стиле лексических замыканий.

Boolean_Type 15.10.2014 17:12

Цитата:

Сообщение от terminator-101 (Сообщение 335690)
Функция не является ничем кроме функции.

Да что Вы говорите.
http://learn.javascript.ru/introduct...событий

Boolean_Type 15.10.2014 17:27

Цитата:

Сообщение от danik.js (Сообщение 335689)
Ну вы укурки ))) Два укурка ))

А теперь выдохни и посмотри на код из http://javascript.ru/forum/events/50...tml#post335625 .
Ниче не напоминает ? :D
Или перестать укуриваться ) Ибо нет никакой разницы инлайн-не инлайн. Повторяю для накуренных: JavaScript не завязан на HTML. Нет никакой разницы между функцией созданной из атрибута, и функцией, присвоенной в js коде.

Причём тут укуриваться, чё за манера? :nono:
Вот именно, напоминает, ибо ты написал то же самое, где вызов идёт не в контексте элемента, а контексте Window. Об этом и писал мне отвечающий.
Цитата:

Сообщение от danik.js (Сообщение 335689)
нет никакой разницы инлайн-не инлайн.

При инлайн надо явно передавать this в вызове!) Ты же сам видишь.
<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:
Спасибо всем отписавшимся, вот бы на сайтах, пхп посвящённых, так же оперативно и с примерами отвечали...

danik.js 15.10.2014 17:37

Цитата:

Сообщение от Boolean_Type
При инлайн надо явно передавать this в вызове!) Ты же сам видишь.

Да блядь жеж! А при не-инлайн не надо чтоли? Ты троллишь чтоли? Покажи как ты в неинлайн обработчике вызываешь функцию f и не передаешь this, и в функции f this указывает не на window. Жду


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