2013-07-18 25 views
2

我經常使用jQuery .trigger()來處理重複事件。使用trigger()進行重複事件處理是不好的做法嗎?

舉例來說,如果我有一個具有四個按鈕用於導航的小部件(上,下,左,右),以及事件處理程序,勢必像每個按鈕:

$('#up').on('click', function() { 
    // move up 
    ... 
}); 

到目前爲止,小部件效果很好,現在我想在up/down/left/right arrow key上添加鍵盤快捷鍵,這樣每個按鈕的工作原理與按下up/down/left/right button時完全相同。

在這種情況下,我經常使用.trigger()來使鍵盤快捷鍵成爲這些按鈕的包裝。

$(document).on('keydown', function(e) { 
    // up arrow key 
    if (e.keyCode == 38) $('#up').trigger('click'); 
    ... 
}); 

使用.trigger()這樣不好的做法是?

我認爲將圖書館作爲黑匣子處理時非常方便。如果已經有一些按鈕來幫助控制庫,那麼即使不知道庫的API,我也可以通過在這些按鈕上觸發點擊事件來使用庫的功能。

+1

我只想做一個回調函數,然後調用它的地方我想在代碼,而不是觸發「點擊」。 – Brewal

+1

如果這個功能是你在窗口小部件上添加的東西,是的,觸發將是一個合適的方式。如果這是您添加到小部件本身的功能,則可能有更好的方法來處理它。 –

+1

你正以正確的方式使用'trigger'。你也可以使用快捷方式'$('#up')。click();'如果你喜歡 – sdespont

回答

5

這不是真的不好的做法,但也有其他的方法來做到這一點,即使他們不一定好,如:

$('#up').on('click', clickHandler); 

$(document).on('keydown', function(e) { 
    if (e.which === 38) clickHandler(); 
}); 

function clickHandler() { 
    //do stuff 
} 

$(document).on('click keydown', function(e) { 
    if (e.type == 'keydown' && e.which === 38) { 
     // do stuff for key 
    }else if (e.type == 'click' && e.target.id == 'up') { 
     // do stuff when click on #up 
    } 
}); 

它基於的意見我猜,但我更喜歡第一個,即使他們執行相同的事情,也可以使用您調用的外部函數來觸發事件本身。

我不會用最後一個,作爲被委託並觸發任何點擊等

3

有些人會說這是不好的做法,有人會說這沒問題,但它可能不是最容易理解的代碼。相反,我會建議定義一個相應的函數,然後從觸發器中調用它。例如:

function doUp() { 
    //your code for handling "up" functionality 
} 

$('#up').on('click', doUp); 

$(document).on('keydown', function(e) { 
    // up arrow key 
    if (e.keyCode == 38) doUp(); 
    ... 
}); 

對於其他按鍵/按鈕也是類似的。

這樣你就有一個地方放置你的邏輯,然後你可以從任何需要的地方調用它。

相關問題