jQuery – “触发点击”vs“函数调用”?

假设我有一些绑定到链接的操作(使用.click或.live),我想稍后做同样的事情,但我不想要重复的代码。 这是正确的方法,为什么?

这个:

$('#link').click(function(){ //do stuff }); //called later $('#link').trigger('click'); 

要么:

 $('#link').click(function(){ do_stuff(); }); //called later do_stuff(); //defined here function do_stuff(){ //do stuff } 

实际上,您只需要区分是否在事件处理程序中访问event object 。 另一个区别是该调用的处理程序的上下文可能会更改,因此在直接调用时不会指向调用的node

如果您正在访问this event objectevent object ,您确实应该使用.trigger来执行处理程序。 您也可以通过手动调用方法自己传递所有necesarry数据,但为什么要发明轮子。

否则,您可以直接从您可以访问它的任何地方调用该函数。

请注意,根据两个操作,上下文在代码中会有所不同。

在您的匿名回调函数中, this将引用被单击的链接。 在do_stuff它不会。

除此之外,我认为调用一个能做你想做的事的函数通常更具语义吸引力,而不是模拟一个具有触发你的监听器副作用的点击。 不过,这是我个人的偏好。

第一种方法的一个问题是,您还将触发绑定到该控件的任何其他点击事件; 你可以用命名空间解决这个问题

 $('#link').bind('click.mynamespace', function(){ ... }); $('#link').trigger('click.mynamespace'); 

或者使用第二个事件

 $('#link').bind('do_stuff', function(){ ... }); $('#link').click(function() { $(this).trigger('do_stuff'); }); 

但是我会选择第二个,因为它更简单,前提是您可以对需要调用它的函数进行闭包访问。 你不需要额外的函数包装器,BTW:

 function do_stuff(event) { ... } $('#link').click(do_stuff); do_stuff(); 

如果在一个你不再有权访问的闭包中定义函数很有用,请转到第一种方式。