正在删除不起作用的事件处理程序:“;这个“;上下文在Javascript中丢失
Removing eventhandlers not working: "this" context lost in Javascript?
我在删除滑块元素的事件处理程序时遇到问题
如果我不使用代理作为处理程序;这个";将指向dom元素
如何删除处理程序?
相关代码:
var slider = (function (slider) {
var Sliderhandle = function(handle){
EvtTarget.call(this);
this.events = {
start: ['touchstart', 'mousedown'],
move: ['touchmove', 'mousemove'],
end: ['touchend', 'touchcancel', 'mouseup']
};
this.options = {};
this.element = $$('div.ui-slider');
// set context for event handlers
this.start = this.start.bind(this);
this.move = this.move.bind(this);
this.end = this.end.bind(this);
this.proxy = function(func){
var that = this;
return(function(){
return func.apply(that,arguments);
});
}
Object.defineProperty(this, "__el",{
value:handle
});
};
Sliderhandle.prototype = Object.create(EvtTarget.prototype,{
init : {
value:function(config){
this.container = $$('div.ui-slider');
this.track = this.container.getElementsByClassName('ui-slider-track')[0];
this.value = (config && config.value) || 1;
this.min = (config && config.min) || 1;
this.max = (config && config.value) || 1000;
this.change = (config && config.change) || null; // callback
this.addEvents("start");
this.setValue(this.value);
},
enumerable:true
},
addEvents : {
value:function(name){
var list = this.events[name],
handler = this[name],
all;
handler = this.proxy(handler);
for (all in list){
this.container.addEventListener(list[all], handler, false);
}
},
enumerable:true
},
removeEvents:{
value:function(name){
var list = this.events[name],
handler = this[name],
all;
//handler = this.proxy(handler);
for (all in list){
this.container.removeEventListener(list[all], handler, false);
}
},
enumerable:true
},
问题是因为没有与传递给removeEventListener
的handler
相同的事件侦听器。this.proxy()
为每个调用生成新函数。即使使用相同的参数调用它,它也会返回完全不同的函数对象,尽管返回的函数在语义上会做相同的工作。
您应该在添加时存储代理函数,然后在删除时使用该函数,如下所示:
var Sliderhandle = function(handle){
// ....
this.proxyHandler = {};
}
// ....
addEvents : {
value: function(name){
var list = this.events[name],
handler = this[name],
all;
this.proxyHandler[name] = handler = this.proxy(handler);
for (all in list){
this.container.addEventListener(list[all], handler, false);
}
},
enumerable:true
},
removeEvents:{
value:function(name){
var list = this.events[name],
handler = this.proxyHandler[name],
all;
for (all in list){
this.container.removeEventListener(list[all], handler, false);
}
delete this.proxyHandler[name];
},
enumerable:true
},
相关文章:
- 将函数的上下文应用于javascript变量
- 丢失对象“;这个“;方法中的上下文
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 参照“;这个“;上下文
- 在javascript上使用这个而不是上下文变量有什么缺点吗
- 有没有一种方法可以从方法中获取这个上下文
- 为什么这个JS代码段中的上下文会发生变化
- 正在删除不起作用的事件处理程序:“;这个“;上下文在Javascript中丢失
- Mongoose预保存使用了不正确的“;这个“;上下文
- 在setTimeout上使用.apply或.call——如何以跨平台的方式获得这个上下文
- 理解& # 39;这个# 39;对象上下文
- Promise内部的这个上下文并没有引用内部实例
- Javascript & # 39;这个# 39;上下文使用jQuery
- Node.js EventEmitter:如何绑定一个类上下文到事件监听器,然后移除这个监听器
- ES6箭头函数和这个上下文
- Javascript & # 39;这个# 39;递归中的上下文
- 调用同一“类”的另一个方法这个上下文在Javascript中是不同的
- Jquery这个上下文
- 为什么";这个";这些绑定函数的上下文,在每个新实例中都是一样的
- 主干视图在引导框中的“这个”上下文