From ff61e579d8a7356d7fde1cd43f1c07bdf7f6d29f Mon Sep 17 00:00:00 2001 From: Devid Farinelli Date: Tue, 20 Oct 2020 17:00:28 +0200 Subject: [PATCH] feat: add destroy method --- mousetrap.js | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/mousetrap.js b/mousetrap.js index ab71d582..6c31243b 100644 --- a/mousetrap.js +++ b/mousetrap.js @@ -182,6 +182,22 @@ object.attachEvent('on' + type, callback); } + /** + * cross browser remove event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {EventListenerOrEventListenerObject} callback + * @returns void + */ + function _removeEvent (object, type, callback) { + if (object.removeEventListener) { + object.removeEventListener(type, callback, false); + return; + } + object.detachEvent('on' + type, callback); + } + /** * takes the event and returns the key character * @@ -707,13 +723,13 @@ _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown'; }; - /** + /** * handles a keydown event * * @param {Event} e * @returns void */ - function _handleKeyEvent(e) { + self._handleKeyEvent = function (e) { // normalize e.which for key events // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion @@ -886,9 +902,9 @@ }; // start! - _addEvent(targetElement, 'keypress', _handleKeyEvent); - _addEvent(targetElement, 'keydown', _handleKeyEvent); - _addEvent(targetElement, 'keyup', _handleKeyEvent); + _addEvent(targetElement, 'keypress', self._handleKeyEvent); + _addEvent(targetElement, 'keydown', self._handleKeyEvent); + _addEvent(targetElement, 'keyup', self._handleKeyEvent); } /** @@ -934,6 +950,29 @@ return self.bind.call(self, keys, function() {}, action); }; + /** + * destroy mousetrap object + * + * - call reset on the mousetrap object ( removing all binding ) + * - remove all javascript event listener from target element or document + * - remove all reference to target + * + * @return void + */ + + Mousetrap.prototype.destroy = function () { + var self = this + + self.reset() + + _removeEvent(self.target, 'keypress', self._handleKeyEvent); + _removeEvent(self.target, 'keydown', self._handleKeyEvent); + _removeEvent(self.target, 'keyup', self._handleKeyEvent); + + self.target = undefined + self._handleKeyEvent = undefined + } + /** * triggers an event that has already been bound *