Made it so that you can bind a single function to multiple .live() selectors. Additio...
[jquery.git] / src / event.js
index 54705d1..405e19f 100644 (file)
@@ -26,10 +26,7 @@ jQuery.event = {
                        var fn = handler;
 
                        // Create unique handler function, wrapped around original handler
-                       handler = this.proxy( fn, function() {
-                               // Pass arguments and context to original handler
-                               return fn.apply(this, arguments);
-                       });
+                       handler = this.proxy( fn );
 
                        // Store data in unique handler
                        handler.data = data;
@@ -128,10 +125,10 @@ jQuery.event = {
 
                                                // remove all handlers for the given type
                                                else
-                                                       for ( handler in events[type] )
+                                                       for ( var handle in events[type] )
                                                                // Handle the removal of namespaced events
-                                                               if ( namespace.test(events[type][handler].type) )
-                                                                       delete events[type][handler];
+                                                               if ( namespace.test(events[type][handle].type) )
+                                                                       delete events[type][handle];
                                                                        
                                                if ( jQuery.event.specialAll[type] )
                                                        jQuery.event.specialAll[type].teardown.call(elem, namespaces);
@@ -163,7 +160,8 @@ jQuery.event = {
                }
        },
 
-       trigger: function( event, data, elem, bubbling /* internal */ ) {
+       // bubbling is internal
+       trigger: function( event, data, elem, bubbling ) {
                // Event object or event type
                var type = event.type || event;
 
@@ -199,16 +197,13 @@ jQuery.event = {
                        if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
                                return undefined;
                        
-                       // AT_TARGET phase (not bubbling)
-                       if( !bubbling ){
-                               // Clean up in case it is reused
-                               event.result = undefined;
-                               event.target = elem;
-                               
-                               // Clone the incoming data, if any
-                               data = jQuery.makeArray(data);
-                               data.unshift( event );
-                       }
+                       // Clean up in case it is reused
+                       event.result = undefined;
+                       event.target = elem;
+                       
+                       // Clone the incoming data, if any
+                       data = jQuery.makeArray(data);
+                       data.unshift( event );
                }
 
                event.currentTarget = elem;
@@ -231,13 +226,13 @@ jQuery.event = {
                        } catch (e) {}
                }
 
+               this.triggered = false;
+
                if ( !event.isPropagationStopped() ) {
                        var parent = elem.parentNode || elem.ownerDocument;
                        if ( parent )
                                jQuery.event.trigger(event, data, parent, true);
                }
-
-               this.triggered = false;
        },
 
        handle: function(event) {
@@ -336,6 +331,7 @@ jQuery.event = {
        },
 
        proxy: function( fn, proxy ){
+               proxy = proxy || function(){ return fn.apply(this, arguments); };
                // Set the guid of unique handler to the same of original handler, so it can be removed
                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
                // So proxy can be declared as an argument
@@ -364,7 +360,7 @@ jQuery.event = {
                                                        remove++;
                                        });
                                        
-                                       if ( remove <= 1 )
+                                       if ( remove < 1 )
                                                jQuery.event.remove( this, namespaces[0], liveHandler );
                                }
                        }
@@ -548,12 +544,16 @@ jQuery.fn.extend({
        },
        
        live: function( type, fn ){
-               jQuery(document).bind( liveConvert(type, this.selector), this.selector, fn );
+               var proxy = jQuery.event.proxy( fn );
+               proxy.guid += this.selector;
+
+               jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+
                return this;
        },
        
        die: function( type, fn ){
-               jQuery(document).unbind( liveConvert(type, this.selector), fn );
+               jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector } : null );
                return this;
        }
 });