Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 209e600

Browse files
chrisirhcIgorMinar
authored andcommitted
fix(jqLite): triggerHandler support unbind self
Fixes .one if the event is invoked from triggerHandler. Closes #5984 Conflicts: test/jqLiteSpec.js
1 parent ceaca57 commit 209e600

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/jqLite.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,9 @@ forEach({
953953
clone: jqLiteClone,
954954

955955
triggerHandler: function(element, eventName, eventData) {
956-
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
956+
// Copy event handlers in case event handlers array is modified during execution.
957+
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
958+
eventFnsCopy = shallowCopy(eventFns || []);
957959

958960
eventData = eventData || [];
959961

@@ -962,7 +964,7 @@ forEach({
962964
stopPropagation: noop
963965
}];
964966

965-
forEach(eventFns, function(fn) {
967+
forEach(eventFnsCopy, function(fn) {
966968
fn.apply(element, event.concat(eventData));
967969
});
968970
}

test/jqLiteSpec.js

+20
Original file line numberDiff line numberDiff line change
@@ -1660,6 +1660,26 @@ describe('jqLite', function() {
16601660
data = pokeSpy.mostRecentCall.args[1];
16611661
expect(data.hello).toBe("world");
16621662
});
1663+
1664+
1665+
it('should support handlers that deregister themselves', function() {
1666+
var element = jqLite('<a>poke</a>'),
1667+
clickSpy = jasmine.createSpy('click'),
1668+
clickOnceSpy = jasmine.createSpy('clickOnce').andCallFake(function() {
1669+
element.off('click', clickOnceSpy);
1670+
});
1671+
1672+
element.on('click', clickOnceSpy);
1673+
element.on('click', clickSpy);
1674+
1675+
element.triggerHandler('click');
1676+
expect(clickOnceSpy).toHaveBeenCalledOnce();
1677+
expect(clickSpy).toHaveBeenCalledOnce();
1678+
1679+
element.triggerHandler('click');
1680+
expect(clickOnceSpy).toHaveBeenCalledOnce();
1681+
expect(clickSpy.callCount).toBe(2);
1682+
});
16631683
});
16641684

16651685

0 commit comments

Comments
 (0)