diff options
author | Sam Potts <sam@potts.es> | 2018-06-13 00:05:31 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-13 00:05:31 +1000 |
commit | 7158e507adb11e187380f3148750435f2bd611ae (patch) | |
tree | e01357da3280df4d89ce7297de75ac0e281d26c5 /src/js/utils.js | |
parent | 70f3390ffead7761606fc3cd439ecac6b53e03eb (diff) | |
parent | 87170ab46080ae0d82afd1b39ab3fdf2e3ff1e62 (diff) | |
download | plyr-7158e507adb11e187380f3148750435f2bd611ae.tar.lz plyr-7158e507adb11e187380f3148750435f2bd611ae.tar.xz plyr-7158e507adb11e187380f3148750435f2bd611ae.zip |
Merge pull request #1029 from cky917/develop
remove event listeners in destroy()
Diffstat (limited to 'src/js/utils.js')
-rw-r--r-- | src/js/utils.js | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/js/utils.js b/src/js/utils.js index c36763dd..b2a06204 100644 --- a/src/js/utils.js +++ b/src/js/utils.js @@ -494,14 +494,14 @@ const utils = { }; if (toggle) { - utils.on(this.elements.container, 'keydown', trap, false); + utils.on.call(this, this.elements.container, 'keydown', trap, false); } else { utils.off(this.elements.container, 'keydown', trap, false); } }, // Toggle event listener - toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) { + toggleListener(elements, event, callback, toggle = false, passive = true, capture = false, once = false) { // Bail if no elemetns, event, or callback if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) { return; @@ -512,7 +512,7 @@ const utils = { // Create listener for each node Array.from(elements).forEach(element => { if (element instanceof Node) { - utils.toggleListener.call(null, element, event, callback, toggle, passive, capture); + utils.toggleListener.call(this, element, event, callback, toggle, passive, capture, once); } }); @@ -538,13 +538,35 @@ const utils = { // If a single node is passed, bind the event listener events.forEach(type => { + if (this && this.eventListeners && toggle && !once) { + // cache event listener + this.eventListeners.push({ elements, type, callback, options }); + } elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options); }); }, - + // remove all cached event listeners + cleanupEventListeners() { + if (this && this.eventListeners) { + this.eventListeners.forEach(item => { + const { elements, type, callback, options } = item; + elements.removeEventListener(type, callback, options); + }); + this.eventListeners = []; + } + }, // Bind event handler on(element, events = '', callback, passive = true, capture = false) { - utils.toggleListener(element, events, callback, true, passive, capture); + utils.toggleListener.call(this, element, events, callback, true, passive, capture); + }, + + // Bind event handler once + once(element, events = '', callback, passive = true, capture = false) { + function onceCallback(...args) { + utils.off(element, events, onceCallback, passive, capture); + callback.apply(this, args); + } + utils.toggleListener(element, events, onceCallback, true, passive, capture, true); }, // Unbind event handler |