X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fevent.js;h=d830c4d98e05a98fe79f491e6794578ec5049ef9;hb=88068f82c199847d3679b130664dd91cc2e89f00;hp=7a10a12cb182a47e19269668a1c08ce6bed54dd1;hpb=884de15fb970affd0b1697245795bce7b231a1db;p=jquery.git diff --git a/src/event.js b/src/event.js index 7a10a12..d830c4d 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. @@ -54,7 +55,10 @@ jQuery.event = { return; } - var events = elemData.events, + // Use a key less likely to result in collisions for plain JS objects. + // Fixes bug #7150. + var eventKey = elem.nodeType ? "events" : "__events__", + events = elemData[ eventKey ], eventHandle = elemData.handle; if ( typeof events === "function" ) { @@ -68,7 +72,7 @@ jQuery.event = { if ( !elem.nodeType ) { // On plain objects, create a fn that acts as the holder // of the values to avoid JSON serialization of event data - elemData.events = elemData = function(){}; + elemData[ eventKey ] = elemData = function(){}; } elemData.events = events = {}; @@ -170,8 +174,9 @@ jQuery.event = { } var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + eventKey = elem.nodeType ? "events" : "__events__", elemData = jQuery.data( elem ), - events = elemData && elemData.events; + events = elemData && elemData[ eventKey ]; if ( !elemData || !events ) { return; @@ -282,7 +287,7 @@ jQuery.event = { delete elemData.handle; if ( typeof elemData === "function" ) { - delete elem.events; + jQuery.removeData( elem, eventKey ); } else if ( jQuery.isEmptyObject( elemData ) ) { jQuery.removeData( elem ); @@ -346,7 +351,7 @@ jQuery.event = { // Trigger the event, it is assumed that "handle" is a function var handle = elem.nodeType ? jQuery.data( elem, "handle" ) : - elem.events && elem.events.handle; + (jQuery.data( elem, "__events__" ) || {}).handle; if ( handle ) { handle.apply( elem, data ); @@ -420,7 +425,7 @@ jQuery.event = { event.namespace = event.namespace || namespace_sort.join("."); - events = jQuery.data(this, "events"); + events = jQuery.data(this, this.nodeType ? "events" : "__events__"); if ( typeof events === "function" ) { events = events.events; @@ -851,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 ); } }); } @@ -1044,7 +1053,7 @@ jQuery.each(["live", "die"], function( i, name ) { function liveHandler( event ) { var stop, maxLevel, elems = [], selectors = [], related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - events = jQuery.data( this, "events" ); + events = jQuery.data( this, this.nodeType ? "events" : "__events__" ); if ( typeof events === "function" ) { events = events.events;