removeEventListener不会删除页面加载的事件处理程序

时间:2013-06-17 00:02:01

标签: javascript firebug addeventlistener

我试图自己解决这个问题无济于事。所有我似乎都能找到帮助,关于如何删除匿名函数事件处理程序。 这不是我遇到的问题。我想删除一个命名函数处理程序,无论出于什么原因,我似乎无法让它在我的生活中起作用。

以下是我提供的一些代码:

/**
* Cross-browser event binding.
* http://ejohn.org/projects/flexible-javascript-events/
* @param {Object} obj Element to attach event to.
* @param {String} type Type of event.
* @param {Function} fn Event handler.
*/
function addEvent(obj, type, fn) {
    if (obj.attachEvent) {
        obj['e'+type+fn] = fn;
        obj[type+fn] = function() {
            obj['e'+type+fn]( window.event);
        }
        obj.attachEvent('on'+type, obj[type+fn]);
    } else {
        obj.addEventListener(type, fn, false);
    }
}

我已完成上述函数调用,我只调用addEventListener,而不调用attachEvent

/**
 * Strip linebreaks.
 * @param {Event} e Key event.
 */                
function linebreaks(e) {
    if (!e) e = window.event;
    var code = e.charCode ? e.charCode : e.keyCode;
    if (code == 13) {
        stopEvent(e);
        return false;
    }
}

// Prevent linebreaks.
addEvent(document, 'keydown', linebreaks);

这些都不包含在就绪函数中(即$(document).ready。它是HTML正文末尾的内联javascript(实际上是最后一个标记)。

我在Safari和Firefox上遇到同样的问题。使用Firebug,我能够验证linebreaks已定义:

>>> linebreaks
linebreaks(e)
>>> window.linebreaks
linebreaks(e)

但是,这些调用(通常在成功或静默失败时返回未定义)不会对网页的行为进行任何更改:

>>> document.removeEventListener("keydown", linebreaks, false)
undefined
>>> document.removeEventListener("keydown", window.linebreaks, false)
undefined
>>> document.removeEventListener("keydown", window, false)
undefined

我应该注意,当我通过Firebug定义自己的函数时,我可以添加和删除它们就好了:

>>> function bunny() { console.log("rabbit"); }
undefined
>>> bunny
bunny()
>>> document.addEventListener('keydown', bunny, false);
undefined
/* pressing a few keys */
rabbit
rabbit
rabbit
>>> document.removeEventListener('keydown', bunny, false);
undefined
>>> function cactus() { console.log('not a rabbit'); }
undefined
>>> cactus
cactus()
>>> document.addEventListener('keydown', cactus, false);
undefined
/* pressing a few keys */
not a rabbit
not a rabbit
not a rabbit
>>> document.removeEventListener('keydown', cactus, false);
undefined

简单地说,仍然会阻止换行符(不良行为),并且没有任何变化。我也尝试重写覆盖函数的linebreaks函数,但行为仍然存在(足以查看,也可以使用断点验证)。这让我相信函数在添加之前以某种方式被复制......但其中? 我想知道我做错了什么或者我怎么解决这个问题。感谢。

0 个答案:

没有答案