@@ -70,10 +70,10 @@ jQuery.event = {
7070 }
7171
7272 if ( ! eventHandle ) {
73- elemData . handle = eventHandle = function ( ) {
73+ elemData . handle = eventHandle = function ( e ) {
7474 // Handle the second event of a trigger and when
7575 // 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 ?
7777 jQuery . event . handle . apply ( eventHandle . elem , arguments ) :
7878 undefined ;
7979 } ;
@@ -380,7 +380,7 @@ jQuery.event = {
380380 target [ "on" + targetType ] = null ;
381381 }
382382
383- jQuery . event . triggered = true ;
383+ jQuery . event . triggered = event . type ;
384384 target [ targetType ] ( ) ;
385385 }
386386
@@ -391,7 +391,7 @@ jQuery.event = {
391391 target [ "on" + targetType ] = old ;
392392 }
393393
394- jQuery . event . triggered = false ;
394+ jQuery . event . triggered = undefined ;
395395 }
396396 }
397397 } ,
@@ -868,19 +868,33 @@ function trigger( type, elem, args ) {
868868// Create "bubbling" focus and blur events
869869if ( document . addEventListener ) {
870870 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+
871875 jQuery . event . special [ fix ] = {
872876 setup : function ( ) {
873- this . addEventListener ( orig , handler , true ) ;
877+ if ( attaches ++ === 0 ) {
878+ document . addEventListener ( orig , handler , true ) ;
879+ }
874880 } ,
875881 teardown : function ( ) {
876- this . removeEventListener ( orig , handler , true ) ;
882+ if ( -- attaches === 0 ) {
883+ document . removeEventListener ( orig , handler , true ) ;
884+ }
877885 }
878886 } ;
879887
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 ) ;
882892 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+ }
884898 }
885899 } ) ;
886900}
0 commit comments