@@ -307,17 +307,23 @@ function jqLiteOff(element, type, fn, unsupported) {
307
307
delete events [ type ] ;
308
308
}
309
309
} else {
310
- forEach ( type . split ( ' ' ) , function ( type ) {
310
+
311
+ var removeHandler = function ( type ) {
312
+ var listenerFns = events [ type ] ;
311
313
if ( isDefined ( fn ) ) {
312
- var listenerFns = events [ type ] ;
313
314
arrayRemove ( listenerFns || [ ] , fn ) ;
314
- if ( listenerFns && listenerFns . length > 0 ) {
315
- return ;
316
- }
317
315
}
316
+ if ( ! ( isDefined ( fn ) && listenerFns && listenerFns . length > 0 ) ) {
317
+ removeEventListenerFn ( element , type , handle ) ;
318
+ delete events [ type ] ;
319
+ }
320
+ } ;
318
321
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
+ }
321
327
} ) ;
322
328
}
323
329
}
@@ -772,14 +778,17 @@ function createEventHandler(element, events) {
772
778
return event . immediatePropagationStopped === true ;
773
779
} ;
774
780
781
+ // Some events have special handlers that wrap the real handler
782
+ var handlerWrapper = eventFns . specialHandlerWrapper || defaultHandlerWrapper ;
783
+
775
784
// Copy event handlers in case event handlers array is modified during execution.
776
785
if ( ( eventFnsLength > 1 ) ) {
777
786
eventFns = shallowCopy ( eventFns ) ;
778
787
}
779
788
780
789
for ( var i = 0 ; i < eventFnsLength ; i ++ ) {
781
790
if ( ! event . isImmediatePropagationStopped ( ) ) {
782
- eventFns [ i ] . call ( element , event ) ;
791
+ handlerWrapper ( element , event , eventFns [ i ] ) ;
783
792
}
784
793
}
785
794
} ;
@@ -790,6 +799,22 @@ function createEventHandler(element, events) {
790
799
return eventHandler ;
791
800
}
792
801
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
+
793
818
//////////////////////////////////////////
794
819
// Functions iterating traversal.
795
820
// These functions chain results into a single
@@ -818,35 +843,28 @@ forEach({
818
843
var types = type . indexOf ( ' ' ) >= 0 ? type . split ( ' ' ) : [ type ] ;
819
844
var i = types . length ;
820
845
821
- while ( i -- ) {
822
- type = types [ i ] ;
846
+ var addHandler = function ( type , specialHandlerWrapper , noEventListener ) {
823
847
var eventFns = events [ type ] ;
824
848
825
849
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 ) ;
846
854
}
847
- eventFns = events [ type ] ;
848
855
}
856
+
849
857
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
+ }
850
868
}
851
869
} ,
852
870
0 commit comments