2011-04-22 57 views
2

有沒有辦法將事件綁定到某個對象上,並確保這些事件中的一個總是最後被執行?jQuery中的綁定事件總是會在最後執行

$('#something').bind('click', function() { 
    // do something first 
    }); 
    $('#something').bind('click', function() { 
    // do this always last 
    }); 
    $('#something').bind('click', function() { 
    // do this after first one 
    }); 

謝謝!

回答

1

你可以綁定所有的處理程序一氣呵成:

$('#something').click(function() { 
    first(); 
    second(); 
    third(); 
}); 

這個自帶的是略高於結合3個獨立的聽衆更高效/輕量級額外的獎勵。

+1

而且更容易維護,而不是在不同的地方定義好幾個(不好意思!) – Wiseguy 2011-04-22 15:29:58

+0

問題是我不知道有多少事件會被綁定到#something元素。它可以從1到x,並且我希望確保一個特定的執行總是在最後執行,無論事件的順序如何。 – 2011-04-22 15:53:23

+0

@Goran:_「問題是我不知道會發生多少事件被綁定到#something元素。「_爲什麼不呢?事件處理程序應該彼此獨立。無論如何,最大限度地減少聽衆的數量是一個好主意。 – 2011-04-22 15:56:22

1

編輯:這可能是有用的,但可能無法按OP的問題需要。在one上觸發的處理程序不會附加到當前處理程序隊列的末尾,它僅在後續事件上運行。

對於未來的讀者,您可以通過使用one()代理處理程序來實現此目的。

$('.some-class').on('anevent', function(evt) { 
    $(this).one(evt.type, function(evt) { 
     //this code will fire after all other handlers for this event, except others that are proxied the same way 
     console.log(evtO == evt, 'same event'); 
     if (evt.isDefaultPrevented())//can check signals to see whether you should still handle this event 
      return; 
     //do stuff last 
    }); 
}) 

在別的地方後來:

$('.some-class').on('anevent', function(evt) { 
    //do stuff first 
    evt.preventDefault();//can signal to prevent the proxied function. could use evt.stopPropagation() instead 
}) 

一個需要注意是,如果以後的處理程序使用return false;stopImmediatePropagation(),與one()約束,且事件發生時,下一次會火第一的功能,除非你以某種方式明確解除綁定。