aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorjeresig <jeresig@gmail.com>2011-03-21 10:53:18 -0400
committerjeresig <jeresig@gmail.com>2011-03-21 10:53:18 -0400
commit5c79f82ec2e866a5d7cd1775382f6221e3937275 (patch)
tree20547cd43549ba11b7d437abfdf7e3c1d2c13feb /src
parent8a1156da9b835d826bfb4b82c41bcdd0d87aff05 (diff)
parent55ec6a71d2378a5301af71c2c0080e15289c3f78 (diff)
downloadjquery-5c79f82ec2e866a5d7cd1775382f6221e3937275.tar.gz
jquery-5c79f82ec2e866a5d7cd1775382f6221e3937275.zip
Merge branch 'fix-7340-focusin-focusout-bubble' of https://github.com/dmethvin/jquery into dmethvin-fix-7340-focusin-focusout-bubble
Diffstat (limited to 'src')
-rw-r--r--src/event.js32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/event.js b/src/event.js
index f7e0a08c0..61c8a93fd 100644
--- a/src/event.js
+++ b/src/event.js
@@ -70,10 +70,10 @@ jQuery.event = {
}
if ( !eventHandle ) {
- elemData.handle = eventHandle = function() {
+ elemData.handle = eventHandle = function( e ) {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
@@ -380,7 +380,7 @@ jQuery.event = {
target[ "on" + targetType ] = null;
}
- jQuery.event.triggered = true;
+ jQuery.event.triggered = event.type;
target[ targetType ]();
}
@@ -391,7 +391,7 @@ jQuery.event = {
target[ "on" + targetType ] = old;
}
- jQuery.event.triggered = false;
+ jQuery.event.triggered = undefined;
}
}
},
@@ -868,19 +868,33 @@ function trigger( type, elem, args ) {
// Create "bubbling" focus and blur events
if ( document.addEventListener ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler while someone wants focusin/focusout
+ var attaches = 0;
+
jQuery.event.special[ fix ] = {
setup: function() {
- this.addEventListener( orig, handler, true );
+ if ( attaches++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
},
teardown: function() {
- this.removeEventListener( orig, handler, true );
+ if ( --attaches === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
}
};
- function handler( e ) {
- e = jQuery.event.fix( e );
+ function handler( donor ) {
+ // Donor event is always a native one; fix it and switch its type.
+ // Let focusin/out handler cancel the donor focus/blur event.
+ var e = jQuery.event.fix( donor );
e.type = fix;
- return jQuery.event.handle.call( this, e );
+ e.originalEvent = {};
+ jQuery.event.trigger( e, null, e.target );
+ if ( e.isDefaultPrevented() ) {
+ donor.preventDefault();
+ }
}
});
}