Skip to content

Commit ff5eced

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 60c13a1 commit ff5eced

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

src/jqLite.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -948,24 +948,30 @@ forEach({
948948
clone: jqLiteClone,
949949

950950
triggerHandler: function(element, eventName, eventData) {
951-
// Copy event handlers in case event handlers array is modified during execution.
952-
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
953-
eventFnsCopy = shallowCopy(eventFns || []);
954951

955-
eventData = eventData || [];
956-
957-
var event = [{
952+
var event = {
958953
preventDefault: function() {
959954
this.defaultPrevented = true;
960955
},
961956
isDefaultPrevented: function() {
962957
return this.defaultPrevented === true;
963958
},
964959
stopPropagation: noop
965-
}];
960+
};
961+
962+
if ( eventName.type ) {
963+
extend(event, eventName);
964+
eventName = event.type;
965+
}
966+
967+
var handlerArgs = [event].concat(eventData || []);
968+
969+
// Copy event handlers in case event handlers array is modified during execution.
970+
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
971+
eventFnsCopy = shallowCopy(eventFns || []);
966972

967973
forEach(eventFnsCopy, function(fn) {
968-
fn.apply(element, event.concat(eventData));
974+
fn.apply(element, handlerArgs);
969975
});
970976
}
971977
}, function(fn, name){

test/jqLiteSpec.js

+16
Original file line numberDiff line numberDiff line change
@@ -1765,6 +1765,22 @@ describe('jqLite', function() {
17651765
expect(clickOnceSpy).toHaveBeenCalledOnce();
17661766
expect(clickSpy.callCount).toBe(2);
17671767
});
1768+
1769+
it("should accept a custom event instead of eventName", function() {
1770+
var element = jqLite('<a>poke</a>'),
1771+
pokeSpy = jasmine.createSpy('poke'),
1772+
customEvent = {
1773+
type: 'click',
1774+
someProp: 'someValue'
1775+
},
1776+
actualEvent;
1777+
1778+
element.on('click', pokeSpy);
1779+
element.triggerHandler(customEvent);
1780+
actualEvent = pokeSpy.mostRecentCall.args[0];
1781+
expect(actualEvent.preventDefault).toBeDefined();
1782+
expect(actualEvent.someProp).toEqual('someValue');
1783+
});
17681784
});
17691785

17701786

0 commit comments

Comments
 (0)