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

kostyanet 15.10.2014 21:17

Инлайновая регистрация события, я почему-то уверен, это тупой eval(). Если this не прописана, ей и взяться неоткуда, а в скрипте берется от = идентификатор.

Boolean_Type 16.10.2014 00:34

Цитата:

Сообщение от kostyanet (Сообщение 335827)
danik.js, нахер вообще что-то вписываете? какие-то ивенты-шмывенты.

смысла дискуссии я не уловил. Если у функции аргументы не обозначены явным образом - значит не обозначены явным образом, а this ну просто обожает появляться неявным образом, собственно как и все прочие переменные дружеского и вражеского окружения.

http://learn.javascript.ru/play/eG9lQ

Таки да, получается следующее:
1) если обработчик вызывается инлайново, ему надо передать this, иначе контекст будет window. Я прочёл на сайте следующее: "При создании обработчика браузером по разметке он автоматически создает функцию из его содержимого."
Если написать:
<input type="button" id="button" onclick="f()"/>

авт-ки создастся следующее:
/****что создаётся****/
document.getElementById('button').onclick = function() {
  //здесь this - это button, но к f это не имеет отношения, т.к. это просто вызов левой ф-ции в обработчике
  f();
}
/******/
function f () {
  alert(this); //выдаст окно
}

Если же явно передать this:
<input type="button" id="button" onclick="f(this)"/>

то и вызов будет другим:
/****что создаётся****/
document.getElementById('button').onclick = function() {
  //здесь this - это button, следоват-но, button и передаётся в f
  f(this);
}
/******/
function f (right_this) {
  alert(right_this); //выдаст button
}

Излюбленный пример danik.js показывает то же, явную передачу:
a.onclick = function() { alert(this) };

/****что создаётся****/
a.onclick = function() {
  //здесь this - это button, следоват-но, button и передаётся в alert
  alert(this);
}
/******/


2) если неинлайново, this передавать не надо
<input type="button" id="button">

document.getElementById('button').onclick = function() {
  //здесь this - это button, и никакой обёртки не создаётся
  alert(this);
}
//и никакой лев. ф-ции

danik.js 16.10.2014 05:13

Цитата:

Сообщение от Boolean_Type
если неинлайново, this передавать не надо

Неправда. Ты в alert все-таки передал this.
Цитата:

Сообщение от Boolean_Type
и никакой лев. ф-ции

Ну так и в инлайн никто же не заставляет использовать левую функцию.
Цитата:

Сообщение от Boolean_Type
авт-ки создастся следующее:

Неужели ты это все-таки осознал. Или ты думаешь, я просто так скриншоты делал, где показывал именно аналогичность вариантов?


Итог: никакой разницы между инлайн-не инлайн нету. Они одинаково себя ведут, они одинаковы при исполнении, у них одинаковый this и одинаково себя ведет. Это полные эквиаленты. С той лишь разницей что инлайн окружен блоками with{}, поэтому там можно писать так:

<button title="Тайтл" onclick="alert(title)">Вывод button.title</button>
<button title="Тайтл" onclick="alert(URL)">Вызов document.URL</button>


Еще, если элемент находится в форме, то добавляется with (form) {}

Boolean_Type 17.10.2014 19:29

Цитата:

Сообщение от danik.js (Сообщение 335879)
Неправда. Ты в alert все-таки передал this.

Я имею ввиду, не надо this в кач-ве аргумента ф-ции-обработчика (и, как следствие, - прописывать this как параметр). Собс-но, в этом и был мой вопрос. В инлайн-случае надо, в неинлайн - нет.

danik.js 17.10.2014 19:35

И там и там надо. Просто в инлайн много кода не напишешь - некрасиво. А в неинлайн этой проблемы нет. Вот и все. Все дело в КРАСОТЕ, ведь так?

danik.js 17.10.2014 19:37

Ну и еще дело в том, что нельзя назначить одинаковые инлайн-обработчики для нескольких элементов. А неинлайн можно:
var handler = function(event) {};

elem1.onclick = handler;
elem2.onclick = handler;

Boolean_Type 18.10.2014 01:04

Цитата:

Сообщение от danik.js (Сообщение 336267)
И там и там надо. Просто в инлайн много кода не напишешь - некрасиво. А в неинлайн этой проблемы нет. Вот и все. Все дело в КРАСОТЕ, ведь так?

:-/
Где ты в коде ниже видишь передачу в ОБРАБОТЧИК каких-либо аргументов? alert() - это же не обработчик. Обработчик - её обёртка. И никакой передачи!
<input type="button" id="button">
document.getElementById('button').onclick = function() {
alert(this); //можно тут вообще не писать ничего; факт в том, что this виден без передачи его как арг-та в ф-цию обработчик
}

Boolean_Type 18.10.2014 01:11

Цитата:

Сообщение от danik.js (Сообщение 336268)
Ну и еще дело в том, что нельзя назначить одинаковые инлайн-обработчики для нескольких элементов.

Накидал такое, вышло))
<button id='u' onclick='f(this, 1)'>1</button>
<button id='i' onclick='f(this, 2)'>2</button>
  <script>
    function f (cont, but_num) {
      alert(but_num + ': ' + cont);
    }
  </script>

Или ты не то имел ввиду?

danik.js 18.10.2014 08:35

Цитата:

Сообщение от Boolean_Type
Где ты в коде ниже видишь передачу в ОБРАБОТЧИК каких-либо аргументов?

А тут где ты видишь передачу?
<button onclick=" alert(this) ">Button</button>


Цитата:

Сообщение от Boolean_Type
Накидал такое, вышло))

У каждой кнопки будут разные обработчики. Но делать они будут одно и то же - вызывать функцию f. То, что общий код можно вынести в функцию - не удивительно :) Но обработчики то будут плодиться ) Допустим если у тебя тысячи элементов на страницах - это будет проблемой. А с неинлайн проблемой не будет - обработчик будет только один, и тысяча ссылок на него.

Boolean_Type 18.10.2014 20:51

Цитата:

Сообщение от danik.js (Сообщение 336315)
А тут где ты видишь передачу?
<button onclick=" alert(this) ">Button</button>

Да вот же она)))
" alert(this) "

Цитата:

Сообщение от danik.js (Сообщение 336315)
У каждой кнопки будут разные обработчики. Но делать они будут одно и то же - вызывать функцию f. То, что общий код можно вынести в функцию - не удивительно :) Но обработчики то будут плодиться ) Допустим если у тебя тысячи элементов на страницах - это будет проблемой. А с неинлайн проблемой не будет - обработчик будет только один, и тысяча ссылок на него.

Да, спасибо, теперь понял)


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