删除eventhandler不工作:“这个”上下文在javascript中丢失了吗?

时间:2013-08-02 07:19:40

标签: javascript javascript-events this

我在删除滑块元素的事件处理程序时遇到问题

如果我不使用代理处理程序,“this”将指向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
        },

非常感谢

1 个答案:

答案 0 :(得分:1)

问题是因为传递给handler的{​​{1}}没有与事件监听器相同的事件监听器。 removeEventListener为每个调用生成新函数。它返回整个不同的函数对象,即使你用相同的参数调用它,虽然返回的函数将在语义上做同样的工作。

你应该在添加时存储代理功能,然后在删除时使用那个:

this.proxy()