Chromeの入力type =“ number”ではmaxlengthは無視されます


231

maxlength属性はで作業されていません<input type="number">。これはChromeでのみ発生します。

<input type="number" class="test_css"  maxlength="4"  id="flight_number" name="number"/>

回答:


277

以下からの用MDNのドキュメント<input>

値ならばタイプ属性であるtextemailsearchpasswordtel、又はurl、この属性は、ユーザが入力することができる(Unicodeコードポイントで)文字の最大数を指定します。他の制御タイプの場合は無視されます。

したがって、設計maxlength上無視さ<input type="number">れます。

必要に応じて、回答で提案されているinonのようにminand max属性を使用できます(注:これは、値の実際の文字長ではなく、制限された範囲のみを定義しますが、-9999から9999はすべて0-4をカバーします数字)、または通常のテキスト入力を使用して、新しい属性でフィールドの検証を強制できます。pattern

<input type="text" pattern="\d*" maxlength="4">

13
またtype="number"、これはHTML 5仕様の新しいタイプです。あなたがテストしているブラウザが認識しない場合はtype="number"、それを扱うようtype="text"いる尊重maxlength属性を。これは、表示されている動作を説明している可能性があります。
アンドレ・ディオン

8
@fooquency、ここではありません。実際には、属性type=numberを設定して「キーボード入力」の物理的な長さを入力に制限することはできませんmax。この属性は、入力のスピナーによって選択された数のみを制限します。
カミリウス

5
\d*ここは何ですか?
Pardeep Jain、2016

4
pattern = "\ d *"は、IE11またはFirefox 56では機能しません。jsfiddle.net/ yyvrz84v
Reado

4
regexパターンの使用は非常にクリエイティブです。しかし、モバイル変わらないでAndroidiOS、それはだtext、それが悪いの原因となるので、入力UX
AmerllicA

215

最大長は<input type="number"oninputイベントを使用して最大長を制限するのが最善の方法では機能しません。以下のコードをご覧ください。

<input name="somename"
    oninput="javascript: if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);"
    type = "number"
    maxlength = "6"
 />

鮮やかさ。ありがとう!
taketheleap

@Guedesバージョンは、テスト済みのすべてのデバイスでtypeを "number"に設定して動作します。しかし、私は表現の2番目の部分を完全には理解していません||0/1
Barleby

34
@Barleby。ただ、oninput="this.value=this.value.slice(0,this.maxLength)"動作するはずです
ワシントンGuedesの

1
上記の<input type="number">
@WashingtonGuedes

1
このアプローチでは先行ゼロは表示されないことに注意してください!
HadidAli

53

多くの人onKeyDown()まったく機能ないイベントを投稿しました。つまり、制限に達すると削除できません。したがって、onKeyDown()使用する代わりにonKeyPress()、それは完全に正常に動作します。

以下は作業コードです:

User will not be allowed to enter more than 4 digits
<br>
<input type="number" pattern="/^-?\d+\.?\d*$/" onKeyPress="if(this.value.length==4) return false;" />


3
これは非常に役立ちますnumber
。html5

4
テキストボックスに4桁の数字を入力した後、更新の余地がないままフリーズするだけで、削除もバックスペースキーも機能せず、何も機能しません。
Abbas

1
urスニペット(1.2.3.4.5.5.6.76.7)で入力できました
Alaa '

1
これは受け入れられる答えになるはずです。数値フィールドを保持するための非常に賢い方法。スピンボタンを使用すると、4桁を超える可能性があるため、最小/最大属性を必ず追加してください
NiallMitch14

3
9999と入力して入力時に上ボタンを押すと機能しません。
Csaba Gergely

37

私はあなたがそれをするための2つの方法を持っています

まずtype="tel"、を使用します。これはtype="number"モバイルと同じように機能し、maxlengthを受け入れます。

<input type="tel" />

次に、JavaScriptを少し使用します。

<!-- maxlength="2" -->
<input type="tel" onKeyDown="if(this.value.length==2 && event.keyCode!=8) return false;" />

2
2番目の答えはあまり良くありません。2文字に達した場合、数字を削除することはできません。
vtni 2014年

はい、数値入力がvalue.lengthを返さないことにも気付きました。とにかく、Backspaceキーコードを含めて編集しました
Maycow Moura

2
配列キーと削除(転送)ボタンも含める必要があります。
vtni 2014年

これはいいです。そして、これは私のためだけに働きます。賛成
salesem ahmed

1
素晴らしい答え、tnx。ただし、この場合、「番号」ではなく「tel」を使用する理由がわかりません。さらに、自然な分子の場合、「event.keyCode!= 8」の条件を「event.keyCode> 47 && event.keyCode <58」に置き換えて、ユーザーが数字を入力することだけを無効にすることができます。
Dudi

28

minおよびmax属性を使用できます。

次のコードでも同じことが行われます。

<input type="number" min="-999" max="9999"/>

