@@ -70,10 +70,10 @@ jQuery.event = {
70
70
}
71
71
72
72
if ( ! eventHandle ) {
73
- elemData . handle = eventHandle = function ( ) {
73
+ elemData . handle = eventHandle = function ( e ) {
74
74
// Handle the second event of a trigger and when
75
75
// an event is called after a page has unloaded
76
- return typeof jQuery !== "undefined" && ! jQuery . event . triggered ?
76
+ return typeof jQuery !== "undefined" && jQuery . event . triggered !== e . type ?
77
77
jQuery . event . handle . apply ( eventHandle . elem , arguments ) :
78
78
undefined ;
79
79
} ;
@@ -380,7 +380,7 @@ jQuery.event = {
380
380
target [ "on" + targetType ] = null ;
381
381
}
382
382
383
- jQuery . event . triggered = true ;
383
+ jQuery . event . triggered = event . type ;
384
384
target [ targetType ] ( ) ;
385
385
}
386
386
@@ -391,7 +391,7 @@ jQuery.event = {
391
391
target [ "on" + targetType ] = old ;
392
392
}
393
393
394
- jQuery . event . triggered = false ;
394
+ jQuery . event . triggered = undefined ;
395
395
}
396
396
}
397
397
} ,
@@ -868,19 +868,33 @@ function trigger( type, elem, args ) {
868
868
// Create "bubbling" focus and blur events
869
869
if ( document . addEventListener ) {
870
870
jQuery . each ( { focus : "focusin" , blur : "focusout" } , function ( orig , fix ) {
871
+
872
+ // Attach a single capturing handler while someone wants focusin/focusout
873
+ var attaches = 0 ;
874
+
871
875
jQuery . event . special [ fix ] = {
872
876
setup : function ( ) {
873
- this . addEventListener ( orig , handler , true ) ;
877
+ if ( attaches ++ === 0 ) {
878
+ document . addEventListener ( orig , handler , true ) ;
879
+ }
874
880
} ,
875
881
teardown : function ( ) {
876
- this . removeEventListener ( orig , handler , true ) ;
882
+ if ( -- attaches === 0 ) {
883
+ document . removeEventListener ( orig , handler , true ) ;
884
+ }
877
885
}
878
886
} ;
879
887
880
- function handler ( e ) {
881
- e = jQuery . event . fix ( e ) ;
888
+ function handler ( donor ) {
889
+ // Donor event is always a native one; fix it and switch its type.
890
+ // Let focusin/out handler cancel the donor focus/blur event.
891
+ var e = jQuery . event . fix ( donor ) ;
882
892
e . type = fix ;
883
- return jQuery . event . handle . call ( this , e ) ;
893
+ e . originalEvent = { } ;
894
+ jQuery . event . trigger ( e , null , e . target ) ;
895
+ if ( e . isDefaultPrevented ( ) ) {
896
+ donor . preventDefault ( ) ;
897
+ }
884
898
}
885
899
} ) ;
886
900
}
0 commit comments