Bug Tracker

Ticket #2655: handle-fix.3.diff

File handle-fix.3.diff, 3.2 KB (added by flesler, 14 years ago)

3rd Version

  • src/event.js

     
    4141                // Init the element's event structure
    4242                var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
    4343                        handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
    44                                 // returned undefined or false
    45                                 var val;
    46 
    4744                                // Handle the second event of a trigger and when
    4845                                // an event is called after a page has unloaded
    49                                 if ( typeof jQuery == "undefined" || jQuery.event.triggered )
    50                                         return val;
    51                
    52                                 val = jQuery.event.handle.apply(arguments.callee.elem, arguments);
    53                
    54                                 return val;
     46                                if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
     47                                        return jQuery.event.handle.apply(arguments.callee.elem, arguments);
    5548                        });
    5649                // Add elem as a property of the handle function
    5750                // This is to prevent a memory leak with non-native
     
    240233                var val;
    241234
    242235                // Empty object is for triggered events with no data
    243                 event = jQuery.event.fix( event || window.event || {} );
     236                event = arguments[0] = jQuery.event.fix( event || window.event );
    244237
    245238                // Namespaced event handlers
    246                 var parts = event.type.split(".");
    247                 event.type = parts[0];
     239                var ns = event.type.split(".");
     240                event.type = ns[0];
     241                ns = ns[1];//ns is the namespace
     242                var all = !ns && !event.exclusive;//cache this now, all = true means, any handler
    248243
    249                 var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
    250                 args.unshift( event );
     244                var handlers = ( jQuery.data(this, "events") || {} )[event.type];//don't use 2 jQuery.data, they are slow
    251245
    252246                for ( var j in handlers ) {
    253247                        var handler = handlers[j];
    254                         // Pass in a reference to the handler function itself
    255                         // So that we can later remove it
    256                         args[0].handler = handler;
    257                         args[0].data = handler.data;
    258248
    259249                        // Filter the functions by class
    260                         if ( !parts[1] && !event.exclusive || handler.type == parts[1] ) {
    261                                 var ret = handler.apply( this, args );
     250                        if ( all || handler.type == ns ) {
    262251
    263                                 if ( val !== false )
    264                                         val = ret;
    265 
    266                                 if ( ret === false ) {
    267                                         event.preventDefault();
    268                                         event.stopPropagation();
    269                                 }
     252                                // Pass in a reference to the handler function itself
     253                                // So that we can later remove it
     254                                event.handler = handler;
     255                                event.data = handler.data;
     256                               
     257                                val = handler.apply( this, arguments ) !== false && val;
    270258                        }
    271259                }
    272260
     261                if ( val === false ) {//check after the loop
     262                        event.preventDefault();
     263                        event.stopPropagation();
     264                }
     265
    273266                // Clean up added properties in IE to prevent memory leak
    274267                if (jQuery.browser.msie)
    275268                        event.target = event.preventDefault = event.stopPropagation =
     
    279272        },
    280273
    281274        fix: function(event) {
     275                if( event._fixed_ )//already fixed
     276                        return event;
     277               
    282278                // store a copy of the original event object
    283279                // and clone to set read-only properties
    284280                var originalEvent = event;
    285                 event = jQuery.extend({}, originalEvent);
     281                event = jQuery.extend({ _fixed_:true }, originalEvent);
    286282               
    287283                // add preventDefault and stopPropagation since
    288284                // they will not work on the clone