Prevent a single event object from being fixed more than once
[jquery.git] / src / event.js
index 4be4587..2d9bdc2 100644 (file)
@@ -160,7 +160,7 @@ jQuery.event = {
 
        trigger: function(type, data, elem, donative, extra) {
                // Clone the incoming data, if any
-               data = jQuery.makeArray(data || []);
+               data = jQuery.makeArray(data);
 
                if ( type.indexOf("!") >= 0 ) {
                        type = type.slice(0, -1);
@@ -185,7 +185,7 @@ jQuery.event = {
                        
                        // Pass along a fake event
                        if ( event )
-                               data.unshift( this.fix({ type: type, target: elem }) );
+                               data.unshift( { type: type, target: elem } );
 
                        // Enforce the right trigger type
                        data[0].type = type;
@@ -231,7 +231,7 @@ jQuery.event = {
 
        handle: function(event) {
                // returned undefined or false
-               var val, namespace, all, handlers;
+               var val, ret, namespace, all, handlers;
 
                event = arguments[0] = jQuery.event.fix( event || window.event );
 
@@ -253,29 +253,38 @@ jQuery.event = {
                                event.handler = handler;
                                event.data = handler.data;
                                
-                               val = handler.apply( this, arguments );
+                               ret = handler.apply( this, arguments );
+
+                               if ( val !== false )
+                                       val = ret;
+
+                               if ( ret === false ) {
+                                       event.preventDefault();
+                                       event.stopPropagation();
+                               }
                        }
                }
-               
-               if ( val === false ) {
-                       event.preventDefault();
-                       event.stopPropagation();
-               }
 
                // Clean up added properties in IE to prevent memory leak
                if (jQuery.browser.msie)
                        event.target = event.preventDefault = event.stopPropagation =
-                               event.handler = event.data = null;
+                               event.handler = event.data = event[expando] = null;
 
                return val;
        },
 
        fix: function(event) {
+               if ( event[expando] == true ) 
+                       return event;
+               
                // store a copy of the original event object 
                // and clone to set read-only properties
                var originalEvent = event;
                event = jQuery.extend({}, originalEvent);
                
+               // Mark it as fixed
+               event[expando] = true;
+               
                // add preventDefault and stopPropagation since 
                // they will not work on the clone
                event.preventDefault = function() {
@@ -293,6 +302,9 @@ jQuery.event = {
                        originalEvent.cancelBubble = true;
                };
                
+               // Fix timeStamp
+               event.timeStamp = event.timeStamp || +new Date;
+               
                // Fix target property, if necessary
                if ( !event.target )
                        event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either