2014-11-04 87 views
0

我想繞過我的頭爲什麼這段代碼不工作。我閱讀了DOM並添加了事件偵聽器,並且我明白事件偵聽器只能添加到DOM的對象中。從技術上講_get_elem的返回值應該是一個DOM對象,但它仍然不起作用。如果任何人有任何想法,爲什麼這不起作用或指向我可以解釋如何做到這一點的資源的方向,這將不勝感激。JavaScript對象無法識別爲addEventListener的DOM對象

window.onload = funtion() 
{ 
    // works 
    document.getElementByID('element_id').addEventListener('click', _fn(), false); 

    var exfnvar = new exfn(); 
    // doesn't work 
    exfnvar.exel.addEventListener('click', _fn(), false); 
    // also doesn't work 
    exfnvar._get_elem().addEventListener('click', _fn(), false); 
}; 

var exfn = function() 
{ 
    this.exel = document.getElementByID('element_id'); 
    this._get_elem = function() 
    { 
     return document.getElementByID('element_id'); 
    } 
}; 

function _fn() 
{ 
    // do something. 
}; 

回答

4

您正在調用該函數並將返回值作爲回調函數提供給事件偵聽器。相反,你必須給這個函數作爲回調。

變化

document.getElementByID('element_id').addEventListener('click', _fn(), false);

document.getElementByID('element_id').addEventListener('click', _fn, false); 

同其他listners ..

+1

這個。 瀏覽器將根據需要調用您的函數,這就是事件處理程序的要點。你只需要傳入參考。你正在傳遞你的處理程序的返回值,我懷疑它是未定義的,因爲沒有太多理由在事件處理程序中放置返回語句。 – 2014-11-04 19:38:27

+0

我不敢相信這麼小的疏忽導致一切都失敗了。奇怪的是我以前沒有(),但它仍然沒有工作,一定是其他東西。謝謝你指出我的錯誤! – Ambiguities 2014-11-04 19:49:23

1

如果你寫.addEventListener('click', _fn(), fale)_fn在這個正在執行非常線和結果(回報值)正被添加爲事件回調。

你省略_fn函數體,但假設它不返回你應該使用.addEventListener('click', _fn, false)另一個功能 - 這種方式_fn的引用添加爲監聽器,而不是它的執行結果。

+0

謝謝你的幫助!雖然@plbsam擊敗了你2分鐘,對不起。 – Ambiguities 2014-11-04 19:47:05

0

經過幾次更改,它對我來說很好。有一點要注意的是資本:

getElementById 

VS

getElementByID 

而且,當你傳遞一個函數作爲回調,你不希望包括括號。你只想在你執行這個函數時加入它。