Javascript删除对象中创建的事件侦听器

Javascript删除对象中创建的事件侦听器,javascript,events,Javascript,Events,我使用下面的代码将事件侦听器添加到主体中,但无法删除它 this.events = { addEventListener : function(element, eventName, eventHandler, scope) { var scopedEventHandler = scope ? function(e) { eventHandler.apply(scope, [e]); } : eventHandler; if(document.addEve

我使用下面的代码将事件侦听器添加到主体中,但无法删除它

this.events = {
    addEventListener : function(element, eventName, eventHandler, scope) {
        var scopedEventHandler = scope ? function(e) { eventHandler.apply(scope, [e]); } : eventHandler;
        if(document.addEventListener)
            element.addEventListener(eventName, scopedEventHandler, false);
        else if(document.attachEvent)
            element.attachEvent("on"+eventName, scopedEventHandler);
    }
}
this.events.addEventListener( document.body, "keydown", this.keyEvent, this);

通过修改
this.events
对象中的事件处理程序,事件处理程序不再相同

我建议您创建一个通过
this.events
系统添加的事件注册表,这样您就可以轻松地提取内容

this.events = {
    eventRegistry : {},

    addEventListener : function(element, eventName, eventHandler, scope) {
        var scopedEventHandler = scope ? function(e) { eventHandler.apply(scope, [e]); } : eventHandler;

        // save the scoped event handler
        if (typeof eventRegistry == "undefined")                
            eventRegistry = {};

        if (typeof eventRegistry[eventName] == "undefined")
            eventRegistry[eventName] = {};

        eventRegistry[eventName][eventHandler] = scopedEventHandler;

        if(document.addEventListener)
            element.addEventListener(eventName, scopedEventHandler, false);
        else if(document.attachEvent)
            element.attachEvent("on"+eventName, scopedEventHandler);
    },

    removeEventListener : function(element, eventName, eventHandler, scope) {

        // retrieve saved event handler
        var scopedEventHandler = eventRegistry[eventName][eventHandler];

        if(document.removeEventListener)
            element.removeEventListener(eventName, scopedEventHandler, false);
        else if(document.detachEvent)
            element.detachEvent("on"+eventName, scopedEventHandler);
    }
};

this.keyEvent = function () { alert("keypressed"); this.events.removeEventListener(document.body, "keydown", this.keyEvent, this); alert("removed"); };
this.events.addEventListener( document.body, "keydown", this.keyEvent, this);​

您可以发布您在尝试删除事件时编写的代码吗?if(document.addEventListener){//Standard document.body.removeEventListener('keydown',this.keyEvent,false);}else{//IE document.body.detachEvent('onkeydown',this.keyEvent);}我也尝试过用同样的风格制作一个remover listener函数,但是没有什么不同。虽然很好,但是很遗憾,我没有解决我遇到的问题。由于某种原因,当按下该键时,它会生成一个新对象并引用当前对象,在Safari中没有问题,但在Firefox中没有问题。Firefox的问题是,即使我在对象中更改了焦点,但导致所有这些问题的链接仍保持焦点。我的解决方案不会帮助您删除事件处理程序吗?我不太明白你所说的“保持专注”和“创造新事物”是什么意思。你还在谈论你发布的同一段代码吗?Thx.很抱歉,按键似乎触发了两个对象,而不是一个,但这似乎是firefox中的一个错误,因此,如果一个链接有焦点,你点击return,它将触发该链接以及key命令,该链接将创建该对象,因此我刚刚移动了焦点,然后我可以使用return而不创建另一个对象。我想这不是一个bug,但IE和Safari不会这么做。这将是一个单独的问题。在您接受“删除事件处理程序”后,使用代码发布另一个。