javascript 处理程序处理程序/Обработчикобработчикадлякорректногоудалениясобытий
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 处理程序处理程序/Обработчикобработчикадлякорректногоудалениясобытий相关的知识,希望对你有一定的参考价值。
//https://stackoverflow.com/questions/5660131/how-to-removeeventlistener-that-is-addeventlistener-with-anonymous-function
// variant
var handler;
function doSomethingWith(param) {
handler = function(){
document.write(param);
};
document.body.addEventListener('scroll', handler,false);
}
setTimeout(function() {
document.body.removeEventListener('scroll', handler ,false);
}, 3000);
//and this cool handler handler
var Handler = (function(){
var i = 1, listeners = {};
return {
addListener: function(element, event, handler, capture) {
element.addEventListener(event, handler, capture);
listeners[i] = {
element: element,
event: event,
handler: handler,
capture: capture
};
return i++;
},
removeListener: function(id) {
if(id in listeners) {
var h = listeners[id];
h.element.removeEventListener(h.event, h.handler, h.capture);
delete listeners[id];
}
}
};
}());
// use this
function sayHello(params) {
return Handler.addListener(params.elem, params.event, function() {
alert(params.text);
}, false);
}
var handlerParams = {
elem: document.body,
event: 'click',
text: 'Hello World!'
};
var sayHelloHandler = sayHello(handlerParams);
Handler.removeListener(sayHelloHandler); // remove
var HotelNames = {
init: function () {
this.initAppVars();
this.initAppListeners();
},
/**
* Инициализация переменных
*/
initAppVars: function () {
// В объекте лежат все свойства прослушки. {id: {element: ..., event: ..., handler: ..., capture: ...}}
this.listeners = {};
// В массиве лежат идентификаторы прослушок для, например, кнопок. [0, 1, 2, ...]
this.btnHandlers = [];
},
/**
* Инициализация прослушек
*/
initAppListeners: function() {
// Например, для кнопок
this.addBtnListeners()
},
/**
* Добавляет прослушку
* @param element
* @param event
* @param handler
* @param capture
* @returns {number} Идентификатор прослушки
*/
addListener: function (element, event, handler, capture) {
var i = Object.keys(this.listeners).length;
element.addEventListener(event, handler, capture);
this.listeners[i] = {
element: element,
event: event,
handler: handler,
capture: capture
};
return i;
},
/**
* Удаляет прослушку по идентификатору
* @param id
*/
removeListener: function (id) {
var h;
if (id in this.listeners) {
h = this.listeners[id];
h.element.removeEventListener(h.event, h.handler, h.capture);
delete this.listeners[id];
}
},
/**
* Инициализация событий для кнопок
*/
addBtnListeners: function () {
var i, btn;
var buttons = $('.synonyms-hotels-btn');
for (i = 0; i < buttons.length; i++) {
btn = buttons[i];
// Сохраним идентификаторы прослушек для кнопок в массив
this.btnHandlers[this.btnHandlers.length] = this.addListener(btn, 'click', HotelNames.actionButton, false);
}
},
/**
* Удаляет все прослушки с кнопок plus|minus
*/
removeBtnListeners: function () {
// Просто проходимся по массиву с идентификаторами прослушек для кнопок и запукаем удаление прослушек
for (var i = 0; i < this.btnHandlers.length; i++) {
this.removeListener(this.btnHandlers[i]);
}
// Не забудем очистить массив, т.к. кнопки более не прослушиваются и идентификаторов не должно быть
this.btnHandlers = [];
},
/**
* Действие при нажатии на кноку plus|minus
* @param e
*/
actionButton: function (e) {
// А это само действия для кнопок
var elem = $(e.target);
while ($(elem).hasClass('synonyms-hotels-btn') !== true) {
elem = $(elem).parent();
}
var action = $(elem).data('action');
var wrapper = $(elem).parent();
var wrapperClassName = $(wrapper).attr('class');
var mainBlock = $(wrapper).parent();
var plusBtn = $(wrapper).find('.icon-plus-sign').parent();
if (action === 'add') {
$.ajax({
loader: _('Загрузка'),
method: 'post',
url: '/module/dictionary/SLDict/addSynonymsField',
data: {type: $(elem).data('type')},
success: function (data) {
$.prompt.close();
if (data.ok) {
var newElem = $(data.view);
$(mainBlock).append(newElem);
$(mainBlock).find('.' + wrapperClassName + ':last').append(plusBtn);
// Состав (количество или др.) кнопок поменялся, удалим старые прослушки
HotelNames.removeBtnListeners();
// Назначим новые
HotelNames.addBtnListeners();
} else {
// error
}
},
dataType: 'json'
});
} else {
$(wrapper).find('input').val('');
var children = $(mainBlock).children('.' + wrapperClassName);
if (children.length > 1) {
$(wrapper).remove();
}
$(mainBlock).find('.' + wrapperClassName + ':last').append(plusBtn);
}
}
};
以上是关于javascript 处理程序处理程序/Обработчикобработчикадлякорректногоудалениясобытий的主要内容,如果未能解决你的问题,请参考以下文章
javascript Корректнаявысотаокнаvhвмобильныхбраузерах
javascript СкриптобработкисобытийдляЯндекс.Метрика
javascript JS Sorax - Обработкаисключений
javascript Контрольчиславыбранныхчекбоксов