diff --git a/client/cloudcmd.js b/client/cloudcmd.js index 83b45b4d..8a866a37 100644 --- a/client/cloudcmd.js +++ b/client/cloudcmd.js @@ -48,13 +48,13 @@ function getPrefix(prefix) { const onUpdateFound = wraptile(async (config) => { const {prefix} = config; - - const js = promisify(window.DOM.load.js); - const css = promisify(window.DOM.load.css); + const {DOM} = window; + const js = promisify(DOM.load.js); await js(`${prefix}dist/cloudcmd.common.js`); await js(`${prefix}dist/cloudcmd.js`); + DOM.Events.removeAll(); window.CloudCmd(config); }); diff --git a/client/dom/events/event-store.js b/client/dom/events/event-store.js new file mode 100644 index 00000000..6d9273c0 --- /dev/null +++ b/client/dom/events/event-store.js @@ -0,0 +1,20 @@ +'use strict'; + +let list = []; + +module.exports.add = (el, name, fn) => { + list.push([ + el, + name, + fn, + ]); +}; + +module.exports.clear = () => { + list = []; +}; + +module.exports.get = () => { + return list; +}; + diff --git a/client/dom/events/event-store.spec.js b/client/dom/events/event-store.spec.js new file mode 100644 index 00000000..0f1761d6 --- /dev/null +++ b/client/dom/events/event-store.spec.js @@ -0,0 +1,34 @@ +'use strict'; + +const test = require('tape'); +const eventStore = require('./event-store'); + +test('event-store: get', (t) => { + const el = {}; + const name = 'click'; + const fn = () => {}; + + eventStore.add(el, name, fn); + const result = eventStore.get(); + const expected = [ + [el, name, fn], + ]; + + t.deepEqual(expected, result, 'should equal'); + t.end(); +}); + +test('event-store: clear', (t) => { + const el = {}; + const name = 'click'; + const fn = () => {}; + + eventStore.add(el, name, fn); + eventStore.clear(); + + const result = eventStore.get(); + const expected = []; + + t.deepEqual(expected, result, 'should equal'); + t.end(); +}); diff --git a/client/dom/events.js b/client/dom/events/index.js similarity index 91% rename from client/dom/events.js rename to client/dom/events/index.js index 706c0849..199c7b11 100644 --- a/client/dom/events.js +++ b/client/dom/events/index.js @@ -1,6 +1,7 @@ 'use strict'; const itype = require('itype/legacy'); +const EventStore = require('./event-store'); module.exports = new EventsProto(); @@ -98,7 +99,10 @@ function EventsProto() { checkType(type); parseArgs(type, element, listener, (element, args) => { - element.addEventListener.apply(element, args); + const [name, fn, options] = args; + + element.addEventListener(name, fn, options); + EventStore.add(element, name, fn); }); return Events; @@ -144,6 +148,20 @@ function EventsProto() { return Events; }; + /** + * remove all added event listeners + * + * @param listener + */ + this.removeAll = () => { + const events = EventStore.get(); + + for (const [el, name, fn] of events) + el.removeEventListener(name, fn); + + EventStore.clear(); + }; + /** * safe add event keydown listener *