From: Justin Meyer Date: Wed, 13 Oct 2010 14:35:28 +0000 (-0400) Subject: Make sure that focusin/focusout bubbles in non-IE browsers. X-Git-Tag: 1.4.3~15 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=88068f82c199847d3679b130664dd91cc2e89f00;p=jquery.git Make sure that focusin/focusout bubbles in non-IE browsers. --- diff --git a/src/event.js b/src/event.js index ab7567081..d830c4d98 100644 --- a/src/event.js +++ b/src/event.js @@ -7,7 +7,8 @@ var rnamespaces = /\.(.*)$/, rescape = /[^\w\s.|`]/g, fcleanup = function( nm ) { return nm.replace(rescape, "\\$&"); - }; + }, + focusCounts = { focusin: 0, focusout: 0 }; /* * A number of helper functions used for managing events. @@ -855,17 +856,21 @@ if ( document.addEventListener ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { jQuery.event.special[ fix ] = { setup: function() { - this.addEventListener( orig, handler, true ); + if ( focusCounts[fix]++ === 0 ) { + document.addEventListener( orig, handler, true ); + } }, teardown: function() { - this.removeEventListener( orig, handler, true ); + if ( --focusCounts[fix] === 0 ) { + document.removeEventListener( orig, handler, true ); + } } }; function handler( e ) { e = jQuery.event.fix( e ); e.type = fix; - return jQuery.event.handle.call( this, e ); + return jQuery.event.trigger( e, null, e.target ); } }); } diff --git a/test/unit/event.js b/test/unit/event.js index a51659ca4..829ef7bcb 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -1843,7 +1843,21 @@ test("window resize", function() { ok( !jQuery(window).data("__events__"), "Make sure all the events are gone." ); }); - +test("focusin bubbles", function(){ + //create an input and focusin on it + var input = jQuery(""), + order = 0; + input.appendTo(document.body); + jQuery(document.body).bind("focusin.focusinBubblesTest",function(){ + equals(1,order++,"focusin on the body second") + }) + input.bind("focusin.focusinBubblesTest",function(){ + equals(0,order++,"focusin on the element first") + }) + input[0].focus(); + input.remove(); + jQuery(document.body).unbind("focusin.focusinBubblesTest"); +}) /* test("jQuery(function($) {})", function() { stop();