2011-10-23 57 views
0

元素我使用jQuery和創建事件處理程序是這樣的:jQuery的忽略與「禁用」

$('#some_selector a.add').live('click', function(){...}); 

不過,我需要不執行處理程序時,一個元素disabled類。然後我寫了下面來實現這一點:

$('#some_selector a.add:not(.disabled)').live('click', function(){...}); 

但我看膩了,我需要添加:not(.disabled)的所有地方,有時我忘了加上它等等。此外,如果我有一個錨點元素,並且我的處理程序會阻止對其執行默認操作,那麼添加:not(.disabled)將導致瀏覽器打開下一頁,而不是無所事事。

那麼當元素滿足某些條件(如「禁用」類)時,是否有辦法在處理程序執行時設置自動禁用?

回答

2

這裏是你可以做什麼:

首先,事件處理程序綁定到.disabled元素防止執行其它的處理程序,並阻止默認動作:

$('#some_selector a.add.disabled').live('click', function(event){ 
    event.stopImmediatePropagation(); 
    event.preventDefault(); 
}); 

然後你可以綁定你其他事件處理程序就像你之前做過的由於事件處理程序按已綁定的順序執行,因此disabled元素的事件處理程序將始終首先執行,並阻止其他處理程序執行(通過stopImmediatePropagation[docs])。

DEMO

+0

好戲!但我不明白如何保證這個處理程序將被首先執行?我試着只使用''event.stopPropagation()''和''event.preventDefault()'',但它並沒有這樣工作。 – dragoon

+0

@dragoon:'stopPropagation'不會因爲'live'的工作方式而起作用。執行順序是由jQuery保證的。我無法告訴你他們究竟做了些什麼,但是源代碼是免費的;)但是,你真的應該考慮@ mu的答案,這在語義上更加正確。 –

2

你可以使用<button>,而不是<a>這一點。一個<button>disabled attribute組將根本不響應點擊:

被禁用必須防止排隊的用戶交互任務源從元素上分派任何click事件表單控件。

例如:http://jsfiddle.net/ambiguous/sCv8n/

您可以風格<button>看起來幾乎你想太多的任何方式。

+0

謝謝你,很好的解決方案,但不幸的是,需要做大量的工作來取代我所有的錨(檢查CSS,重構選擇器),但我會在將來記住這一點。 – dragoon

+1

@dragoon:我想了很多,但認爲它值得一提。恥辱,現實繼續妨礙正確性:) –