禁用原始javascript按键事件并动态替换

时间:2009-10-17 15:45:59

标签: javascript jquery html

目前我有一个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

2 个答案:

答案 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);
        }

    });
});