Skip to content

Commit 8327ba0

Browse files
committed
fix: Remove all DOM events when off with no arg is called
1 parent 70282e1 commit 8327ba0

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

src/_dom/mq/off.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,25 @@ export default function off(namesStr, selector, handler) {
1717

1818
for (let j = 0; j < this.length; j++) {
1919
const node = this[j];
20-
const events = data.allEvents[name + node.b$];
2120

21+
if (!name && namespace) {
22+
for (let k = 0, keys = Object.keys(data.allEvents); k < keys.length; k++) {
23+
const events = data.allEvents[keys[k]];
24+
25+
for (let l = 0; l < events.length; l++) {
26+
const event = events[i];
27+
if (event.namespace === namespace && event.nodeID === node.b$) {
28+
node.removeEventListener(event.name, event.delegate || event.handler);
29+
events.splice(l, 1);
30+
l -= 1;
31+
}
32+
}
33+
}
34+
35+
continue;
36+
}
37+
38+
const events = data.allEvents[name + node.b$];
2239
if (events) {
2340
for (let k = 0; k < events.length; k++) {
2441
const event = events[k];

src/_dom/mq/on.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export default function on(namesStr, selector, handler) {
7575
delegate,
7676
handler,
7777
namespace,
78-
selector
78+
selector,
79+
nodeID,
80+
name
7981
});
8082

8183
node.addEventListener(name, delegate || handler, false);

src/off/index.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import checkObjectType from '../_helpers/checkobjecttype';
33
import defs from '../_core/defs';
44
import removeListener from './_removelistener';
55
import undelegateListener from './_undelegatelistener';
6+
import dom from '../_dom';
67

78
// removes event listener
89
export default function off(object, givenNames, callback, context) {
@@ -30,8 +31,17 @@ export default function off(object, givenNames, callback, context) {
3031
return object;
3132
}
3233

34+
3335
if (!givenNames && !callback && !context) {
3436
def.events = {};
37+
38+
nofn.forOwn(def.props, ({ bindings }, propName) => {
39+
nofn.forEach(bindings, ({ node }) => {
40+
const eventNamespace = def.id + propName;
41+
dom.$(node).off(`.${eventNamespace}`);
42+
});
43+
});
44+
3545
return object;
3646
}
3747

test/spec/events/events_summary_spec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ describe('Events summary (on, once, onDebounce, off, trigger)', () => {
112112
expect(handler).not.toHaveBeenCalled();
113113
});
114114

115+
115116
it('triggers DOM event using selector', () => {
116117
bindNode(obj, 'x', '#child');
117118
on(obj, 'click::x(.grandchild)', handler);
@@ -306,4 +307,14 @@ describe('Events summary (on, once, onDebounce, off, trigger)', () => {
306307
onDebounce.call(obj, 'someevent', handler, 100);
307308
trigger(obj, 'someevent');
308309
});
310+
311+
it('removes all events when off is called with no args', () => {
312+
on(obj, 'click::x', handler);
313+
bindNode(obj, 'x', '#child');
314+
on(obj, 'foo', handler);
315+
off(obj);
316+
simulateClick(childNode);
317+
trigger(obj, 'foo');
318+
expect(handler).not.toHaveBeenCalled();
319+
});
309320
});

0 commit comments

Comments
 (0)