2012-07-17 62 views
2

假設我有一些綁定到鏈接(使用.click或.live)的操作,我想稍後再做同樣的事情,但我不想複製代碼。這是正確的方式,爲什麼?jQuery - 「觸發點擊」與「函數調用」?

此:

$('#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 
} 

回答

2

其實,你只需要你是否正在訪問event object的事件處理程序中進行區分。另一個區別在於調用處理程序的方面可能會改變,所以,當直接調用this不會指向調用node

如果您正在訪問thisevent object,您的確應該使用.trigger來執行處理程序。你也可以通過手動調用這個方法來傳遞所有necesarry數據,但是爲什麼要發明這個方法。

否則,你在直接調用您從任何地方訪問它,功能就好了。

2

注意這方面會在你的代碼依賴於兩個動作不同。

在您的匿名回調函數,this將把被點擊的鏈接。在do_stuff它不會。

除此之外,我認爲它往往是語義上更吸引人打電話,做你想做的事,而不是模擬有觸發您的聽衆的副作用的點擊付費功能。不過,這是我個人的偏好。與第一種方法

+0

這回答我的問題謝謝! (不幸的是,其他答案也是如此,基本上講同樣的事情,希望我可以將兩者都標記爲已接受) – 2012-07-17 15:34:23

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(); 

如果它有用的是定義在一個封閉你不再有訪問功能,去的第一種方式。

+1

非常有趣。在之前沒有聽說過jquery事件中的命名空間。爲你+1! – 2012-07-17 15:32:38