Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.10.2014, 02:03
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Контекст 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>
Ответить с цитированием
  #2 (permalink)  
Старый 15.10.2014, 08:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Boolean_Type
Но ведь в обоих случаях ф-ция является обработчиком СОБЫТИЯ на КОНКРЕТНОМ элементе, в чём же тут дело?
В разнице атрибутов и свойств...
Ответить с цитированием
  #3 (permalink)  
Старый 15.10.2014, 08:38
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

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

<button onclick='alert(this);'>this в атрибуте (кликни)</button>
<button id="button2">this в свойстве (кликни)</button>
<script>
    button2.onclick = function() {
        alert(this);
    };
</script>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 15.10.2014, 08:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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


<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, осознал косяк?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 15.10.2014, 08:44
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

<button onclick='f.call(this, event)'>this в атрибуте (кликни)</button>
<script>
    function f(event) {
        alert(this);
    }
</script>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 15.10.2014, 12:59
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Boolean_Type
Ф-ция же срабатывает лишь при наведении на li, => и this должен указывать на этот эл-т...
Ответ надо искать в спецификациях. Нафиг, просто знайте что инлайновые вызовы требуют явного присвоения аргументов (this,event). Так всегда было, лежи оно так вовек.
Ответить с цитированием
  #7 (permalink)  
Старый 15.10.2014, 13:14
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от kostyanet
просто знайте что инлайновые вызовы требуют явного присвоения аргументов
А не-инлайновые что-ли не требуют?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 15.10.2014, 13:15
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от kostyanet
Ответ надо искать в спецификациях
Ответ надо искать в ECMA, он не имеет вообще никакого отношения к HTML-атрибутам, и вообще HTML
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 15.10.2014, 13:15
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Все равно не понял почему, видимо так было задумано в эпоху зарождения браузеров со скриптами http://www.quirksmode.org/js/events_early.html
Ответить с цитированием
  #10 (permalink)  
Старый 15.10.2014, 13:16
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от danik.js
А не-инлайновые что-ли не требуют?
Не требуют. Браза без базаров подгоняет this.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите в замыкании универсальной функции для обработчиков событий 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