Clean up in jQuery.event.add for assigning a handler.guid
[jquery.git] / src / event / event.js
index eb6ee59..c1dbec6 100644 (file)
@@ -13,6 +13,10 @@ jQuery.event = {
                if ( jQuery.browser.msie && element.setInterval != undefined )
                        element = window;
                
+               // Make sure that the function being executed has a unique ID
+               if ( !handler.guid )
+                       handler.guid = this.guid++;
+                       
                // if data is passed, bind to handler 
                if( data != undefined ) { 
                // Create temporary function pointer to original handler 
@@ -31,13 +35,6 @@ jQuery.event = {
                        handler.guid = fn.guid;
                }
 
-               // Make sure that the function being executed has a unique ID
-               if ( !handler.guid ) {
-                       handler.guid = this.guid++;
-                       // Don't forget to set guid for the original handler function
-                       if (fn) fn.guid = handler.guid;
-               }
-
                // Init the element's event structure
                if (!element.$events)
                        element.$events = {};
@@ -186,12 +183,33 @@ jQuery.event = {
                if ( !event.target && event.srcElement )
                        event.target = event.srcElement;
 
+               // Add relatedTarget, if necessary
+               if ( !event.relatedTarget && event.fromElement )
+                       event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+               // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+               if ( event.metaKey == null && event.ctrlKey != null )
+                       event.metaKey = event.ctrlKey;
+
+               // Add which for click: 1 == left; 2 == middle; 3 == right
+               // Note: button is not normalized, so don't use it
+               if ( event.which == null && event.button != null )
+                       event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
                // Calculate pageX/Y if missing and clientX/Y available
-               if ( event.pageX == undefined && event.clientX != undefined ) {
-                       var e = document.documentElement, b = document.body;
-                       event.pageX = event.clientX + (e.scrollLeft || b.scrollLeft);
-                       event.pageY = event.clientY + (e.scrollTop || b.scrollTop);
+               if ( event.pageX == null && event.clientX != null ) {
+                       var e = document.documentElement || document.body;
+                       event.pageX = event.clientX + e.scrollLeft;
+                       event.pageY = event.clientY + e.scrollTop;
                }
+
+               // Add which for keypresses: keyCode
+               if ( (event.which == null || event.type == "keypress") && event.keyCode != null )
+                       event.which = event.keyCode;    
+
+               // If it's a keypress event, add charCode to IE
+               if ( event.charCode == null && event.type == "keypress" )
+                       event.charCode = event.keyCode;
                                
                // check if target is a textnode (safari)
                if (jQuery.browser.safari && event.target.nodeType == 3) {
@@ -286,7 +304,7 @@ jQuery.fn.extend({
         * Binds a handler to a particular event (like click) for each matched element.
         * The handler is executed only once for each element. Otherwise, the same rules
         * as described in bind() apply.
-        The event handler is passed an event object that you can use to prevent
+        * The event handler is passed an event object that you can use to prevent
         * default behaviour. To stop both default action and event bubbling, your handler
         * has to return false.
         *
@@ -456,7 +474,7 @@ jQuery.fn.extend({
                // A private function for handling mouse 'hovering'
                function handleHover(e) {
                        // Check if mouse(over|out) are still within the same parent element
-                       var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
+                       var p = e.relatedTarget;
        
                        // Traverse up the tree
                        while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; };
@@ -549,7 +567,7 @@ jQuery.extend({
                                // Reset the list of functions
                                jQuery.readyList = null;
                        }
-                       // Remove event lisenter to avoid memory leak
+                       // Remove event listener to avoid memory leak
                        if ( jQuery.browser.mozilla || jQuery.browser.opera )
                                document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );