2

假设我有一些绑定到链接的操作(使用 .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
}
4

3 回答 3

2

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

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

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

于 2012-07-17T09:01:46.560 回答
2

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

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

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

于 2012-07-17T09:01:54.487 回答
2

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

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

$('#link').trigger('click.mynamespace');

或通过使用第二个事件

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

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

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

如果在您不再有权访问的闭包中定义函数很有用,请选择第一种方式。

于 2012-07-17T09:03:09.240 回答