我试图自己解决这个问题无济于事。所有我似乎都能找到帮助,关于如何删除匿名函数事件处理程序。 这不是我遇到的问题。我想删除一个命名函数处理程序,无论出于什么原因,我似乎无法让它在我的生活中起作用。
以下是我提供的一些代码:
/**
* 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
函数,但行为仍然存在(足以查看,也可以使用断点验证)。这让我相信函数在添加之前以某种方式被复制......但其中?
我想知道我做错了什么或者我怎么解决这个问题。感谢。