2013-04-30 55 views
5

所以我們有一個頁面:的addEventListener調用函數沒有我,甚至要求它

<span id='container'> 
    <a href='#' id='first'>First Link</a> 
    <a href='#' id='second'>Second Link</a> 
</span> 

而且要添加一些單擊事件:

first.addEventListener('click', function(){alert('sup!');}) 

就像一個魅力!但是,當您使第二個參數爲外部函數時:

function message_me(m_text){ 
    alert(m_text) 
} 

second.addEventListener('click', message_me('shazam')) 

它立即調用該函數。我怎樣才能阻止呢?很煩人!

這裏有一個現場演示:http://jsfiddle.net/ey7pB/1/

+1

由於第二個參數需要一個函數**引用**,您需要提供一個。用你有問題的代碼,你馬上調用函數並傳遞它的結果(這是* undefined *)。要麼在一個匿名函數中調用函數(比如你的第一個例子),或者改變函數來**返回**一個函數(可能不是理想的)。 – Ian 2013-04-30 23:17:59

+1

這爲什麼不理想?這似乎反對D.R.Y.複製我的功能在4左右addEventListeners即時設置,不? – LittleBobbyTables 2013-04-30 23:20:17

+0

另一種選擇是將所需消息作爲屬性存儲在元素上,然後將該函數綁定爲second.addEventListener('click',message_me)',並使其從屬性而不是從參數中檢索消息。 – nnnnnn 2013-04-30 23:23:22

回答

7
function message_me(m_text){ 
    alert(m_text) 
} 

second.addEventListener('click', 
    function() { 
     message_me('shazam'); 
    } 
); 

這裏有一個更新的fiddle

+0

Boom!謝謝。當SO讓我接受這個答案時:D – LittleBobbyTables 2013-04-30 23:16:56

+0

我認爲你應該更新你接受的答案,因爲傳遞函數而不調用它,並綁定 - 在這裏可能是一個更好的選擇。 – IonicBurger 2016-11-02 14:53:32

+0

你能解釋爲什麼你認爲綁定是一個更好的選擇嗎? – clav 2016-11-02 16:07:59

4

由於第二個參數需要功能參考,您需要提供一個。有了你有問題的代碼,你立即調用該函數,並通過其結果(這是undefined ...因爲所有功能確實是alert並且不返回任何東西)。要麼在一個匿名函數中調用函數(就像你的第一個例子),要麼改變函數返回一個函數。

你可以這樣做:

function message_me(m_text){ 
    alert(m_text); 
} 

second.addEventListener('click', function() { 
    message_me('shazam') 
}); 

或本:

function message_me(m_text){ 
    return function() { 
     alert(m_text); 
    }; 
} 

second.addEventListener('click', message_me('shazam')); 

DEMO:http://jsfiddle.net/tcCvw/

2

,或者您可以使用.bind

function message_me(m_text){ 
    alert(m_text); 
} 

second.addEventListener('click', message_me.bind(this, 'shazam')); 

檢查MDN Documentation 約'關閉'

+0

這應該是公認的答案 – IonicBurger 2016-11-02 14:51:41

+0

+1綁定應該是一條路要走 - 不知道4年前是否可用,但肯定是今天的首選方式,而不是創建匿名函數 – vol7ron 2017-03-07 00:40:59

相關問題