Прежде всего, я не использую jquery. Я создаю свою собственную ванильную библиотеку JavaScript.Ниже приведена моя функция выключения, а затем - функция-оболочка для событий. Посмотрите, как я сделал свою функцию выключения, а затем посмотрите на мою функцию событий.Я создал свою собственную функцию обратного вызова «off», которая отличается от моей функции обратного вызова «on» - так что я могу получить обратный вызов при удалении прослушивателя событий.Имеет ли смысл то, что я сделал - открыть для обсуждения
off: function(event, selector, callback, capture) {
if (typeof (selector) === 'function') {
capture = callback;
callback = selector || null;
}
selector = typeof selector == 'string' ? selector : null;
capture = capture ? true : false;
if(selector) {
let obj = $(selector, this.$el);
if(obj.$elems.length) {
obj.$elems.forEach(function(el, i) {
evts.remove(event, el, callback, capture);
});
} else if(obj.$el){
evts.remove(event, obj.$el, callback, capture);
}
return this;
}
if(this.$elems && this.$elems.length) {
this.$elems.forEach(function(el, i) {
evts.remove(event, el, callback, capture);
});
} else {
evts.remove(event, this.$el, callback, capture);
}
return this;
}
оболочка событий
var evts = (function () {
'use strict';
var listeners = [],
add,
remove;
add = function (evt, elem, fn, capture) {
var callback = function (evt) {
fn.call(elem, evt, evt && evt.target ? evt.target : window.event.srcElement);
};
listeners.push({
evt: evt,
elem: elem,
fn: fn,
callback: callback,
capture, capture,
removed: false
});
elem.addEventListener(evt, callback, capture);
};
remove = function (evt, elem, fn, capture) {
var callback = function (evt) {
return fn ? fn.call(elem, evt, evt && evt.target ? evt.target : window.event.srcElement) : null;
};
listeners.forEach(function (obj, i) {
if (obj.evt === evt && obj.elem === elem &&
!obj.removed) {
obj.removed = true;
if(callback && callback !== obj.callback) {
callback();
}
callback = obj.callback;
listeners.splice(i, 1);
return false;
}
});
elem.removeEventListener(evt, callback, capture);
};
return {
add: add,
remove: remove
};
}());
Пример:
$('#btn').on('click', function(e) {
$(this).off('click', function(e) { alert('good bye') });
});