3

可能重复:
keydown 事件新值

没有找到我正在寻找的答案,尝试了一段时间,变得绝望:

我的目标是有一个可以是十进制的数字非负输入字段,并且有一个字母的单个字符后缀(legel 后缀集合存在)。

在技​​术层面上 - 我需要能够拒绝输入字符,并且我需要两个值(输入之前和之后)。

我尝试和失败的方法:

Keydown \ Keypress 事件:

无法获得“之后”,只有之前和 char/KeyCode。这是一个问题,因为我不知道在旧值中插入新字符的位置(不一定在末尾..) - 需要一种方法来获取“之后”或至少是字符所属的索引。

按键事件:

没有之前的值,但更糟糕的是 - 长按时不会触发(“00000000000000000 ...”),所以我不能拒绝输入。

OnChange/change/blur - 仅在失去焦点时触发,而不是我需要的功能。

有任何想法吗?

4

3 回答 3

1

将当前值保存在隐藏字段中并在必要时更新它的非常粗暴的方法怎么样?这将允许您访问“之前”和“之后”状态。

这不是一个好方法,但考虑到几乎不可能获得以前的值,我会考虑它。

于 2012-12-19T13:18:00.253 回答
0

很难知道onkeypress它之后的价值是多少。是的,我们知道按下的键(和修饰符),我们知道选择/光标,因此我们可以模拟将要发生的事情和preventDefaultAction事件keypress。但是我们对键盘布局做出的假设可能是错误的,并且有太多的极端情况输入法,我们几乎无法处理所有这些。

我想出的解决方案是手动维护输入的状态,并尽可能多地寻找变化。如果发生这种情况,则处理程序会以先前和之后的状态触发并返回新值。看起来是这样的:

function handler(afterval, prevval) {
    // do something
    return afterval; // return val can be used for length limits etc
}
(function(el, handler) {
    var curval = el.value;
    function check(e) {
        if (el.value != curval)
            curval = el.value = handler(el.value, curval);
    }
    $(el)
      .on("keyup input keydown change mouseup cut paste focus", check)
      .on("keypress", function(e) {
        check(e);
        setTimeout(check, 0); // also check after keypress as soon as possible
      });
})(handler);
于 2012-12-19T13:14:43.260 回答
0

我宁愿给你指出另一个方向。在早期的项目中,我遇到了同样的问题。我通过使用 jQuery 插件解决了它。所谓的“屏蔽输入”。

然后,您将能够给出一个正则表达式,说明用户应如何对该字段进行输入。

这是插件的Githup资源! https://github.com/digitalBush/jquery.maskedinput

您可以在此处找到示例和文档!

一个例子:

jQuery(function($){
    $("#element-id").mask("9.99a");
});

许多选项可用,只需检查创建自己的面具的能力!

于 2012-12-19T13:04:10.737 回答