Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 15.10.2014, 21:17
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Инлайновая регистрация события, я почему-то уверен, это тупой eval(). Если this не прописана, ей и взяться неоткуда, а в скрипте берется от = идентификатор.
Ответить с цитированием
  #42 (permalink)  
Старый 16.10.2014, 00:34
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от kostyanet Посмотреть сообщение
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);
}
//и никакой лев. ф-ции
Ответить с цитированием
  #43 (permalink)  
Старый 16.10.2014, 05:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 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) {}
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #44 (permalink)  
Старый 17.10.2014, 19:29
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от danik.js Посмотреть сообщение
Неправда. Ты в alert все-таки передал this.
Я имею ввиду, не надо this в кач-ве аргумента ф-ции-обработчика (и, как следствие, - прописывать this как параметр). Собс-но, в этом и был мой вопрос. В инлайн-случае надо, в неинлайн - нет.
Ответить с цитированием
  #45 (permalink)  
Старый 17.10.2014, 19:35
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

И там и там надо. Просто в инлайн много кода не напишешь - некрасиво. А в неинлайн этой проблемы нет. Вот и все. Все дело в КРАСОТЕ, ведь так?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #46 (permalink)  
Старый 17.10.2014, 19:37
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

elem1.onclick = handler;
elem2.onclick = handler;
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #47 (permalink)  
Старый 18.10.2014, 01:04
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

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

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

Сообщение от danik.js Посмотреть сообщение
Ну и еще дело в том, что нельзя назначить одинаковые инлайн-обработчики для нескольких элементов.
Накидал такое, вышло))
<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>

Или ты не то имел ввиду?
Ответить с цитированием
  #49 (permalink)  
Старый 18.10.2014, 08:35
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Boolean_Type
Где ты в коде ниже видишь передачу в ОБРАБОТЧИК каких-либо аргументов?
А тут где ты видишь передачу?
<button onclick=" alert(this) ">Button</button>


Сообщение от Boolean_Type
Накидал такое, вышло))
У каждой кнопки будут разные обработчики. Но делать они будут одно и то же - вызывать функцию f. То, что общий код можно вынести в функцию - не удивительно Но обработчики то будут плодиться ) Допустим если у тебя тысячи элементов на страницах - это будет проблемой. А с неинлайн проблемой не будет - обработчик будет только один, и тысяча ссылок на него.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #50 (permalink)  
Старый 18.10.2014, 20:51
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите в замыкании универсальной функции для обработчиков событий addEventListener iis_ Events/DOM/Window 6 30.01.2014 01:09
Посоветуйте как улучшить код для работы с history api [ jquery + js + history api ] Geo Ваши сайты и скрипты 0 12.01.2014 00:41
Программный вызов событий для конкретных элементов iNfantry jQuery 9 31.01.2012 15:21
HTA-приложение для радио Pianorama Magneto Ваши сайты и скрипты 42 22.01.2012 08:34
trigger() работает только для событий jQuery? slavaiv jQuery 4 20.11.2011 14:41