Stop trying to emulate the focus/blur event in IE, doesn't work as one might expect, anyway. Instead, implement the focusin/focusout events in all other browsers - which creates a much better parity across all browsers. Uses event capturing instead of bubbling to make it happen. Thanks to Alexander for the recommendation and to Joern Zaefferer for the original focus/blur delegation code.

This commit is contained in:
Jörn Zaefferer 2009-12-21 16:10:21 -05:00 committed by jeresig
parent 5dc6b7ce34
commit 03481a52c7
3 changed files with 39 additions and 17 deletions

View file

@ -720,24 +720,23 @@ function trigger( type, elem, args ) {
}
// Create "bubbling" focus and blur events
if ( !jQuery.support.focusBubbles ) {
if ( document.addEventListener ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ){
jQuery.event.special[ fix ] = {
setup: function() {
this.addEventListener( orig, handler, true );
},
teardown: function() {
this.removeEventListener( orig, handler, true );
}
};
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ){
jQuery.event.special[ orig ] = {
setup: function() {
jQuery.event.add( this, fix, ieHandler );
},
teardown: function() {
jQuery.event.remove( this, fix, ieHandler );
function handler( e ) {
e = jQuery.event.fix( e );
e.type = fix;
return jQuery.event.handle.call( this, e );
}
};
function ieHandler() {
arguments[0].type = orig;
return jQuery.event.handle.apply(this, arguments);
}
});
});
}
jQuery.each(["bind", "one"], function(i, name) {

View file

@ -111,7 +111,6 @@
jQuery.support.submitBubbles = eventSupported("submit");
jQuery.support.changeBubbles = eventSupported("change");
jQuery.support.focusBubbles = eventSupported("focus");
// release memory in IE
root = script = div = all = a = null;