X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=ff6067f371b7b3f0e6995fbfd2547e1f32a63214;hb=851846aabea72fe784b8a13cfb04cffecdb771b6;hp=26c56209fa868ff201d201d77f0e76f8ddf6c480;hpb=985856b823b1648bffc3fd63c1faf836d0ddaf7c;p=jquery.git diff --git a/src/event.js b/src/event.js index 26c5620..ff6067f 100644 --- a/src/event.js +++ b/src/event.js @@ -13,7 +13,7 @@ jQuery.event = { // For whatever reason, IE has trouble passing the window object // around, causing it to be cloned in the process - if ( elem.setInterval && elem != window ) + if ( elem.setInterval && ( elem != window && !elem.frameElement ) ) elem = window; // Make sure that the function being executed has a unique ID @@ -56,7 +56,7 @@ jQuery.event = { // Get the current list of functions bound to this event var handlers = events[type]; - + if ( jQuery.event.specialAll[type] ) jQuery.event.specialAll[type].setup.call(elem, data, namespaces); @@ -116,7 +116,8 @@ jQuery.event = { // Namespaced event handlers var namespaces = type.split("."); type = namespaces.shift(); - var namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); + var all = !namespaces.length, + namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); if ( events[type] ) { // remove the given handler for the given type @@ -127,9 +128,9 @@ jQuery.event = { else for ( var handle in events[type] ) // Handle the removal of namespaced events - if ( namespace.test(events[type][handle].type) ) + if ( all || namespace.test(events[type][handle].type) ) delete events[type][handle]; - + if ( jQuery.event.specialAll[type] ) jQuery.event.specialAll[type].teardown.call(elem, namespaces); @@ -196,11 +197,11 @@ jQuery.event = { // don't do events on text and comment nodes if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 ) return undefined; - + // Clean up in case it is reused event.result = undefined; event.target = elem; - + // Clone the incoming data, if any data = jQuery.makeArray(data); data.unshift( event ); @@ -241,14 +242,14 @@ jQuery.event = { event = arguments[0] = jQuery.event.fix( event || window.event ); event.currentTarget = this; - + // Namespaced event handlers var namespaces = event.type.split("."); event.type = namespaces.shift(); // Cache this now, all = true means, any handler all = !namespaces.length && !event.exclusive; - + var namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); handlers = ( jQuery.data(this, "events") || {} )[event.type]; @@ -280,7 +281,7 @@ jQuery.event = { } }, - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), fix: function(event) { if ( event[expando] ) @@ -346,7 +347,7 @@ jQuery.event = { teardown: function() {} } }, - + specialAll: { live: { setup: function( selector, namespaces ){ @@ -355,12 +356,12 @@ jQuery.event = { teardown: function( namespaces ){ if ( namespaces.length ) { var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)"); - + jQuery.each( (jQuery.data(this, "events").live || {}), function(){ if ( name.test(this.type) ) remove++; }); - + if ( remove < 1 ) jQuery.event.remove( this, namespaces[0], liveHandler ); } @@ -373,7 +374,7 @@ jQuery.Event = function( src ){ // Allow instantiation without the 'new' keyword if( !this.preventDefault ) return new jQuery.Event(src); - + // Event object if( src && src.type ){ this.originalEvent = src; @@ -385,7 +386,7 @@ jQuery.Event = function( src ){ // timeStamp is buggy for some events on Firefox(#3843) // So we won't rely on the native value this.timeStamp = now(); - + // Mark it as fixed this[expando] = true; }; @@ -441,7 +442,7 @@ var withinElement = function(event) { while ( parent && parent != this ) try { parent = parent.parentNode; } catch(e) { parent = this; } - + if( parent != this ){ // set the correct event type event.type = event.data; @@ -449,9 +450,9 @@ var withinElement = function(event) { jQuery.event.handle.apply( this, arguments ); } }; - -jQuery.each({ - mouseover: 'mouseenter', + +jQuery.each({ + mouseover: 'mouseenter', mouseout: 'mouseleave' }, function( orig, fix ){ jQuery.event.special[ fix ] = { @@ -461,7 +462,7 @@ jQuery.each({ teardown: function(){ jQuery.event.remove( this, orig, withinElement ); } - }; + }; }); jQuery.fn.extend({ @@ -500,7 +501,7 @@ jQuery.fn.extend({ event.stopPropagation(); jQuery.event.trigger( event, data, this[0] ); return event.result; - } + } }, toggle: function( fn ) { @@ -543,18 +544,18 @@ jQuery.fn.extend({ return this; }, - + live: function( type, fn ){ var proxy = jQuery.event.proxy( fn ); proxy.guid += this.selector + type; - jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy ); + jQuery( this.context ).bind( liveConvert(type, this.selector), this.selector, proxy ); return this; }, - + die: function( type, fn ){ - jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null ); + jQuery( this.context ).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null ); return this; } }); @@ -575,7 +576,7 @@ function liveHandler( event ){ elems.sort(function(a,b) { return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest"); }); - + jQuery.each(elems, function(){ event.currentTarget = this.elem; if ( this.fn.call(this.elem, event, this.fn.data) === false ) @@ -677,9 +678,12 @@ jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + // Prevent memory leaks in IE // And prevent errors on refresh with events like mouseover in other browsers // Window isn't included so as not to unbind existing unload events -jQuery( window ).bind( 'unload', function(){ +// More info: +// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ +// - https://bugzilla.mozilla.org/show_bug.cgi?id=252542 +jQuery( window ).bind( 'unload', function(){ for ( var id in jQuery.cache ) // Skip the window if ( id != 1 && jQuery.cache[ id ].handle ) jQuery.event.remove( jQuery.cache[ id ].handle.elem ); -}); +});