为什么在我的jQuery中允许退格是否我将其过滤掉?

时间:2015-06-10 18:57:25

标签: jquery ascii keypress backspace

我有这个jQuery:

$(document).on("keypress", '[id*=Float]', function (e) { 
    //only allow 1..9 (48..57), '.' (46), and backspace (8)
    var k = e.which;
    if (k === 8 || k === 46) return;
    if (k < 48 || k > 57) { e.preventDefault(); }
});

...正在处理这个HTML:

<input type="text" id="txtbxFloat">
</br>
<input type="text" id="txtbxHopeFloats">
</br>
<input type="text" id="txtbxFloatingFreeAsABird">

可以摆弄here

它做了评论所说的/我想要的。但是,这样做:

$(document).on("keypress", '[id*=Float]', function (e) { 
    //only allow 1..9 (48..57), '.' (46), and backspace (8)
    var k = e.which;
    if (k === 46) return;
    if (k < 48 || k > 57) { e.preventDefault(); }
});

IOW,在任何一种情况下都允许使用“8”(退格)。为什么?我想这对我来说不是问题,但是如果我真的想要来防止退格呢?

3 个答案:

答案 0 :(得分:2)

如果你真的想要阻止退格,你应该取消绑定默认事件并重新附加它的“新”版本。

尝试类似:

$(document).unbind('keydown').bind('keydown', function (event) {
    var doPrevent = false;
    if (event.keyCode === 8) {
        var d = event.srcElement || event.target;
        if ((d.tagName.toUpperCase() === 'INPUT' && (d.type.toUpperCase() === 'TEXT' || d.type.toUpperCase() === 'PASSWORD' || d.type.toUpperCase() === 'FILE')) || d.tagName.toUpperCase() === 'TEXTAREA') {
            doPrevent = d.readOnly || d.disabled;
        }
        else {
            doPrevent = true;
        }
    }

    if (doPrevent) {
        event.preventDefault();
    }
    // rest of code here
});

答案 1 :(得分:2)

我认为使用退格时不会触发keypress因为keypress在输入实际字符(任何打印键)时触发。退格键不输入任何字符。如果按下任何键,keydown将触发。这就是keydown应该有效防止退格的原因。

这是Jquery spec

中提到的内容

当浏览器注册键盘输入时,按键事件将发送到元素。这类似于keydown事件,除了修饰符和非打印键,如Shift,Esc和delete触发keydown事件,但不是keypress事件。**两个事件之间的其他差异可能会产生,具体取决于在平台和浏览器上。

答案 2 :(得分:1)

我认为解决方案是使用keydown代替keypress

键盘事件按此顺序发生:keydownkeyupkeypress

$(document).on("keydown", '[id*=Float]', function (e) { 
    //only allow 1..9 (48..57), '.' (46), and backspace (8)
    var k = e.which;
    if (k === 46) return;
    if (k < 48 || k > 57) { e.preventDefault(); }
});