jquery event: Now using an internal argument to detect if bubbling on $.event.trigger. The other would fail when it receives an event object with target. Also, the target isn't nulled anymore.
In addition, there was a lot of code running O(n) during bubbling while not needed.
This commit is contained in:
parent
989e3f61f7
commit
b2552e6ea3
1 changed files with 65 additions and 70 deletions
131
src/event.js
131
src/event.js
|
@ -163,90 +163,85 @@ jQuery.event = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
trigger: function( event, data, elem) {
|
trigger: function( event, data, elem, bubbling /* internal */ ) {
|
||||||
// Event object or event type
|
// Event object or event type
|
||||||
var type = event.type || event;
|
var type = event.type || event;
|
||||||
|
|
||||||
event = typeof event === "object" ?
|
if( !bubbling ){
|
||||||
// jQuery.Event object
|
event = typeof event === "object" ?
|
||||||
event[expando] ? event :
|
// jQuery.Event object
|
||||||
// Object literal
|
event[expando] ? event :
|
||||||
jQuery.extend( jQuery.Event(type), event ) :
|
// Object literal
|
||||||
// Just the event type (string)
|
jQuery.extend( jQuery.Event(type), event ) :
|
||||||
jQuery.Event(type);
|
// Just the event type (string)
|
||||||
|
jQuery.Event(type);
|
||||||
|
|
||||||
if ( type.indexOf("!") >= 0 ) {
|
if ( type.indexOf("!") >= 0 ) {
|
||||||
event.type = type = type.slice(0, -1);
|
event.type = type = type.slice(0, -1);
|
||||||
event.exclusive = true;
|
event.exclusive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle a global trigger
|
// Handle a global trigger
|
||||||
if ( !elem ) {
|
if ( !elem ) {
|
||||||
// Don't bubble custom events when global (to avoid too much overhead)
|
// Don't bubble custom events when global (to avoid too much overhead)
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
// Only trigger if we've ever bound an event for it
|
// Only trigger if we've ever bound an event for it
|
||||||
if ( this.global[type] )
|
if ( this.global[type] )
|
||||||
jQuery.each( jQuery.cache, function(){
|
jQuery.each( jQuery.cache, function(){
|
||||||
if ( this.events && this.events[type] )
|
if ( this.events && this.events[type] )
|
||||||
jQuery.event.trigger( event, data, this.handle.elem );
|
jQuery.event.trigger( event, data, this.handle.elem );
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Handle triggering a single element
|
// Handle triggering a single element
|
||||||
} else {
|
|
||||||
|
|
||||||
// don't do events on text and comment nodes
|
// don't do events on text and comment nodes
|
||||||
if ( elem.nodeType == 3 || elem.nodeType == 8 )
|
if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|
||||||
// Clone the incoming data, if any
|
|
||||||
data = jQuery.makeArray(data);
|
|
||||||
|
|
||||||
// AT_TARGET phase (not bubbling)
|
// AT_TARGET phase (not bubbling)
|
||||||
if( !event.target ){
|
if( !bubbling ){
|
||||||
// Clean up in case it is reused
|
// Clean up in case it is reused
|
||||||
event.result = undefined;
|
event.result = undefined;
|
||||||
event.target = elem;
|
event.target = elem;
|
||||||
|
|
||||||
|
// Clone the incoming data, if any
|
||||||
|
data = jQuery.makeArray(data);
|
||||||
|
data.unshift( event );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix for custom events
|
|
||||||
event.currentTarget = elem;
|
|
||||||
|
|
||||||
data.unshift( event );
|
|
||||||
|
|
||||||
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 )
|
|
||||||
event.result = false;
|
|
||||||
|
|
||||||
// Extra functions don't get the custom event object
|
|
||||||
data.shift();
|
|
||||||
|
|
||||||
// Trigger the native events (except for clicks on links)
|
|
||||||
if ( event.target === elem && fn && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
|
|
||||||
this.triggered = true;
|
|
||||||
try {
|
|
||||||
elem[ type ]();
|
|
||||||
// prevent IE from throwing an error for some hidden elements
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !event.isPropagationStopped() ) {
|
|
||||||
var parent = elem.parentNode || elem.ownerDocument;
|
|
||||||
if ( parent )
|
|
||||||
jQuery.event.trigger(event, data, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean up, in case the event object is reused
|
|
||||||
event.target = null;
|
|
||||||
|
|
||||||
this.triggered = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 )
|
||||||
|
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") ) {
|
||||||
|
this.triggered = true;
|
||||||
|
try {
|
||||||
|
elem[ type ]();
|
||||||
|
// prevent IE from throwing an error for some hidden elements
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !event.isPropagationStopped() ) {
|
||||||
|
var parent = elem.parentNode || elem.ownerDocument;
|
||||||
|
if ( parent )
|
||||||
|
jQuery.event.trigger(event, data, parent, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.triggered = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
handle: function(event) {
|
handle: function(event) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue