Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.02.2015, 19:18
Аспирант
Отправить личное сообщение для Velidan Посмотреть профиль Найти все сообщения от Velidan
 
Регистрация: 13.02.2015
Сообщений: 32

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

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

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

Срабатывает сразу же после загрузки страницы и после на клики не реагирует.
Вопрос очень банальный (чувствую) но не могу никак с этим справиться. Помогите пожалуйста.
Ответить с цитированием
  #2 (permalink)  
Старый 17.02.2015, 19:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

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

Разве в учебниках по программированию не учат, что чтобы вызвать функцию, нужно поставить после ее имени скобочки? Соответственно, если после имени стоят скобочки - значит это вызов функции?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 18.02.2015, 10:15
Аспирант
Отправить личное сообщение для Velidan Посмотреть профиль Найти все сообщения от Velidan
 
Регистрация: 13.02.2015
Сообщений: 32

Спасибо большое за ответы.
Конечно учат. В 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);


Помогите пожалуйста разобраться раз и навсегда с этим вопросом.
Ответить с цитированием
  #5 (permalink)  
Старый 18.02.2015, 10:43
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

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

document.getElementById("desc").addEventListener(' click', elmYPosition, false);
так только после клика , если нужно передать аргумент тогда делай так
document.getElementById("desc").addEventListener(' click', function(){elmYPosition('contacts')}, false);
Ответить с цитированием
  #6 (permalink)  
Старый 18.02.2015, 11:28
Аспирант
Отправить личное сообщение для Velidan Посмотреть профиль Найти все сообщения от Velidan
 
Регистрация: 13.02.2015
Сообщений: 32

Спасибо огромное за помощь ребята.
Честно говоря, немного мудреные конструкции, особенно в случае передачи параметра (оборачивание вызова в анонимную функцию удивило. Сам бы не додумался)
Ответить с цитированием
  #7 (permalink)  
Старый 18.02.2015, 13:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

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

Но как только ты начнешь использовать круглые скобки - все! Это уже вызов функции...
Ответить с цитированием
  #8 (permalink)  
Старый 18.02.2015, 13:52
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

Сообщение от Velidan
Помогите пожалуйста разобраться раз и навсегда с этим вопросом.
Вот статейка по этому вопросу...
http://javascript.ru/tutorial/events/crossbrowser
Ответить с цитированием
  #9 (permalink)  
Старый 18.02.2015, 14:39
Аспирант
Отправить личное сообщение для Velidan Посмотреть профиль Найти все сообщения от Velidan
 
Регистрация: 13.02.2015
Сообщений: 32

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

document.getElementById('jscroll_2').onclick = elmYPosition.bind(this, 'contacts');
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не срабатывает плагин сразу после AJAX запроса Kikoma jQuery 3 25.05.2014 09:34
setTimeout срабатывает сразу sss2019 Общие вопросы Javascript 3 03.01.2014 23:02
Не срабатывает функция в ИЕ madfun Internet Explorer 14 11.07.2012 13:54
В IE6 не сразу срабатывает onchange Metallic Events/DOM/Window 3 26.03.2012 14:54
функция внутри Live() срабатывает после второго клика Ad1r jQuery 7 09.08.2011 14:11