Don't remove test directory on clean
[jquery.git] / src / event.js
index 070ed9e..a380130 100644 (file)
@@ -8,6 +8,9 @@ jQuery.event = {
        // Bind an event to an element
        // Original by Dean Edwards
        add: function(element, type, handler, data) {
+               if ( element.nodeType == 3 || element.nodeType == 8 )
+                       return;
+
                // For whatever reason, IE has trouble passing the window object
                // around, causing it to be cloned in the process
                if ( jQuery.browser.msie && element.setInterval != undefined )
@@ -19,7 +22,7 @@ jQuery.event = {
                        
                // if data is passed, bind to handler 
                if( data != undefined ) { 
-                       // Create temporary function pointer to original handler 
+                       // Create temporary function pointer to original handler 
                        var fn = handler; 
 
                        // Create unique handler function, wrapped around original handler 
@@ -83,6 +86,10 @@ jQuery.event = {
 
        // Detach an event or set of events from an element
        remove: function(element, type, handler) {
+               // don't do events on text and comment nodes
+               if ( element.nodeType == 3 || element.nodeType == 8 )
+                       return;
+
                var events = jQuery.data(element, "events"), ret, index;
 
                // Namespaced event handlers
@@ -147,6 +154,10 @@ jQuery.event = {
 
                // Handle triggering a single element
                } else {
+                       // don't do events on text and comment nodes
+                       if ( element.nodeType == 3 || element.nodeType == 8 )
+                               return;
+
                        var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
                                // Check to see if we need to provide a fake event, or not
                                event = !data[0] || !data[0].preventDefault;
@@ -171,13 +182,21 @@ jQuery.event = {
                                data.shift();
 
                        // Handle triggering of extra function
-                       if ( extra && extra.apply( element, data ) === false )
-                               val = false;
+                       if ( extra ) {
+                               // call the extra function and tack the current return value on the end for possible inspection
+                               var ret = extra.apply( element, data.concat( val ) );
+                               // if anything is returned, give it precedence and have it overwrite the previous value
+                               if (ret !== undefined)
+                                       val = ret;
+                       }
 
                        // Trigger the native events (except for clicks on links)
                        if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
                                this.triggered = true;
-                               element[ type ]();
+                               try {
+                                       element[ type ]();
+                               // prevent IE from throwing an error for some hidden elements
+                               } catch (e) {}
                        }
 
                        this.triggered = false;
@@ -253,11 +272,11 @@ jQuery.event = {
                };
                
                // Fix target property, if necessary
-               if ( !event.target && event.srcElement )
-                       event.target = event.srcElement;
+               if ( !event.target )
+                       event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
                                
                // check if target is a textnode (safari)
-               if (jQuery.browser.safari && event.target.nodeType == 3)
+               if ( event.target.nodeType == 3 )
                        event.target = originalEvent.target.parentNode;
 
                // Add relatedTarget, if necessary
@@ -268,7 +287,7 @@ jQuery.event = {
                if ( event.pageX == null && event.clientX != null ) {
                        var doc = document.documentElement, body = document.body;
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
-                       event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc.clientLeft || 0);
+                       event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
                }
                        
                // Add which for key events
@@ -333,7 +352,7 @@ jQuery.fn.extend({
                        event.preventDefault();
                        
                        // and execute the function
-                       return args[this.lastToggle].apply( this, [event] ) || false;
+                       return args[this.lastToggle].apply( this, arguments ) || false;
                });
        },
 
@@ -348,7 +367,8 @@ jQuery.fn.extend({
                        while ( parent && parent != this ) try { parent = parent.parentNode; } catch(error) { parent = this; };
                        
                        // If we actually just moused on to a sub-element, ignore it
-                       if ( parent == this ) return false;
+                       if ( parent == this ) 
+                               return true;
                        
                        // Execute the right function
                        return (event.type == "mouseover" ? fnOver : fnOut).apply(this, [event]);
@@ -401,7 +421,7 @@ jQuery.extend({
                                jQuery.readyList = null;
                        }
                        // Remove event listener to avoid memory leak
-                       if ( jQuery.browser.mozilla || jQuery.browser.opera )
+                       if ( document.removeEventListener )
                                document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
                }
        }
@@ -424,37 +444,34 @@ function bindReady(){
        if ( readyBound ) return;
        readyBound = true;
 
-       // If Mozilla is used
-       if ( jQuery.browser.mozilla || jQuery.browser.opera )
+       // Mozilla, Opera and webkit nightlies currently support this event
+       if ( document.addEventListener )
                // Use the handy event callback
                document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
        
        // If Safari or IE is used
-       else {
-               // Continually check to see if the document is ready
-               function timer(){
-                       try {
-                               // If IE is used, use the trick by Diego Perini
-                               // http://javascript.nwbox.com/IEContentLoaded/
-                               if ( jQuery.browser.msie || document.readyState != "loaded" && document.readyState != "complete" )
-                                       document.documentElement.doScroll("left");
-       
-                               // and execute any waiting functions
-                               jQuery.ready();
-                       } catch( error ) {
-                               setTimeout( timer, 0 );
-                       }
+       // Continually check to see if the document is ready
+       if (jQuery.browser.msie || jQuery.browser.safari ) (function(){
+               try {
+                       // If IE is used, use the trick by Diego Perini
+                       // http://javascript.nwbox.com/IEContentLoaded/
+                       if ( jQuery.browser.msie || document.readyState != "loaded" && document.readyState != "complete" )
+                               document.documentElement.doScroll("left");
+               } catch( error ) {
+                       return setTimeout( arguments.callee, 0 );
                }
 
-               timer();
-       }
+               // and execute any waiting functions
+               jQuery.ready();
+       })();
 
        // A fallback to window.onload, that will always work
        jQuery.event.add( window, "load", jQuery.ready );
 }
 
 // Prevent memory leaks in IE
-if ( jQuery.browser.msie )
-       jQuery(window).bind("unload", function() {
-               $("*").add([document, window]).unbind();
-       });
+// And prevent errors on refresh with events like mouseover
+// Window isn't included so as not to unbind existing unload events
+jQuery(window).bind("unload", function() {
+       jQuery("*").add(document).unbind();
+});