From 395453e566c8f592656ee8212fb9173dd5b9bb85 Mon Sep 17 00:00:00 2001 From: Kevin Phillips Date: Mon, 25 Mar 2019 14:06:57 -0500 Subject: [PATCH] fixing issue with a delegated listener not stopping a normal listener --- can-dom-events-test.js | 30 +++++++++++++++++++++++++++- helpers/-make-delegate-event-tree.js | 9 ++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/can-dom-events-test.js b/can-dom-events-test.js index 75eb999..03d80d5 100644 --- a/can-dom-events-test.js +++ b/can-dom-events-test.js @@ -229,7 +229,7 @@ unit.test('domEvents.addDelegateListener call inner-most handler first (#62)', f var paragraphClickHandler = function paragraphClickHandler() { domEvents.removeDelegateListener(grandparent, 'click', 'p', paragraphClickHandler); - assert.ok(false, 'ev.stopPropagation works'); + assert.ok(false, stopMethod + ' works'); }; var inputClickHandler = function inputClickHandler(event) { @@ -244,4 +244,32 @@ unit.test('domEvents.addDelegateListener call inner-most handler first (#62)', f domEvents.dispatch(child, 'click'); done(); }); + + unit.test('domEvents.addDelegateListener should call the actual ev.' + stopMethod + ' (#62)', function (assert) { + var done = assert.async(); + var parent = document.createElement('p'); + var child = document.createElement('input'); + + parent.appendChild(child); + + var qf = document.querySelector('#qunit-fixture'); + qf.appendChild(parent); + + var delegatedClickHandler = function delegatedClickHandler(event) { + event[stopMethod](); + domEvents.removeDelegateListener(parent, 'click', 'input', delegatedClickHandler); + assert.ok(true, 'inner-most click handler called first'); + }; + + var documentClickHandler = function documentClickHandler() { + domEvents.removeEventListener(document, 'click', documentClickHandler); + assert.ok(false, stopMethod + ' works'); + }; + + domEvents.addDelegateListener(parent, 'click', 'input', delegatedClickHandler); + domEvents.addEventListener(document, 'click', documentClickHandler); + + domEvents.dispatch(child, 'click'); + done(); + }); }); diff --git a/helpers/-make-delegate-event-tree.js b/helpers/-make-delegate-event-tree.js index 3107e44..1806753 100644 --- a/helpers/-make-delegate-event-tree.js +++ b/helpers/-make-delegate-event-tree.js @@ -21,7 +21,14 @@ function makeDelegator (domEvents) { var handler = this.delegated[eventType] = function(ev){ var cur = ev.target; var propagate = true; - ev.stopPropagation = ev.stopImmediatePropagation = function() { + var origStopPropagation = ev.stopPropagation; + ev.stopPropagation = function() { + origStopPropagation.apply(this, arguments); + propagate = false; + }; + var origStopImmediatePropagation = ev.stopImmediatePropagation; + ev.stopImmediatePropagation = function() { + origStopImmediatePropagation.apply(this, arguments); propagate = false; }; do {