Skip to content

Commit e12bc12

Browse files
fix(jqLite): allow triggerHandler() to accept custom event
In some scenarios you want to be able to specify properties on the event that is passed to the event handler. JQuery does this by overloading the first parameter (`eventName`). If it is an object with a `type` property then we assume that it must be a custom event. In this case the custom event must provide the `type` property which is the name of the event to be triggered. `triggerHandler` will continue to provide dummy default functions for `preventDefault()`, `isDefaultPrevented()` and `stopPropagation()` but you may override these with your own versions in your custom object if you wish. Closes angular#8469
1 parent 4863cbc commit e12bc12

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

src/jqLite.js

+27-22
Original file line numberDiff line numberDiff line change
@@ -947,32 +947,37 @@ forEach({
947947

948948
clone: jqLiteClone,
949949

950-
triggerHandler: function(element, eventName, eventData) {
951-
952-
var event = {
953-
preventDefault: function() {
954-
this.defaultPrevented = true;
955-
},
956-
isDefaultPrevented: function() {
957-
return this.defaultPrevented === true;
958-
},
959-
stopPropagation: noop
960-
};
950+
triggerHandler: function(element, event, eventData) {
961951

962-
if ( eventName.type ) {
963-
extend(event, eventName);
964-
eventName = event.type;
965-
}
952+
var dummyEvent, eventFnsCopy, handlerArgs;
953+
var eventName = event.type || event;
954+
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
966955

967-
var handlerArgs = [event].concat(eventData || []);
956+
if (eventFns) {
968957

969-
// Copy event handlers in case event handlers array is modified during execution.
970-
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
971-
eventFnsCopy = shallowCopy(eventFns || []);
958+
// Create a dummy event to pass to the handlers
959+
dummyEvent = {
960+
preventDefault: function() { this.defaultPrevented = true; },
961+
isDefaultPrevented: function() { return this.defaultPrevented === true; },
962+
stopPropagation: noop,
963+
type: eventName,
964+
target: element
965+
};
972966

973-
forEach(eventFnsCopy, function(fn) {
974-
fn.apply(element, handlerArgs);
975-
});
967+
// If a custom event was provided then extend our dummy event with it
968+
if (event.type) {
969+
dummyEvent = extend(dummyEvent, event);
970+
}
971+
972+
// Copy event handlers in case event handlers array is modified during execution.
973+
eventFnsCopy = shallowCopy(eventFns);
974+
handlerArgs = eventData ? [dummyEvent].concat(eventData) : [dummyEvent];
975+
976+
forEach(eventFnsCopy, function(fn) {
977+
fn.apply(element, handlerArgs);
978+
});
979+
980+
}
976981
}
977982
}, function(fn, name){
978983
/**

0 commit comments

Comments
 (0)