@@ -313,17 +313,23 @@ function jqLiteOff(element, type, fn, unsupported) {
313
313
delete events [ type ] ;
314
314
}
315
315
} else {
316
- forEach ( type . split ( ' ' ) , function ( type ) {
316
+
317
+ var removeHandler = function ( type ) {
318
+ var listenerFns = events [ type ] ;
317
319
if ( isDefined ( fn ) ) {
318
- var listenerFns = events [ type ] ;
319
320
arrayRemove ( listenerFns || [ ] , fn ) ;
320
- if ( listenerFns && listenerFns . length > 0 ) {
321
- return ;
322
- }
323
321
}
322
+ if ( ! ( isDefined ( fn ) && listenerFns && listenerFns . length > 0 ) ) {
323
+ removeEventListenerFn ( element , type , handle ) ;
324
+ delete events [ type ] ;
325
+ }
326
+ } ;
324
327
325
- removeEventListenerFn ( element , type , handle ) ;
326
- delete events [ type ] ;
328
+ forEach ( type . split ( ' ' ) , function ( type ) {
329
+ removeHandler ( type ) ;
330
+ if ( MOUSE_EVENT_MAP [ type ] ) {
331
+ removeHandler ( MOUSE_EVENT_MAP [ type ] ) ;
332
+ }
327
333
} ) ;
328
334
}
329
335
}
@@ -779,14 +785,17 @@ function createEventHandler(element, events) {
779
785
return event . immediatePropagationStopped === true ;
780
786
} ;
781
787
788
+ // Some events have special handlers that wrap the real handler
789
+ var handlerWrapper = eventFns . specialHandlerWrapper || defaultHandlerWrapper ;
790
+
782
791
// Copy event handlers in case event handlers array is modified during execution.
783
792
if ( ( eventFnsLength > 1 ) ) {
784
793
eventFns = shallowCopy ( eventFns ) ;
785
794
}
786
795
787
796
for ( var i = 0 ; i < eventFnsLength ; i ++ ) {
788
797
if ( ! event . isImmediatePropagationStopped ( ) ) {
789
- eventFns [ i ] . call ( element , event ) ;
798
+ handlerWrapper ( element , event , eventFns [ i ] ) ;
790
799
}
791
800
}
792
801
} ;
@@ -797,6 +806,22 @@ function createEventHandler(element, events) {
797
806
return eventHandler ;
798
807
}
799
808
809
+ function defaultHandlerWrapper ( element , event , handler ) {
810
+ handler . call ( element , event ) ;
811
+ }
812
+
813
+ function specialMouseHandlerWrapper ( target , event , handler ) {
814
+ // Refer to jQuery's implementation of mouseenter & mouseleave
815
+ // Read about mouseenter and mouseleave:
816
+ // http://www.quirksmode.org/js/events_mouse.html#link8
817
+ var related = event . relatedTarget ;
818
+ // For mousenter/leave call the handler if related is outside the target.
819
+ // NB: No relatedTarget if the mouse left/entered the browser window
820
+ if ( ! related || ( related !== target && ! jqLiteContains . call ( target , related ) ) ) {
821
+ handler . call ( target , event ) ;
822
+ }
823
+ }
824
+
800
825
//////////////////////////////////////////
801
826
// Functions iterating traversal.
802
827
// These functions chain results into a single
@@ -825,35 +850,28 @@ forEach({
825
850
var types = type . indexOf ( ' ' ) >= 0 ? type . split ( ' ' ) : [ type ] ;
826
851
var i = types . length ;
827
852
828
- while ( i -- ) {
829
- type = types [ i ] ;
853
+ var addHandler = function ( type , specialHandlerWrapper , noEventListener ) {
830
854
var eventFns = events [ type ] ;
831
855
832
856
if ( ! eventFns ) {
833
- events [ type ] = [ ] ;
834
-
835
- if ( type === 'mouseenter' || type === 'mouseleave' ) {
836
- // Refer to jQuery's implementation of mouseenter & mouseleave
837
- // Read about mouseenter and mouseleave:
838
- // http://www.quirksmode.org/js/events_mouse.html#link8
839
-
840
- jqLiteOn ( element , MOUSE_EVENT_MAP [ type ] , function ( event ) {
841
- var target = this , related = event . relatedTarget ;
842
- // For mousenter/leave call the handler if related is outside the target.
843
- // NB: No relatedTarget if the mouse left/entered the browser window
844
- if ( ! related || ( related !== target && ! jqLiteContains . call ( target , related ) ) ) {
845
- handle ( event , type ) ;
846
- }
847
- } ) ;
848
-
849
- } else {
850
- if ( type !== '$destroy' ) {
851
- addEventListenerFn ( element , type , handle ) ;
852
- }
857
+ eventFns = events [ type ] = [ ] ;
858
+ eventFns . specialHandlerWrapper = specialHandlerWrapper ;
859
+ if ( type !== '$destroy' && ! noEventListener ) {
860
+ addEventListenerFn ( element , type , handle ) ;
853
861
}
854
- eventFns = events [ type ] ;
855
862
}
863
+
856
864
eventFns . push ( fn ) ;
865
+ } ;
866
+
867
+ while ( i -- ) {
868
+ type = types [ i ] ;
869
+ if ( MOUSE_EVENT_MAP [ type ] ) {
870
+ addHandler ( MOUSE_EVENT_MAP [ type ] , specialMouseHandlerWrapper ) ;
871
+ addHandler ( type , undefined , true ) ;
872
+ } else {
873
+ addHandler ( type ) ;
874
+ }
857
875
}
858
876
} ,
859
877
0 commit comments