Bug Tracker

Changeset 5276

Show
Ignore:
Timestamp:
04/22/08 05:23:55 (7 months ago)
Author:
brandon.aaron
Message:

Some small optimizations to the event module. jQuery.event.trigger over 200% faster in IE and less code. Thanks in large to Ariel Flesler.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/jquery/src/event.js

    r5273 r5276  
    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 
     
    200193                data[0].exclusive = true; 
    201194 
    202             // Trigger the event 
    203             if ( jQuery.isFunction( jQuery.data(elem, "handle") ) ) 
    204                 val = jQuery.data(elem, "handle").apply( elem, data ); 
     195            // Trigger the event, it is assumed that "handle" is a function 
     196            var handle = jQuery.data(elem, "handle");  
     197            if ( handle )  
     198                val = handle.apply( elem, data ); 
    205199 
    206200            // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) 
     
    238232    handle: function(event) { 
    239233        // returned undefined or false 
    240         var val; 
    241  
    242         // Empty object is for triggered events with no data 
    243         event = jQuery.event.fix( event || window.event || {} );  
     234        var val, namespace, all, handlers; 
     235 
     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]; 
    248  
    249         var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); 
    250         args.unshift( event ); 
     239        namespace = event.type.split("."); 
     240        event.type = namespace[0]; 
     241        namespace = namespace[1]; 
     242        all = !namespace && !event.exclusive; //cache this now, all = true means, any handler 
     243 
     244        handlers = ( jQuery.data(this, "events") || {} )[event.type]; 
    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 ); 
    262  
    263                 if ( val !== false ) 
    264                     val = ret; 
    265  
    266                 if ( ret === false ) { 
    267                     event.preventDefault(); 
    268                     event.stopPropagation(); 
    269                 } 
    270             } 
     250            if ( all || handler.type == namespace ) { 
     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 ); 
     257            } 
     258        } 
     259         
     260        if ( val === false ) { 
     261            event.preventDefault(); 
     262            event.stopPropagation(); 
    271263        } 
    272264