aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jqLite.js5
-rw-r--r--test/jqLiteSpec.js20
2 files changed, 24 insertions, 1 deletions
diff --git a/src/jqLite.js b/src/jqLite.js
index 8a45f966..c1b5b36e 100644
--- a/src/jqLite.js
+++ b/src/jqLite.js
@@ -645,7 +645,10 @@ function createEventHandler(element, events) {
return event.defaultPrevented || event.returnValue === false;
};
- forEach(events[type || event.type], function(fn) {
+ // Copy event handlers in case event handlers array is modified during execution.
+ var eventHandlersCopy = shallowCopy(events[type || event.type] || []);
+
+ forEach(eventHandlersCopy, function(fn) {
fn.call(element, event);
});
diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js
index c4f47dcd..3a8fd404 100644
--- a/test/jqLiteSpec.js
+++ b/test/jqLiteSpec.js
@@ -1120,6 +1120,26 @@ describe('jqLite', function() {
});
+ it('should deregister specific listener within the listener and call subsequent listeners', function() {
+ var aElem = jqLite(a),
+ clickSpy = jasmine.createSpy('click'),
+ clickOnceSpy = jasmine.createSpy('clickOnce').andCallFake(function() {
+ aElem.off('click', clickOnceSpy);
+ });
+
+ aElem.on('click', clickOnceSpy);
+ aElem.on('click', clickSpy);
+
+ browserTrigger(a, 'click');
+ expect(clickOnceSpy).toHaveBeenCalledOnce();
+ expect(clickSpy).toHaveBeenCalledOnce();
+
+ browserTrigger(a, 'click');
+ expect(clickOnceSpy).toHaveBeenCalledOnce();
+ expect(clickSpy.callCount).toBe(2);
+ });
+
+
it('should deregister specific listener for multiple types separated by spaces', function() {
var aElem = jqLite(a),
masterSpy = jasmine.createSpy('master'),