说我有一些绑定到链接的动作(使用.click或.live),我想稍后做同样的事情,但我不想要重复的代码。这是正确的方法和原因?
此:
$('#link').click(function(){
//do stuff
});
//called later
$('#link').trigger('click');
OR:
$('#link').click(function(){
do_stuff();
});
//called later
do_stuff();
//defined here
function do_stuff(){
//do stuff
}
答案 0 :(得分:2)
实际上,您只需要区分是否在事件处理程序中访问event object
。另一个区别是该调用的处理程序的 context 可能会发生变化,因此this
在直接调用时不会指向调用的node
。
如果您正在访问this
或event object
,那么您确实应该使用.trigger
来执行处理程序。您也可以通过手动调用方法自己传递所有necesarry数据,但为什么要发明轮子。
否则,只要您有权访问它,就可以直接调用该函数。
答案 1 :(得分:2)
请注意,代码中的上下文会有所不同,具体取决于两个操作。
在您的匿名回调函数中,this
将引用被点击的链接。在do_stuff
它不会。
除此之外,我认为调用一个能做你想做的事的函数通常更具语义吸引力,而不是模拟一个具有触发你的监听器副作用的点击。不过,这是我个人的偏好。
答案 2 :(得分:2)
第一种方法的一个问题是,您还会触发绑定到该控件的任何其他点击事件;你可以用命名空间解决这个问题
$('#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();
如果在一个你无法再访问的闭包中定义函数是有用的,那就去第一条路。