2016-07-07 121 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,它被非常非常徹底地回答。) –

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;