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

Commit 8a27aba

Browse files
chrisirhcIgorMinar
authored andcommitted
fix(jqLite): triggerHandler support unbind self
Fixes .one if the event is invoked from triggerHandler. Closes #5984
1 parent f3a763f commit 8a27aba

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
@@ -948,7 +948,9 @@ forEach({
948948
clone: jqLiteClone,
949949

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

953955
eventData = eventData || [];
954956

@@ -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
@@ -1743,6 +1743,26 @@ describe('jqLite', function() {
17431743
event.preventDefault();
17441744
expect(event.isDefaultPrevented()).toBe(true);
17451745
});
1746+
1747+
1748+
it('should support handlers that deregister themselves', function() {
1749+
var element = jqLite('<a>poke</a>'),
1750+
clickSpy = jasmine.createSpy('click'),
1751+
clickOnceSpy = jasmine.createSpy('clickOnce').andCallFake(function() {
1752+
element.off('click', clickOnceSpy);
1753+
});
1754+
1755+
element.on('click', clickOnceSpy);
1756+
element.on('click', clickSpy);
1757+
1758+
element.triggerHandler('click');
1759+
expect(clickOnceSpy).toHaveBeenCalledOnce();
1760+
expect(clickSpy).toHaveBeenCalledOnce();
1761+
1762+
element.triggerHandler('click');
1763+
expect(clickOnceSpy).toHaveBeenCalledOnce();
1764+
expect(clickSpy.callCount).toBe(2);
1765+
});
17461766
});
17471767

17481768

0 commit comments

Comments
 (0)