2016-07-07 2 views
3

Если я пишу событие таким образом, действие выполняется, когда это необходимо:Javascript автоматическое выполнение функции

document.getElementById('myElem').onmousedown = (e) => { 
    console.log('fired!') 
    } 

Но если я пишу те же вещи по-другому, действие выполняется при загрузке страницы, один раз :

let HandleEvent = (event) => { 
console.log('fired!') 
} 
document.getElementById('myElem').onmousedown = HandleEvent(event) 

UPD: Ofcourse это просто пример, HandleEvent функция будет иметь гораздо более сложную логику.

Мои вопросы:

  1. Почему?
  2. Как заставить его работать правильно?
+5

'onmousedown' ожидает ссылку' function', но то, что вы передаете, является возвращаемым значением функции (которое является 'undefined'), потому что вы * вызываете * его. Попробуйте 'document.getElementById ('myElem'). Onmousedown = HandleEvent'. – haim770

ответ

6
document.getElementById('myElem').onmousedown = HandleEvent; 

сделать бы то, что вы хотите; вы не должны выполнять обработчик при его назначении. Вы должны просто назначить ссылку на функцию.

Тогда вы также можете назначить его в качестве обработчика OnLoad, или даже называют его сами (если вы не полагаетесь на объект события)

+0

Хорошо, спасибо! – Src

5
document.getElementById('myElem').onmousedown = HandleEvent; 

Чтобы передать дополнительные аргументы, которые вы могли бы использовать привязку:

document.getElementById('myElem').onmousedown = HandleEvent.bind(null, argument1, argument2); 

... или вы могли бы использовать фабричную функцию:

document.getElementById('myElem').onmousedown = createHandler(); 

function createHandler() { 
    var a = calculateA(); 
    var b = calculateA(); 
    return function handleEvent() { 
    //use a and/or b 
    }; 
} 

Есть и другие способы тоже. Точный код будет зависеть от вашего варианта использования.

+0

Как я могу передать дополнительные параметры для работы? – Src

+0

@Src 'Function.prototype.bind' – gcampbell

+3

@Src: Это был не ваш вопрос. Бен ответил на ваш вопрос. (И вы можете легко найти ответ на этот вопрос, выполнив поиск SO, где он был очень, очень тщательно answer.) –

1

Удалить событие

let HandleEvent = (event) => { 
console.log('fired!') 
} 
document.getElementById('myElem').onmousedown = HandleEvent 
+0

Убрать это событие не очень хорошее описание того, что делает удаление круглых скобок. –

2

Вам не нужно event.

let HandleEvent = (event) => 'fired!'; 
document.getElementById('myElem').onmousedown = HandleEvent 
1

Если вы хотите передать атрибут

let HandleEvent = (event) => { 
console.log('fired!') 
} 
document.getElementById('myElem').onmousedown = HandleEvent.bind(attribute) 
0

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

Правильное утверждение:.

document.getElementById ('myElem') OnMouseDown = HandleEvent;

Смежные вопросы