Bug Tracker

Ticket #2655: handle-fix.3.diff

File handle-fix.3.diff, 3.2 kB (added by flesler, 9 months 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