2
これが正しい答えになるはずです。Chromeは少なくとも、最小/最大パラメータに基づいて、ボックスを適切にサイズ変更します。
fooquency 2014

70
ただし、長さ制限を追加する場合は機能しませんが9999、ユーザーがその長さを超える数を手動で入力できる数を超えることはできません。
Philll_t 2015年

10

入力タイプをテキストに変更し、「oninput」イベントを使用して関数を呼び出します。

<input type="text" oninput="numberOnly(this.id);" class="test_css" maxlength="4" id="flight_number" name="number"/>

JavaScript正規表現を使用してユーザー入力をフィルタリングし、数値のみに制限します。

function numberOnly(id) {
    // Get element by id which passed as parameter within HTML element event
    var element = document.getElementById(id);
    // Use numbers only pattern, from 0 to 9
    var regex = /[^0-9]/gi;
    // This removes any other character but numbers as entered by user
    element.value = element.value.replace(regex, "");
}

デモ:https : //codepen.io/aslami/pen/GdPvRY


1
私が見つけた最高の「数字のみ」の答え。evt.keycodeを使用している他の人が私のAndroidで失敗するようです
deebs

1
1つの非常にマイナーなmod、「this.id」を「this」に、numberOnly(id)をnumberOnly(element)に変更すると、numberOnlyの最初の行は不要で、IDなしで機能します
tony

8

私はかつて同じ問題に遭遇し、私のニーズに関してこの解決策を見つけました。それは誰かを助けるかもしれません。

<input type="number" placeholder="Enter 4 Digits" max="9999" min="0" 
onKeyDown="if(this.value.length==4 && event.keyCode>47 && event.keyCode < 58)return false;"
/>

ハッピーコーディング:)


3

長さ制限のある数値入力でもこれを試すことができます

<input type="tel" maxlength="4" />

8
一部のブラウザー(具体的にはモバイル)では、tel入力自体が自動的に検証され、一部の奇妙なケースでは、先頭0のがに変更され1ます。
Philll_t 2015年

3
<input type="number" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" onKeyDown="if(this.value.length==10 && event.keyCode!=8) return false;">

デモ-JSFIDDLE


3

これがjQueryを使用した私の解決策です...あなたは入力type = numberにmaxlengthを追加する必要があります

$('body').on('keypress', 'input[type=number][maxlength]', function(event){
    var key = event.keyCode || event.charCode;
    var charcodestring = String.fromCharCode(event.which);
    var txtVal = $(this).val();
    var maxlength = $(this).attr('maxlength');
    var regex = new RegExp('^[0-9]+$');
    // 8 = backspace 46 = Del 13 = Enter 39 = Left 37 = right Tab = 9
    if( key == 8 || key == 46 || key == 13 || key == 37 || key == 39 || key == 9 ){
        return true;
    }
    // maxlength allready reached
    if(txtVal.length==maxlength){
        event.preventDefault();
        return false;
    }
    // pressed key have to be a number
    if( !regex.test(charcodestring) ){
        event.preventDefault();
        return false;
    }
    return true;
});

コピーと貼り付けを処理します。

$('body').on('paste', 'input[type=number][maxlength]', function(event) {
    //catch copy and paste
    var ref = $(this);
    var regex = new RegExp('^[0-9]+$');
    var maxlength = ref.attr('maxlength');
    var clipboardData = event.originalEvent.clipboardData.getData('text');
    var txtVal = ref.val();//current value
    var filteredString = '';
    var combined_input = txtVal + clipboardData;//dont forget old data

    for (var i = 0; i < combined_input.length; i++) {
        if( filteredString.length < maxlength ){
            if( regex.test(combined_input[i]) ){
                filteredString += combined_input[i];
            }
        }
    }
    setTimeout(function(){
        ref.val('').val(filteredString)
    },100);
});

誰かのお役に立てば幸いです。


私は同じ考えを持ちましたが(「入力」イベントを使用しましたが)、@ WashingtonGuedesが別の回答へのコメントに書き込んだ解決策ははるかに簡単this.value = this.value.slice(0, this.maxLength);だと思います。これには問題があると思いますか?私は今のところ見つけていません。貼り付けたテキストもカバーします。
nonzaprej

私は長い道のりが好きです。RegExpの使用法は非常に柔軟です。
harley81

2

私の経験でmaxlengthは、無視される理由を尋ねられるほとんどの問題は、ユーザーが「許可された」文字数より多くの文字を入力できるためです。

他のコメントで述べたように、type="number"入力にはmaxlength属性がなく、代わりにminand max属性があります。

フォームが送信される前にユーザーがこれを認識できるようにしながら、挿入できる文字数をフィールドで制限するには(ブラウザーは値> maxを識別する必要があります)、(現時点では少なくとも)追加する必要があります。フィールドのリスナー。

これは私が過去に使用したソリューションです:http : //codepen.io/wuori/pen/LNyYBM


ここではminとmaxは役に立たないので、ユーザーが入力フィールドに無限の数を入力することを妨げません。
andreszs 2018

