Made jQuery's internal trigger method return the value from handle. (Bug #1417)
[jquery.git] / src / event / event.js
index 59fff51..9dff1b2 100644 (file)
@@ -130,7 +130,7 @@ jQuery.event = {
                if ( !element ) {
                        // Only trigger if we've ever bound an event for it
                        if ( this.global[type] )
-                               jQuery("*").trigger(type, data);
+                               jQuery("*").add([window, document]).trigger(type, data);
 
                // Handle triggering a single element
                } else {
@@ -142,9 +142,12 @@ jQuery.event = {
                        // Trigger the event
                        if ( jQuery.isFunction( element.$handle ) )
                                val = element.$handle.apply( element, data );
+
+                       // Handle triggering native .onfoo handlers
                        if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
                                val = false;
 
+                       // Trigger the native events (except for clicks on links)
                        if ( fn && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
                                this.triggered = true;
                                element[ type ]();
@@ -152,6 +155,8 @@ jQuery.event = {
 
                        this.triggered = false;
                }
+
+               return val;
        },
 
        handle: function(event) {
@@ -161,7 +166,7 @@ jQuery.event = {
                // Empty object is for triggered events with no data
                event = jQuery.event.fix( event || window.event || {} ); 
 
-               var c = this.$events && this.$events[event.type], args = [].slice.call( arguments, 1 );
+               var c = this.$events && this.$events[event.type], args = Array.prototype.slice.call( arguments, 1 );
                args.unshift( event );
 
                for ( var j in c ) {
@@ -170,10 +175,14 @@ jQuery.event = {
                        args[0].handler = c[j];
                        args[0].data = c[j].data;
 
-                       if ( c[j].apply( this, args ) === false ) {
+                       var tmp = c[j].apply( this, args );
+
+                       if ( val !== false )
+                               val = tmp;
+
+                       if ( tmp === false ) {
                                event.preventDefault();
                                event.stopPropagation();
-                               val = false;
                        }
                }
 
@@ -529,6 +538,9 @@ jQuery.fn.extend({
         * @see $(Function)
         */
        ready: function(f) {
+               // Attach the listeners
+               bindReady();
+
                // If the DOM is already ready
                if ( jQuery.isReady )
                        // Execute the function immediately
@@ -578,8 +590,6 @@ jQuery.extend({
        }
 });
 
-new function(){
-
        /**
         * Bind a function to the scroll event of each matched element.
         *
@@ -930,7 +940,13 @@ new function(){
                };
                        
        });
-       
+
+var readyBound = false;
+
+function bindReady(){
+       if ( readyBound ) return;
+       readyBound = true;
+
        // If Mozilla is used
        if ( jQuery.browser.mozilla || jQuery.browser.opera )
                // Use the handy event callback
@@ -976,5 +992,4 @@ new function(){
 
        // A fallback to window.onload, that will always work
        jQuery.event.add( window, "load", jQuery.ready );
-       
-};
+}