目前我有一个textarea,其中包含HTML标记中指定的onkeypress事件。我试图捕获此按键并将其保存为将用于覆盖它的函数,因为我想在运行时添加另一个条件。这是我试图实现的代码。
$(document).ready(function(e) {
var defaultKeypress = $('textarea').keypress;
$('textarea').keypress(function(e) {
if (fieldsChanged) {
fieldsChanged = false;
}
else {
defaultKeypress(e);
}
});
});
我遇到的问题是IE 7& 8.两者都触发原始按键(即使“defaultKeypress(e);”被注释掉)并且新的按键被触发。 (原文第一,然后是新的)。除了从textarea标签中删除onkeypress属性(我不能这样做,因为如果生成代码),有没有办法禁止原始按键被触发?
谢谢! Nutzy
答案 0 :(得分:4)
jQuery的keypress
方法添加您传递给它的处理程序,并且不覆盖任何内容。这非常符合设计。这样,您可以将多个事件处理程序附加到相关元素,而不必担心破坏任何现有的处理程序。
你实际上想要来破坏现有的处理程序。您无法使用unbind
。不过你可以自己删除处理程序:
var $el = $('textarea'),
defaultKeypress = $el.attr('onkeypress');
$el.removeAttr('onkeypress');
$el.keypress(function(e) {
if (fieldsChanged) {
fieldsChanged = false;
}
else {
return defaultKeypress.apply(this, arguments);
}
});
注意我使用defaultKeypress
使用正确的范围调用apply
,并使用return
将结果传回。这就是维护浏览器用它调用它的标准事件处理程序环境。
参考文献:
答案 1 :(得分:1)
您是否研究过unbind方法?
我没有试过这个,但我想它应该像这样工作。
$(document).ready(function(e) {
var defaultKeypress = $('textarea').keypress;
$('textarea').unbind("keypress");
$('textarea').keypress(function(e) {
if (fieldsChanged) {
fieldsChanged = false;
}
else {
defaultKeypress(e);
}
});
});