X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=405e19f4d0f268075f5164aa067603ff080a858e;hb=d12e8a34e6d96f98ac4f9408a0d61a9ed373f917;hp=c7e2f4f43560d5467d25e81579497139b25a3c9a;hpb=b2552e6ea35a1e00675d70a615d3af83137965df;p=jquery.git diff --git a/src/event.js b/src/event.js index c7e2f4f..405e19f 100644 --- a/src/event.js +++ b/src/event.js @@ -26,10 +26,7 @@ jQuery.event = { var fn = handler; // Create unique handler function, wrapped around original handler - handler = this.proxy( fn, function() { - // Pass arguments and context to original handler - return fn.apply(this, arguments); - }); + handler = this.proxy( fn ); // Store data in unique handler handler.data = data; @@ -128,10 +125,10 @@ jQuery.event = { // remove all handlers for the given type else - for ( handler in events[type] ) + for ( var handle in events[type] ) // Handle the removal of namespaced events - if ( namespace.test(events[type][handler].type) ) - delete events[type][handler]; + if ( namespace.test(events[type][handle].type) ) + delete events[type][handle]; if ( jQuery.event.specialAll[type] ) jQuery.event.specialAll[type].teardown.call(elem, namespaces); @@ -163,7 +160,8 @@ jQuery.event = { } }, - trigger: function( event, data, elem, bubbling /* internal */ ) { + // bubbling is internal + trigger: function( event, data, elem, bubbling ) { // Event object or event type var type = event.type || event; @@ -199,35 +197,28 @@ jQuery.event = { if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 ) return undefined; - // AT_TARGET phase (not bubbling) - if( !bubbling ){ - // 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 ); - } + // 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 ); } event.currentTarget = elem; - var fn = jQuery.isFunction( elem[ type ] ); - // Trigger the event, it is assumed that "handle" is a function var handle = jQuery.data(elem, "handle"); if ( handle ) handle.apply( elem, data ); // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) - if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) + if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) event.result = false; - // data.shift(); - // Trigger the native events (except for clicks on links) - if ( !bubbling && fn && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) { + if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) { this.triggered = true; try { elem[ type ](); @@ -235,13 +226,13 @@ jQuery.event = { } catch (e) {} } + this.triggered = false; + if ( !event.isPropagationStopped() ) { var parent = elem.parentNode || elem.ownerDocument; if ( parent ) jQuery.event.trigger(event, data, parent, true); } - - this.triggered = false; }, handle: function(event) { @@ -340,6 +331,7 @@ jQuery.event = { }, proxy: function( fn, proxy ){ + proxy = proxy || function(){ return fn.apply(this, arguments); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; // So proxy can be declared as an argument @@ -368,7 +360,7 @@ jQuery.event = { remove++; }); - if ( remove <= 1 ) + if ( remove < 1 ) jQuery.event.remove( this, namespaces[0], liveHandler ); } } @@ -552,12 +544,16 @@ jQuery.fn.extend({ }, live: function( type, fn ){ - jQuery(document).bind( liveConvert(type, this.selector), this.selector, fn ); + var proxy = jQuery.event.proxy( fn ); + proxy.guid += this.selector; + + jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy ); + return this; }, die: function( type, fn ){ - jQuery(document).unbind( liveConvert(type, this.selector), fn ); + jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector } : null ); return this; } }); @@ -567,7 +563,7 @@ function liveHandler( event ){ stop = true; jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){ - if ( check.test(fn.type) ) { + if ( !event.isImmediatePropagationStopped() && check.test(fn.type) ) { var elem = jQuery(event.target).closest(fn.data)[0]; if ( elem && fn.call(elem, event, fn.data) === false ) stop = false; @@ -577,7 +573,7 @@ function liveHandler( event ){ } function liveConvert(type, selector){ - return ["live", type, selector.replace(/\./g, "_")].join("."); + return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join("."); } jQuery.extend({