2011-08-27 132 views
15

非法調用我得到這個試圖放下一個EventListener的兩個版本的Uncaught TypeError: Illegal invocation:(我得到時,應添加偵聽器的錯誤,當我點擊的目標不是)遺漏的類型錯誤:上的addEventListener

ronan.addEventListener("click", alert, false);

addEventListener.apply(ronan, ["click", alert, false]);

ronan是,所以我不認爲這是問題,通過控制檯成功返回div元素。任何想法,爲什麼我得到這個錯誤?我讀this線程,我無法從中找出答案。

+0

也許我應該等到早上提交這 –

+1

它可能是'警報'...本地功能。一個空的'function(){}'在它的位置上工作嗎? – James

+0

@ J-P沒有,這沒有幫助 –

回答

29

您需要在函數中包裝alert。這將工作:

ronan.addEventListener("click", function() { alert('Hi'); }, false); 

這裏是一個fiddle作證明。單獨使用alert不起作用,因爲當執行偵聽器時,該函數中的值this被設置爲正在偵聽的對象。例如,如果您在ronan上設置了一個偵聽器,則該偵聽器爲this === ronan。這對alert提出了一個問題,因爲該函數預計this等於window。您可以解決這個(沒有雙關語意)通過包裝在另一個函數的函數或將其綁定到任何預計this是:

document.body.addEventListener('click', alert.bind(window), false); 

不要忘了,在IE < 9,你需要使用attachEvent而不是addEventListener


使用apply/calladdEventListener

你的第二次嘗試將無法工作,因爲你想你的論點也適用於window.addEventListener,而不是HTMLElement.prototype.addEventListener,這是一個不同的注意事項功能總共:

// This won't work 
addEventListener.apply(ronan, ["click", alert.bind(window), false]); 

// This will work 
HTMLElement.prototype.addEventListener.apply(ronan, ['click', alert.bind(window), false]); 
+1

哦,一句話,你是對的。實際上,我甚至沒有使用原型對象,只是基礎,但是你的方法仍然沒有原型部分。我可能應該知道bind(),因爲我的JS非常專注於DOM。非常感謝您的時間! –