Merge branch 'master' of git@github.com:jquery/jquery
authorJohn Resig <jeresig@gmail.com>
Mon, 9 Nov 2009 12:01:10 +0000 (13:01 +0100)
committerJohn Resig <jeresig@gmail.com>
Mon, 9 Nov 2009 12:01:10 +0000 (13:01 +0100)
1  2 
src/event.js

diff --combined src/event.js
@@@ -517,14 -517,6 +517,14 @@@ var withinElement = function( event ) 
                // handle event if we actually just moused on to a non sub-element
                jQuery.event.handle.apply( this, arguments );
        }
 +
 +},
 +
 +// In case of event delegation, we only need to rename the event.type,
 +// liveHandler will take care of the rest.
 +delegate = function( event ) {
 +      event.type = event.data;
 +      jQuery.event.handle.apply( this, arguments );
  };
  
  // Create mouseenter and mouseleave events
@@@ -533,11 -525,11 +533,11 @@@ jQuery.each(
        mouseout: "mouseleave"
  }, function( orig, fix ) {
        jQuery.event.special[ fix ] = {
 -              setup: function(){
 -                      jQuery.event.add( this, orig, withinElement, fix );
 +              setup: function(data){
 +                      jQuery.event.add( this, orig, data && data.selector ? delegate : withinElement, fix );
                },
 -              teardown: function(){
 -                      jQuery.event.remove( this, orig, withinElement );
 +              teardown: function(data){
 +                      jQuery.event.remove( this, orig, data && data.selector ? delegate : withinElement );
                }
        };
  });
@@@ -583,7 -575,6 +583,6 @@@ jQuery.each(
        blur: "focusout"
  }, function( orig, fix ){
        var event = jQuery.event,
-               special = event.special,
                handle = event.handle;
        
        function ieHandler() { 
                return handle.apply(this, arguments);
        }
  
-       special[orig] = {
+       event.special[orig] = {
                setup:function() {
                        if ( this.addEventListener )
                                this.addEventListener( orig, handle, true );
                        else
-                               jQuery.event.add( this, fix, ieHandler );
+                               event.add( this, fix, ieHandler );
                }, 
                teardown:function() { 
                        if ( this.removeEventListener )
                                this.removeEventListener( orig, handle, true );
                        else
-                               jQuery.event.remove( this, fix, ieHandler );
+                               event.remove( this, fix, ieHandler );
                }
        };
  });
@@@ -751,17 -742,9 +750,17 @@@ function liveHandler( event ) 
  
        jQuery.each( jQuery.data( this, "events" ).live || [], function( i, fn ) {
                if ( fn.live === event.type ) {
 -                      var elem = jQuery( event.target ).closest( fn.selector, event.currentTarget )[0];
 +                      var elem = jQuery( event.target ).closest( fn.selector, event.currentTarget )[0],
 +                              related;
                        if ( elem ) {
 -                              elems.push({ elem: elem, fn: fn, closer: jQuery.lastCloser });
 +                              // Those two events require additional checking
 +                              if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) {
 +                                      related = jQuery( event.relatedTarget ).closest( fn.selector )[0];
 +                              }
 +
 +                              if ( !related || related !== elem ) {
 +                                      elems.push({ elem: elem, fn: fn });
 +                              }
                        }
                }
        });