Skip to content

Commit 6d337fc

Browse files
committed
fix(jqLite): pass in a dummy event with triggerHandler
Previously, anchor elements could not be used with triggerHandler because triggerHandler passes null as the event, and any anchor element with an empty href automatically calls event.preventDefault(). Instead, pass a dummy event when using triggerHandler, similar to what full jQuery does. Modified from PR angular#2379.
1 parent 58ef323 commit 6d337fc

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/jqLite.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
* - [replaceWith()](http://api.jquery.com/replaceWith/)
5555
* - [text()](http://api.jquery.com/text/)
5656
* - [toggleClass()](http://api.jquery.com/toggleClass/)
57-
* - [triggerHandler()](http://api.jquery.com/triggerHandler/) - Doesn't pass native event objects to handlers.
57+
* - [triggerHandler()](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.
5858
* - [unbind()](http://api.jquery.com/unbind/) - Does not support namespaces
5959
* - [val()](http://api.jquery.com/val/)
6060
* - [wrap()](http://api.jquery.com/wrap/)
@@ -743,9 +743,18 @@ forEach({
743743

744744
triggerHandler: function(element, eventName) {
745745
var eventFns = (JQLiteExpandoStore(element, 'events') || {})[eventName];
746+
var event;
747+
748+
if (document.createEventObject) {
749+
event = document.createEventObject();
750+
event.type = eventName;
751+
} else {
752+
event = document.createEvent('HTMLEvents');
753+
event.initEvent(eventName, false, true);
754+
}
746755

747756
forEach(eventFns, function(fn) {
748-
fn.call(element, null);
757+
fn.call(element, event);
749758
});
750759
}
751760
}, function(fn, name){

test/jqLiteSpec.js

+13
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,19 @@ describe('jqLite', function() {
11281128
expect(clickSpy1).toHaveBeenCalledOnce();
11291129
expect(clickSpy2).toHaveBeenCalledOnce();
11301130
});
1131+
1132+
it('should pass a dummy event', function() {
1133+
var element = jqLite('<a>poke</a>'),
1134+
pokeSpy = jasmine.createSpy('poke'),
1135+
event;
1136+
1137+
element.bind('poke', pokeSpy);
1138+
1139+
element.triggerHandler('poke');
1140+
event = pokeSpy.mostRecentCall.args[0];
1141+
expect(event.type).toEqual('poke');
1142+
expect(event.preventDefault).toBeDefined();
1143+
});
11311144
});
11321145

11331146

0 commit comments

Comments
 (0)