Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция назначенная обработчику события срабатывает сразу (https://javascript.ru/forum/misc/53775-funkciya-naznachennaya-obrabotchiku-sobytiya-srabatyvaet-srazu.html)

Velidan 17.02.2015 19:18

Функция назначенная обработчику события срабатывает сразу
 
Доброго вечера уважаемые коллеги. Подскажите пожалуйста почему, когда я назначаю функцию обработчику события и передаю ей параметр она сразу же срабатывает после загрузки страницы, а не по самому событию ?

document.getElementById('jscroll_2').onclick = elmYPosition('contacts');

function elmYPosition(eID) {
        var elm = document.getElementById(eID);
        var y = elm.offsetTop;
        alert(y);
}

Срабатывает сразу же после загрузки страницы и после на клики не реагирует.
Вопрос очень банальный (чувствую) но не могу никак с этим справиться. Помогите пожалуйста.

рони 17.02.2015 19:45

Velidan,
потому что в onclick у вас результат функции а не ссылка на функцию
document.getElementById('jscroll_2').onclick = elmYPosition('contacts');

 function elmYPosition(eID) {
     return function() {
         var elm = document.getElementById(eID);
         var y = elm.offsetTop;
         alert(y);
     }
 }

danik.js 17.02.2015 22:53

Разве в учебниках по программированию не учат, что чтобы вызвать функцию, нужно поставить после ее имени скобочки? Соответственно, если после имени стоят скобочки - значит это вызов функции?

Velidan 18.02.2015 10:15

Спасибо большое за ответы.
Конечно учат. В php только так и можно.
Почему я сделал без скобочек. Потому что подсмотрел в одном скрипте такой вызов:
document.getElementById("desc").onclick = activateSlider;
    document.getElementById("web").onclick = activateSlider;
    document.getElementById("mobile").onclick = activateSlider;


Подумал, что это правильно.
+ http://www.cyberforum.ru/javascript/thread867501.html (4 ответ) рекомендует делать вызов таким образом.
Аналогично здесь: http://hashcode.ru/questions/220339/...B5-%D0%B2-html

Рони подскажите пожалуйста:
Правильно вызывать функцию по событию таким образом:
document.getElementById("desc").addEventListener('click', elmYPosition('contacts'), false);


Помогите пожалуйста разобраться раз и навсегда с этим вопросом.

caetus 18.02.2015 10:43

document.getElementById("desc").addEventListener(' click', elmYPosition('contacts'), false);
вызов происходит сразу

document.getElementById("desc").addEventListener(' click', elmYPosition, false);
так только после клика , если нужно передать аргумент тогда делай так
document.getElementById("desc").addEventListener(' click', function(){elmYPosition('contacts')}, false);

Velidan 18.02.2015 11:28

Спасибо огромное за помощь ребята.
Честно говоря, немного мудреные конструкции, особенно в случае передачи параметра (оборачивание вызова в анонимную функцию удивило. Сам бы не додумался)

ksa 18.02.2015 13:51

Цитата:

Сообщение от Velidan
Почему я сделал без скобочек. Потому что подсмотрел в одном скрипте такой вызов:
document.getElementById("desc").onclick = activateSlider;    
document.getElementById("web").onclick = activateSlider;    
document.getElementById("mobile").onclick = activateSlider;

Так можно. :yes:
Поскольку нет собственно вызова функций.

Но как только ты начнешь использовать круглые скобки - все! Это уже вызов функции... ;)

ksa 18.02.2015 13:52

Цитата:

Сообщение от Velidan
Помогите пожалуйста разобраться раз и навсегда с этим вопросом.

Вот статейка по этому вопросу...
http://javascript.ru/tutorial/events/crossbrowser

Velidan 18.02.2015 14:39

Спасибо огромное за разъяснение и подсказку где читать.

danik.js 18.02.2015 17:02

document.getElementById('jscroll_2').onclick = elmYPosition.bind(this, 'contacts');


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