2

大多数 Web 开发人员都知道,要将数字限制为表单输入,您可以执行以下操作:

$(function() {
    $("#foobar").keypress(function(e) {
    if($.inArray(e.which, range(48, 57)) == -1) {
        e.preventDefault();
        return false;
    }
    });
});

function range(start, end) {
    var range = [];

    for(var i = start; i <= end; i++) {
        range.push(i);
    }

    return range;
}

不幸的是,这并不能在使用默认浏览器的 Android 上完成工作。(iPhone 和其他 Android 浏览器尚未经过测试,因此它们可能会遇到同样的问题。在没有此问题的 iPhone 4S 上进行了测试。)

在 Android 上,假设您首先输入“f”。没发生什么事。惊人的。等一下。然后键入“a”。发生什么了?“f”被放入输入字段!您键入“c”,“a”被放入该字段。等等。无论先前输入的字符是什么,这就是输入该字段的内容。

这是一个演示该问题的 jsFiddle。

小提琴在桌面上工作正常,但在 Android(手机或模拟器)上试试。我已经使用 Android 2.3.6 和 2.2 进行了测试。

有人遇到过这个吗?任何方向将不胜感激!目前,解决方法是立即删除非数字字符(在keyup事件中)。

更新: 这是一个显示正在达到的小提琴。preventDefault()问题似乎是,而不是阻止,它只是延迟(直到下一个事件)。

4

3 回答 3

2

一种完全不同的方法是使用<input type="number">并依赖浏览器来提供适当的界面/过滤(移动浏览器容易出现这种情况)。老实说,它不会修复代码,但应该绕过看起来像错误的问题。

于 2012-04-04T00:10:38.193 回答
0

一个疯狂的猜测:也许机器人会在keydown舞台上注册输入。你可以尝试这两个事件。

于 2012-04-03T23:05:50.810 回答
0

好的,我玩了一点,这在我的安卓上运行良好:

var reserved = [0,8]

$(function()
{
    $("#foobar").keypress(function(e)
    {
        if($.inArray(e.which, reserved) < 0 && ((e.which < 48) || (e.which > 57)))
        {
            e.preventDefault();
            return false;
        }
    });
});

http://jsfiddle.net/HW794/1/embedded/result/

可能机器人不喜欢对 fn 的调用?(范围)

于 2012-04-03T23:34:51.163 回答