Skip to content

Commit b2d0651

Browse files
committed
feat(core events): remove_event_listener - support wildcard ids.
The id parameter can be a wildcard string, e.g. `test-*-event`, which would match any event which starts with "test-" and ends with "-event". The wildcard "*" can be anywhere in the string and also be used multiple times. If no wildcard is present the search string is used for an exact match.
1 parent 4cf724a commit b2d0651

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/core/events.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import utils from "./utils";
2+
13
// Event related methods and event factories
24

35
// Event listener registration for easy-to-remove event listeners.
@@ -49,8 +51,14 @@ const add_event_listener = (el, event_type, id, cb, opts = {}) => {
4951
* If an id but no element is given, all event listeners for any element matching the id are removed.
5052
* If no element and no id are given, all event listeners are removed.
5153
*
54+
* The id can be a wildcard string, e.g. `test-*-event`, which would match any
55+
* event which starts with "test-" and ends with "-event". The wildcard "*" can
56+
* be anywhere in the string and also be used multiple times. If no wildcard is
57+
* present the search string is used for an exact match.
58+
*
5259
* @param {DOM Node} [el] - The element to register the event for.
5360
* @param {string} [id] - A unique id under which the event is registered.
61+
* Can be a wildcard string.
5462
*
5563
*/
5664
const remove_event_listener = (el, id) => {
@@ -65,9 +73,10 @@ const remove_event_listener = (el, id) => {
6573
}
6674
let entries;
6775
if (id) {
68-
// remove event listener with specific id
69-
const entry = el_events.get(id);
70-
entries = entry ? [[id, entry]] : [];
76+
// remove event listener with matching id
77+
entries = [...el_events.entries()].filter((entry) =>
78+
utils.regexp_from_wildcard(id).test(entry[0])
79+
);
7180
} else {
7281
// remove all event listeners of element
7382
entries = el_events.entries();

src/core/events.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,41 @@ describe("core.events tests", () => {
303303
events.remove_event_listener();
304304
expect(event_listener_map.size).toBe(0);
305305
});
306+
307+
it("Remove wildcard matching event listeners.", () => {
308+
const el = document.createElement("div");
309+
310+
// register the event handlers
311+
events.add_event_listener(el, "test", "test_event_1", () => {});
312+
events.add_event_listener(el, "test", "test_event_2", () => {});
313+
events.add_event_listener(el, "test", "test_event_3", () => {});
314+
315+
events.add_event_listener(el, "test", "a_aha", () => {});
316+
events.add_event_listener(el, "test", "b_aha", () => {});
317+
events.add_event_listener(el, "test", "c_aha", () => {});
318+
319+
events.add_event_listener(el, "test", "ok_aha_ok", () => {});
320+
events.add_event_listener(el, "test", "ok_bhb_ok", () => {});
321+
events.add_event_listener(el, "test", "ok_chc_ok", () => {});
322+
323+
events.add_event_listener(el, "test", "oh_aha_ok", () => {});
324+
events.add_event_listener(el, "test", "ah_bhb_ok", () => {});
325+
events.add_event_listener(el, "test", "uh_chc_ok", () => {});
326+
327+
expect(event_listener_map.get(el).size).toBe(12);
328+
329+
events.remove_event_listener(el, "test_event_*");
330+
expect(event_listener_map.get(el).size).toBe(9);
331+
332+
events.remove_event_listener(el, "*_aha");
333+
expect(event_listener_map.get(el).size).toBe(6);
334+
335+
events.remove_event_listener(el, "ok_*_ok");
336+
expect(event_listener_map.get(el).size).toBe(3);
337+
338+
events.remove_event_listener(el, "*h_*_ok");
339+
expect(event_listener_map.get(el)).not.toBeDefined();
340+
});
306341
});
307342

308343
describe("2 - await pattern initialization", () => {

0 commit comments

Comments
 (0)