event.preventDefault()在Android上的keypress事件中无效

时间:2012-04-03 22:36:03

标签: javascript jquery android

大多数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”放入字段中。等等。无论先前输入的角色是什么,这就是投入到现场的内容。

Here's a jsFiddle that demonstrates the issue.

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

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

更新 Here is a fiddle表示正在联系preventDefault()。问题似乎是,而不是阻止,它只是推迟(直到下一个事件)。

3 个答案:

答案 0 :(得分:2)

完全不同的方法是使用<input type="number">并依靠浏览器提供适当的界面/过滤(移动浏览器易于使用)。它没有修复代码,但应该规避问题,这看起来像一个bug,说实话。

答案 1 :(得分:1)

一个疯狂的猜测:也许Androids在keydown阶段注册输入。你可以试试这两个事件。

答案 2 :(得分:0)

好的,我玩了一下,这对我的andriod运行正常:

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/

可能droid不喜欢fn的调用? (范围)