2013-04-30 76 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

相关问题