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

わかりました、これで少し遊んでみましたが、これは私の android で正常に動作しています:

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 に答える
0

大雑把な推測: おそらく Android はkeydownステージで入力を登録します。両方のイベントを試すことができます。

于 2012-04-03T23:05:50.810 に答える