Javascript.RU

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

Сообщение от kostyanet
Не требуют. Браза без базаров подгоняет this
То есть в примере поста #4 у тебя при клике на вторую кнопку показывает [object HTMLButtonElement] ?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #12 (permalink)  
Старый 15.10.2014, 14:30
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

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


<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.
Ответить с цитированием
  #13 (permalink)  
Старый 15.10.2014, 14:35
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от danik.js Посмотреть сообщение
То есть в примере поста #4 у тебя при клике на вторую кнопку показывает [object HTMLButtonElement] ?
Неинлайновые передают this.
function f(event) {
        alert(this);
    }
    button2.onclick = function(event) {
        alert(this); //здесь покажет, kostyanet прав
        f(event); //а здесь нет, т.к. вызов не в контексте DOM-элемента
      
};
Ответить с цитированием
  #14 (permalink)  
Старый 15.10.2014, 14:47
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

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

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

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

Сообщение от kostyanet Посмотреть сообщение
Ответ надо искать в спецификациях. Нафиг, просто знайте что инлайновые вызовы требуют явного присвоения аргументов (this,event). Так всегда было, лежи оно так вовек.
Да, спасибо. Похоже, остаётся лишь смириться)
Ответить с цитированием
  #15 (permalink)  
Старый 15.10.2014, 15:01
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Ну вы укурки ))) Два укурка ))
Сообщение от Boolean_Type
onclick="f(event);"
эквивалентно
el.onclick = function() {
f(event);
}
А теперь выдохни и посмотри на код из Контекст this для событий .
Ниче не напоминает ?
Сообщение от Boolean_Type
Да, спасибо. Похоже, остаётся лишь смириться)
Или перестать укуриваться ) Ибо нет никакой разницы инлайн-не инлайн. Повторяю для накуренных: JavaScript не завязан на HTML. Нет никакой разницы между функцией созданной из атрибута, и функцией, присвоенной в js коде. Функция - она и в африке функция. Запусти ее в африке - ничего не изменится.

Сообщение от Boolean_Type
onclick создает в качестве обработчика анонимную функцию
И еще пачку блоков with{}
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #16 (permalink)  
Старый 15.10.2014, 15:07
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от Boolean_Type
Но ведь в обоих случаях ф-ция является обработчиком СОБЫТИЯ на КОНКРЕТНОМ элементе, в чём же тут дело?
Функция не является ничем кроме функции. Это ты, почему-то называешь ее обработчиком чего-то там. А вопрос в чем, вообще непонятно. Вызов функции в топлевеле -- это всегда вызов в контексте window, в браузере. И ты, значит, спрашиваешь, почему this связывается с тем объектом, с которым должна связываться, а не с тем, с которым мне хотелось бы чтобы он связывался, в этом чтоли вопрос? С таким же успехом можно спросить, почему трава зеленого цвета, ведь мне хотелось бы, чтобы она была синяя.
Ответить с цитированием
  #17 (permalink)  
Старый 15.10.2014, 15:17
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

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

Последний раз редактировалось terminator-101, 15.10.2014 в 15:21.
Ответить с цитированием
  #18 (permalink)  
Старый 15.10.2014, 17:12
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от terminator-101 Посмотреть сообщение
Функция не является ничем кроме функции.
Да что Вы говорите.
http://learn.javascript.ru/introduct...событий
Ответить с цитированием
  #19 (permalink)  
Старый 15.10.2014, 17:27
Аспирант
Отправить личное сообщение для Boolean_Type Посмотреть профиль Найти все сообщения от Boolean_Type
 
Регистрация: 02.02.2014
Сообщений: 48

Сообщение от danik.js Посмотреть сообщение
Ну вы укурки ))) Два укурка ))

А теперь выдохни и посмотри на код из Контекст this для событий .
Ниче не напоминает ?
Или перестать укуриваться ) Ибо нет никакой разницы инлайн-не инлайн. Повторяю для накуренных: JavaScript не завязан на HTML. Нет никакой разницы между функцией созданной из атрибута, и функцией, присвоенной в js коде.
Причём тут укуриваться, чё за манера?
Вот именно, напоминает, ибо ты написал то же самое, где вызов идёт не в контексте элемента, а контексте Window. Об этом и писал мне отвечающий.
Сообщение от danik.js Посмотреть сообщение
нет никакой разницы инлайн-не инлайн.
При инлайн надо явно передавать 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, меня отпустило
Спасибо всем отписавшимся, вот бы на сайтах, пхп посвящённых, так же оперативно и с примерами отвечали...
Ответить с цитированием
  #20 (permalink)  
Старый 15.10.2014, 17:37
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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



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

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


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