jquery - 为什么我的 jQuery 中允许退格键,无论我是否将其过滤掉?

标签 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”(退格键)。为什么?我想目前这对我来说不是问题,但如果我真的想要防止退格怎么办?

最佳答案

如果您确实想防止退格键,则应该取消绑定(bind)默认事件并重新附加它的"new"版本。

尝试如下:

$(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
});

关于jquery - 为什么我的 jQuery 中允许退格键,无论我是否将其过滤掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30764987/

相关文章:

javascript - Jquery:试图在悬停时隐藏和显示具有相同 ID 和编号的多个 div

regex - 如何使用 Google Sheet REGEXEXTRACT 公式提取完全用大写字母书写的带有重音符号(变音符号)的单词?

ruby - 在 UTF-8 环境中使用 Ruby 1.9 读取 ASCII 编码的文件

javascript - 如何使按键事件的目标等于 "selected"元素?

python-2.7 - 使用 Python 的机器人框架,按键无需选择页面中的任何按钮或元素

unit-testing - 无法在 Angular 2 单元测试(Jasmine)中模拟按键事件

javascript - 你如何根据ipinfo提供的获取货币符号?

jquery - 为什么 Slickgrid Ajax/无限滚动会产生间歇性的空白行?

javascript - 需要将ajax响应分配给div

c++ - 如何检查字符常量是否符合ASCII?