Is there a way to attach a jQuery event handler such that the handler is triggered before any previously-attached event handlers? I came across this article, but the code didn't work because event handlers are no-longer stored in an array, which is what his code expected. I attempted to create a jQuery extension to do what I wanted, but this is not working (the events still fire in the order they were bound):
$.fn.extend({     bindFirst: function(type, handler) {          var baseType = type;         var dotIdx = type.indexOf('.');         if (dotIdx >= 0) {             baseType = type.substr(0, dotIdx);         }          this.each(function() {             var oldEvts = {};             var data = $.data(this);             var events = data.events || data.__events__;             var handlers = events[baseType];             for (var h in handlers) {                 if (handlers.hasOwnProperty(h)) {                     oldEvts[h] = handlers[h];                     delete handlers[h];                     // Also tried an unbind here, to no avail                 }             }              var self = $(this);             self.bind(type, handler);              for (var h in oldEvts) {                 if (oldEvts.hasOwnProperty(h)) {                     self.bind(baseType, oldEvts[h]);                 }             }         });     } }); Is there a natural way to reorder event handling? If there isn't, do you know of technique I could apply? I'm using jQuery 1.4.1, though I'll upgrade if I must.
Commonly Used jQuery Event Methods The click() method attaches an event handler function to an HTML element. The function is executed when the user clicks on the HTML element.
The . bind() method is the primary means of attaching behavior to a document. All JavaScript event types, such as focus , mouseover , and resize , are allowed for eventType. Any string is legal for eventType ; if the string is not the name of a native JavaScript event, then the handler is bound to a custom event.
Here's a simple plugin I did a while back. Lets you bind a handler to the beginning of the list. It is very simple, and I wouldn't guarantee that it works with namespaced events or anything terribly fancy.
For simply binding a single or space separate group of events, it should work.
Example: http://jsfiddle.net/gbcUy/
$.fn.bindUp = function(type, fn) {      type = type.split(/\s+/);      this.each(function() {         var len = type.length;         while( len-- ) {             $(this).bind(type[len], fn);              var evt = $.data(this, 'events')[type[len]];             evt.splice(0, 0, evt.pop());         }     }); }; Or if you wanted to manipulate the Array of handlers in some other manner, just get the handlers for the element you want, and manipulate it however you want:
Example: http://jsfiddle.net/gbcUy/1/
var clickHandlers = $('img').data('events').click;  clickHandlers.reverse(); // reverse the order of the Array If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With