多年來,我一直試圖推廣這種過程,但在我的例子中,我只關心鏈中第一個事件偵聽器的順序。
如果它有任何用處,下面是我的jQuery插件,它綁定的事件偵聽器總是在任何其他事件之前觸發:
** 使用jQuery更改進行內聯更新(謝謝Toskan) **
(function($) {
$.fn.bindFirst = function(/*String*/ eventType, /*[Object])*/ eventData, /*Function*/ handler) {
var indexOfDot = eventType.indexOf(".");
var eventNameSpace = indexOfDot > 0 ? eventType.substring(indexOfDot) : "";
eventType = indexOfDot > 0 ? eventType.substring(0, indexOfDot) : eventType;
handler = handler == undefined ? eventData : handler;
eventData = typeof eventData == "function" ? {} : eventData;
return this.each(function() {
var $this = $(this);
var currentAttrListener = this["on" + eventType];
if (currentAttrListener) {
$this.bind(eventType, function(e) {
return currentAttrListener(e.originalEvent);
});
this["on" + eventType] = null;
}
$this.bind(eventType + eventNameSpace, eventData, handler);
var allEvents = $this.data("events") || $._data($this[0], "events");
var typeEvents = allEvents[eventType];
var newEvent = typeEvents.pop();
typeEvents.unshift(newEvent);
});
};})(jQuery);要注意的事情:
- 這還沒有經過充分的測試。
- 它依賴于jQuery框架的內部結構,而不是改變(僅用1.5.2進行了測試)。
- 除了作為源元素的屬性或使用jQueryBIND()和其他相關函數綁定之外,它不一定會在事件偵聽器之前觸發。