@@ -307,17 +307,23 @@ function jqLiteOff(element, type, fn, unsupported) {
307307 delete events [ type ] ;
308308 }
309309 } else {
310- forEach ( type . split ( ' ' ) , function ( type ) {
310+
311+ var removeHandler = function ( type ) {
312+ var listenerFns = events [ type ] ;
311313 if ( isDefined ( fn ) ) {
312- var listenerFns = events [ type ] ;
313314 arrayRemove ( listenerFns || [ ] , fn ) ;
314- if ( listenerFns && listenerFns . length > 0 ) {
315- return ;
316- }
317315 }
316+ if ( ! ( isDefined ( fn ) && listenerFns && listenerFns . length > 0 ) ) {
317+ removeEventListenerFn ( element , type , handle ) ;
318+ delete events [ type ] ;
319+ }
320+ } ;
318321
319- removeEventListenerFn ( element , type , handle ) ;
320- delete events [ type ] ;
322+ forEach ( type . split ( ' ' ) , function ( type ) {
323+ removeHandler ( type ) ;
324+ if ( MOUSE_EVENT_MAP [ type ] ) {
325+ removeHandler ( MOUSE_EVENT_MAP [ type ] ) ;
326+ }
321327 } ) ;
322328 }
323329}
@@ -772,14 +778,17 @@ function createEventHandler(element, events) {
772778 return event . immediatePropagationStopped === true ;
773779 } ;
774780
781+ // Some events have special handlers that wrap the real handler
782+ var handlerWrapper = eventFns . specialHandlerWrapper || defaultHandlerWrapper ;
783+
775784 // Copy event handlers in case event handlers array is modified during execution.
776785 if ( ( eventFnsLength > 1 ) ) {
777786 eventFns = shallowCopy ( eventFns ) ;
778787 }
779788
780789 for ( var i = 0 ; i < eventFnsLength ; i ++ ) {
781790 if ( ! event . isImmediatePropagationStopped ( ) ) {
782- eventFns [ i ] . call ( element , event ) ;
791+ handlerWrapper ( element , event , eventFns [ i ] ) ;
783792 }
784793 }
785794 } ;
@@ -790,6 +799,22 @@ function createEventHandler(element, events) {
790799 return eventHandler ;
791800}
792801
802+ function defaultHandlerWrapper ( element , event , handler ) {
803+ handler . call ( element , event ) ;
804+ }
805+
806+ function specialMouseHandlerWrapper ( target , event , handler ) {
807+ // Refer to jQuery's implementation of mouseenter & mouseleave
808+ // Read about mouseenter and mouseleave:
809+ // http://www.quirksmode.org/js/events_mouse.html#link8
810+ var related = event . relatedTarget ;
811+ // For mousenter/leave call the handler if related is outside the target.
812+ // NB: No relatedTarget if the mouse left/entered the browser window
813+ if ( ! related || ( related !== target && ! jqLiteContains . call ( target , related ) ) ) {
814+ handler . call ( target , event ) ;
815+ }
816+ }
817+
793818//////////////////////////////////////////
794819// Functions iterating traversal.
795820// These functions chain results into a single
@@ -818,35 +843,28 @@ forEach({
818843 var types = type . indexOf ( ' ' ) >= 0 ? type . split ( ' ' ) : [ type ] ;
819844 var i = types . length ;
820845
821- while ( i -- ) {
822- type = types [ i ] ;
846+ var addHandler = function ( type , specialHandlerWrapper , noEventListener ) {
823847 var eventFns = events [ type ] ;
824848
825849 if ( ! eventFns ) {
826- events [ type ] = [ ] ;
827-
828- if ( type === 'mouseenter' || type === 'mouseleave' ) {
829- // Refer to jQuery's implementation of mouseenter & mouseleave
830- // Read about mouseenter and mouseleave:
831- // http://www.quirksmode.org/js/events_mouse.html#link8
832-
833- jqLiteOn ( element , MOUSE_EVENT_MAP [ type ] , function ( event ) {
834- var target = this , related = event . relatedTarget ;
835- // For mousenter/leave call the handler if related is outside the target.
836- // NB: No relatedTarget if the mouse left/entered the browser window
837- if ( ! related || ( related !== target && ! jqLiteContains . call ( target , related ) ) ) {
838- handle ( event , type ) ;
839- }
840- } ) ;
841-
842- } else {
843- if ( type !== '$destroy' ) {
844- addEventListenerFn ( element , type , handle ) ;
845- }
850+ eventFns = events [ type ] = [ ] ;
851+ eventFns . specialHandlerWrapper = specialHandlerWrapper ;
852+ if ( type !== '$destroy' && ! noEventListener ) {
853+ addEventListenerFn ( element , type , handle ) ;
846854 }
847- eventFns = events [ type ] ;
848855 }
856+
849857 eventFns . push ( fn ) ;
858+ } ;
859+
860+ while ( i -- ) {
861+ type = types [ i ] ;
862+ if ( MOUSE_EVENT_MAP [ type ] ) {
863+ addHandler ( MOUSE_EVENT_MAP [ type ] , specialMouseHandlerWrapper ) ;
864+ addHandler ( type , undefined , true ) ;
865+ } else {
866+ addHandler ( type ) ;
867+ }
850868 }
851869 } ,
852870
0 commit comments