Follow-up to #8790. Delay the creation of a jQuery.Event until we know it will need to be triggered.

This commit is contained in:
Dave Methvin 2011-04-16 20:48:27 -04:00
parent 94ee3e9743
commit 235080e125

View file

@ -275,7 +275,7 @@ jQuery.event = {
"changeData": true "changeData": true
}, },
trigger: function( event, data, elem ) { trigger: function( event, data, elem, onlyHandlers ) {
// Event object or event type // Event object or event type
var type = event.type || event, var type = event.type || event,
namespaces = [], namespaces = [],
@ -294,7 +294,7 @@ jQuery.event = {
namespaces.sort(); namespaces.sort();
} }
if ( jQuery.event.customEvent[ type ] && !jQuery.event.global[ type ] ) { if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
// No jQuery handlers for this event type, and it can't have inline handlers // No jQuery handlers for this event type, and it can't have inline handlers
return; return;
} }
@ -309,30 +309,29 @@ jQuery.event = {
new jQuery.Event( type ); new jQuery.Event( type );
event.type = type; event.type = type;
event.exclusive = exclusive;
event.namespace = namespaces.join("."); event.namespace = namespaces.join(".");
event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
event.exclusive = exclusive;
// triggerHandler() and global events don't bubble or run the default action
if ( onlyHandlers || !elem ) {
event.preventDefault();
event.stopPropagation();
}
// Handle a global trigger // Handle a global trigger
if ( !elem ) { if ( !elem ) {
// Don't bubble custom events when global (to avoid too much overhead) // TODO: Stop taunting the data cache; remove global events and always attach to document
event.stopPropagation(); jQuery.each( jQuery.cache, function() {
// internalKey variable is just used to make it easier to find
// Save some time, only trigger if we've ever bound an event for this type // and potentially change this stuff later; currently it just
if ( jQuery.event.global[ type ] ) { // points to jQuery.expando
// XXX This code smells terrible. event.js should not be directly var internalKey = jQuery.expando,
// inspecting the data cache internalCache = this[ internalKey ];
jQuery.each( jQuery.cache, function() { if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
// internalKey variable is just used to make it easier to find jQuery.event.trigger( event, data, internalCache.handle.elem );
// and potentially change this stuff later; currently it just }
// points to jQuery.expando });
var internalKey = jQuery.expando,
internalCache = this[ internalKey ];
if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
jQuery.event.trigger( event, data, internalCache.handle.elem );
}
});
}
return; return;
} }
@ -404,6 +403,8 @@ jQuery.event = {
jQuery.event.triggered = undefined; jQuery.event.triggered = undefined;
} }
} }
return event.result;
}, },
handle: function( event ) { handle: function( event ) {
@ -975,11 +976,7 @@ jQuery.fn.extend({
triggerHandler: function( type, data ) { triggerHandler: function( type, data ) {
if ( this[0] ) { if ( this[0] ) {
var event = new jQuery.Event( type ); return jQuery.event.trigger( type, data, this[0], true );
event.preventDefault();
event.stopPropagation();
jQuery.event.trigger( event, data, this[0] );
return event.result;
} }
}, },