Удаление обработчиков событий в методе уничтожения ванильных плагинов JavaScript

Каков наилучший способ отвязать обработчики событий в методе уничтожения простого плагина JS? Следующий (нерабочий) код должен продемонстрировать, что я имею в виду:

var myPlugin = (function(){
    function myPlugin(selector){
        var elems = document.querySelectorAll(selector);

        for (var i=0; i<elems.length; i++) {
            function _handler(){ console.log('Hello'); }
            elems[i].addEventListener("click", _handler);
        }

        this.destroy = function(){
            document.removeEventListener("click", _handler);
        };
    }
    return myPlugin;
})();

Итак, я перебираю набор элементов и что-то с ними делаю, в том числе подключаю функцию обработчика событий. Проблема: в простом JS мне нужна ссылка на исходный обработчик, чтобы удалить его, когда экземпляр плагина будет уничтожен.

Этот фрагмент, естественно, не может работать, потому что функция обработчика события записывается снова и снова с каждым выбранным элементом.

Один из способов справиться с этим: создание функций с динамическим/уникальным именем, как описано здесь: Динамическое создание функций в JS. Функция должна быть глобально установлена ​​для объекта окна. Затем мне просто нужно запомнить имя (например, используя атрибут данных для выбранного элемента), и с его помощью позже можно отменить привязку события.

Однако этот подход неуклюж, и я сталкиваюсь с проблемами в IE8 при использовании такой функции с attachEvent. Есть ли лучший способ или лучшая практика для этого?


person Simon Steinberger    schedule 01.05.2015    source источник