そうだね。矢印キーまたはアップ/ダウンコントローラー(Chromeなど)を使用しているときだけ、それらが動作しているのがわかります。これらの属性を使用して、その後の検証に関連付けることができますが、これは私にとっては効果的です。これにより、マークアップ(i18nなど)とJSのみで制限を制御できます。
Mウオリ

1

私はすでに答えがあることを知っていますが、入力をmaxlength属性とまったく同じように、またはできるだけ近くに動作させたい場合は、次のコードを使用します。

(function($) {
 methods = {
    /*
     * addMax will take the applied element and add a javascript behavior
     * that will set the max length
     */
    addMax: function() {
        // set variables
        var
            maxlAttr = $(this).attr("maxlength"),
            maxAttR = $(this).attr("max"),
            x = 0,
            max = "";

        // If the element has maxlength apply the code.
        if (typeof maxlAttr !== typeof undefined && maxlAttr !== false) {

            // create a max equivelant
            if (typeof maxlAttr !== typeof undefined && maxlAttr !== false){
                while (x < maxlAttr) {
                    max += "9";
                    x++;
                }
              maxAttR = max;
            }

            // Permissible Keys that can be used while the input has reached maxlength
            var keys = [
                8, // backspace
                9, // tab
                13, // enter
                46, // delete
                37, 39, 38, 40 // arrow keys<^>v
            ]

            // Apply changes to element
            $(this)
                .attr("max", maxAttR) //add existing max or new max
                .keydown(function(event) {
                    // restrict key press on length reached unless key being used is in keys array or there is highlighted text
                    if ($(this).val().length == maxlAttr && $.inArray(event.which, keys) == -1 && methods.isTextSelected() == false) return false;
                });;
        }
    },
    /*
     * isTextSelected returns true if there is a selection on the page. 
     * This is so that if the user selects text and then presses a number
     * it will behave as normal by replacing the selection with the value
     * of the key pressed.
     */
    isTextSelected: function() {
       // set text variable
        text = "";
        if (window.getSelection) {
            text = window.getSelection().toString();
        } else if (document.selection && document.selection.type != "Control") {
            text = document.selection.createRange().text;
        }
        return (text.length > 0);
    }
};

$.maxlengthNumber = function(){
     // Get all number inputs that have maxlength
     methods.addMax.call($("input[type=number]"));
 }

})($)

// Apply it:
$.maxlengthNumber();

私はこれを気に入っています。自分で使用するために少し調整しました(許可されているクロムの「e」を人々に入力させたくありませんでした)。
Mathijs Segers 2015

1

Chrome(技術的にはBlink)はのmaxlength実装しません<input type="number">

HTML5仕様によると、maxlengthはテキスト、URL、電子メール、検索、Tel、およびパスワードのタイプにのみ適用可能です。


以前に言及されていないものに役立つものは何も追加されません
candidJ

1

私が最近試した絶対的な解決策は次のとおりです。

<input class="class-name" placeholder="1234567" name="elementname"  type="text" maxlength="4" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

これは汎用JSであるため、どこでも機能します。私はAngular 5を使用したプロジェクトに取り組んでおり、それは魅力のように機能します。おそらく、プロジェクト全体で再利用できるように、角度コードでサービスを作成するのに10分を費やすことができます。
ベネディクト氏

0

これをすばやく簡単に理解できるようにします。

maxlengthの代わりにtype='number'(maxlengthは、textタイプ内の文字列の最大文字数を定義することを意味します)、min=''およびを使用しmax=''ます。

乾杯


0

<input type="number"> それだけです...数値入力(ただし、文字列からJavascriptを介して浮動小数点に変換されません)。

私の推測では、キー入力時の文字を制限していません。そうでない場合maxLength、ユーザーが最初に小数を忘れた場合に「キートラップ」でスタックする可能性があります(「maxLength」属性にすでに達しているときに.atインデックスを配置してみてください)。ただし、属性を設定すると、フォームの送信時に検証されます。1<input type"text">max

電話番号を制限または検証する場合は、type="tel"attr / valueを使用します。これはmaxLengthattr に従い、携帯電話の数字キーボードのみを表示し(最新のブラウザ)、パターンへの入力を制限できます(つまりpattern="[0-9]{10}")。


0

Reactユーザーの場合、

10を最大長の要件に置き換えるだけです

 <input type="number" onInput={(e) => e.target.value = e.target.value.slice(0, 10)}/>

-1

maxlenght-入力タイプのテキスト

<input type="email" name="email" maxlength="50">

jQueryを使用:

$("input").attr("maxlength", 50)

maxlenght-入力タイプ番号

JS

function limit(element, max) {    
    var max_chars = max;
    if(element.value.length > max_chars) {
        element.value = element.value.substr(0, max_chars);
    } 
}

HTML

<input type="number" name="telefono" onkeydown="limit(this, 20);" onkeyup="limit(this, 20);">
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.