X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=b4b4da927d0e48d43661e7b09e72a40852bf1f30;hb=9d1bfeb7ffe63b5a7488929b7be847bc1a00f6a6;hp=ab7567081532fcedbdf8ccfd12d9e106fe1d030e;hpb=1518ae1aedaafa820ed689ecf26cf43e92913896;p=jquery.git diff --git a/src/event.js b/src/event.js index ab75670..b4b4da9 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. @@ -31,6 +32,9 @@ jQuery.event = { if ( handler === false ) { handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; } var handleObjIn, handleObj; @@ -791,6 +795,8 @@ if ( !jQuery.support.changeBubbles ) { filters: { focusout: testChange, + beforedeactivate: testChange, + click: function( e ) { var elem = e.target, type = elem.type; @@ -855,17 +861,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 ); } }); } @@ -1058,7 +1068,7 @@ function liveHandler( event ) { if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { return; } - + if ( event.namespace ) { namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); } @@ -1122,6 +1132,9 @@ function liveHandler( event ) { if ( ret === false ) { stop = false; } + if ( event.isImmediatePropagationStopped() ) { + break; + } } }