Bug Tracker

Ticket #2655: handle-fix.2.diff

File handle-fix.2.diff, 3.1 kB (added by flesler, 9 months ago)

2nd 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];//namespace 
    248242 
    249         var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); 
    250         args.unshift( event ); 
     243        var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type]; 
    251244 
    252245        for ( var j in handlers ) { 
    253246            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; 
    258247 
    259248            // Filter the functions by class 
    260             if ( !parts[1] && !event.exclusive || handler.type == parts[1] ) { 
    261                 var ret = handler.apply( this, args ); 
     249            if ( !ns && !event.exclusive || handler.type == ns ) { 
    262250 
    263                 if ( val !== false ) 
    264                     val = ret; 
    265  
    266                 if ( ret === false ) { 
    267                     event.preventDefault(); 
    268                     event.stopPropagation(); 
    269                 } 
     251                // Pass in a reference to the handler function itself 
     252                // So that we can later remove it 
     253                event.handler = handler; 
     254                event.data = handler.data; 
     255                 
     256                val = handler.apply( this, arguments ) !== false && val; 
    270257            } 
    271258        } 
    272259 
     260        if ( val === false ) {//check after the loop 
     261            event.preventDefault(); 
     262            event.stopPropagation(); 
     263        } 
     264 
    273265        // Clean up added properties in IE to prevent memory leak 
    274266        if (jQuery.browser.msie) 
    275267            event.target = event.preventDefault = event.stopPropagation = 
     
    279271    }, 
    280272 
    281273    fix: function(event) { 
     274        if( event._fixed_ )//already fixed 
     275            return event; 
     276         
    282277        // store a copy of the original event object  
    283278        // and clone to set read-only properties 
    284279        var originalEvent = event; 
    285         event = jQuery.extend({}, originalEvent); 
     280        event = jQuery.extend({ _fixed_:true }, originalEvent); 
    286281         
    287282        // add preventDefault and stopPropagation since  
    288283        // they will not work on the clone