<input type =“ number”>フィールドの生の値を取得する方法は?


117

フィールドの「実際の」値を取得するにはどうすればよい<input type="number">ですか?


私が持っているinput箱を、私は、新しいHTML5の入力タイプを使用していますnumber

<input id="edQuantity" type="number">

これは主にChrome 29でサポートされています。

ここに画像の説明を入力してください

ここで必要なのは、ユーザーが入力ボックスに入力した「生の」値を読み取る機能です。ユーザーが数値を入力した場合:

ここに画像の説明を入力してください

その後edQuantity.value = 4、そしてすべてが順調です。

しかし、ユーザーが無効なテキストを入力した場合、入力ボックスを赤に着色したいと思います。

ここに画像の説明を入力してください

残念ながら、type="number"入力ボックスの場合、テキストボックスの値が数値ではない場合value、空の文字列が返されます。

edQuantity.value = "" (String);

(少なくともChrome 29では)

コントロールの「生の」値を取得するにはどうすればよい<input type="number">ですか?

入力ボックスの他のプロパティのChromeのリストを調べてみました。

ここに画像の説明を入力してください

実際の入力に似ているものは何もありませんでした。

また、箱が「空」であるかどうかを確認する方法も見つかりませんでした。多分私は推測したかもしれません:

value          isEmpty        Conclusion
=============  =============  ================
"4"            false          valid number
""             true           empty box; not a problem
""             false          invalid text; color it red

:横罫線の後はすべて無視できます。質問を正当化するための単なるフィラーです。また、例と質問を混同しないでください。人々が理由でこの質問への答えをお勧めします他のボックスの赤を着色よりを(一例:テキストを変換する"four"ラテン語に"4"onBlurイベント中にシンボル)

コントロールの「生の」値を取得するにはどうすればよい<input type="number">ですか?

ボーナスリーディング


2
数値入力フィールドの「実際の」値は数値でなければなりません。数値以外の入力を許可する場合numberは、は探している入力タイプではありません。通常のtext入力を使用します。
robertc 2013

7
@robertc Chromeは、数値以外の入力を許可するエージェントです。私は彼らが数字以外のものを入力したことを知る必要があるだけです。
Ian Boyd

1
フィールドのvalidity状態を確認します-私は期待しtypeMismatchていますが、自分で確認していません。
robertc 2013

2
@ int32_t 6行目を読みます(つまり、「ユーザーが入力した場合...」
Ian Boyd

6
私の使用例...緯度と経度の2つの数値フィールドがあります。誰かが "lat、lon"を貼り付けて適切に処理したかどうかを検出したいと思います。これは、type = "number"では現在不可能です。「lat、lon」は無効なので、「生の」値を取得して正規表現を実行する方法はありません。別の使用例:顧客エラーの表示:「blahは無効な番号です」
ブラッドケント

回答:


55

WHATWGによると、有効な数値入力でない限り、値を取得できないはずです。入力数値フィールドのサニタイズアルゴリズムは、入力が有効な浮動小数点数でない場合、ブラウザは値を空の文字列に設定することになっていると言います。

値のサニタイズアルゴリズムは以下のとおりである場合に要素のではない有効な浮動小数点数、代わりに空の文字列を設定します。

タイプ(<input type="number">)を指定することで、ブラウザーにいくつかの作業を依頼します。一方、数値以外の入力をキャプチャして何かを実行できるようにしたい場合は、古くて試された真のテキスト入力フィールドを使用して、自分でコンテンツを解析する必要があります。

W3は、同じスペックを持っており、追加します。

ユーザーエージェントは、ユーザーが値を有効な浮動小数点数ではない空でない文字列に設定することを許可してはなりません。


6
ユーザーエージェントがユーザーに値を有効な浮動小数点数ではない空でない文字列に設定することを許可しなかった場合に役立ちます。しかし、whatwgがそれを行うことができないと言った場合、それが答えです。以下に追加されている現在のニーズに対する回避策。
Ian Boyd

57
タイプ(<input type="number">)を指定することで、ブラウザーにいくつかの作業を依頼します。個人的には、モバイルブラウザーにテンキーを表示するように要求していて、不愉快な追加機能として検証を受けました。これらの問題のほとんどは、type属性が検証ルールと表示する入力メカニズムに関するルールの両方を決定するという事実に起因しますが、デスクトップユーザーに数値検証を適用することを望まずに、モバイルユーザーに数字キーボードを表示することも可能です。HTML 5.1は、少なくともinputmode属性を使用してこの問題を解決します。
マークアメリー2014

4
でもブラウザが足りない時は完成させたいです。入力のスペースの削除、小数点の推測など
njzk2 '28

1
また、フランス語などのさまざまな言語では、数字は2語です。1つは、クレジットカード番号などの識別子としての数値用、もう1つは、浮動小数点数などの数値をカウントするためのものです。
njzk2 2014年

1
iPhoneはキーボードに小数点を配置しないため、@ MotiKoretsは浮動小数点数の入力には機能しません。残念ながら、現時点
Andy

50

それは質問には答えませんが、便利な回避策はチェックすることです

edQuantity.validity.valid

ValidityStateオブジェクトのは、ユーザーが入力したものについての手がかりを与えます。type="number"a minmaxsetのある入力を考えます

<input type="number" min="1" max="10">

私たちは、常に使いたいです.validity.valid

他のプロパティはボーナス情報のみを提供します:

User's Input  .value  .valid | .badInput  .rangeUnderflow  .rangeOverflow
============  ======  ====== | =========  ===============  ==============
""            ""      true   | false      false            false  ;valid because field not marked required
"1"           "1"     true   | false      false            false  
"10"          "10"    true   | false      false            false
"0"           "0"     false  | false      true             false  ;invalid because below min
"11"          "11"    false  | false      false            true   ;invalid because above max
"q"           ""      false  | true       false            false  ;invalid because not number
"³"           ""      false  | true       false            false  ;superscript digit 3
"٣"           ""      false  | true       false            false  ;arabic digit 3
"₃"           ""      false  | true       false            false  ;subscript digit 3

ブラウザを使用する前に、ブラウザがHTML5検証をサポートしていることを確認する必要があります。

function ValidateElementAsNumber(element)
{
   //Public Domain: no attribution required.
   if ((element.validity) && (!element.validity.valid))
   {
      //if html5 validation says it's bad: it's bad
      return false;
   }

   //Fallback to browsers that don't yet support html5 input validation
   //Or we maybe want to perform additional validations
   var value = StrToInt(element.value);
   if (value != null)
      return true;
   else
      return false;
}

ボーナス

スパッドリーは彼が削除した有用な答えを持っています:

これにはCSS :invalidセレクターを使用するだけです。

input[type=number]:invalid {
    background-color: #FFCCCC;
}

これにより、数値以外の有効な値が入力されると、要素が赤に変わります。

のブラウザサポートは<input type='number'>とほぼ同じな :invalidので、問題ありません。

詳細については、:invalid こちらをご覧ください


Operaでは機能しません。文字列を入力しても有効と表示されます。
ベルギ2013

Operaはこの.validityプロパティをサポートしていますが、正しく処理しません.validか?
Ian Boyd

ありますが、数値入力はいつ無効ですか?入力が空であるかのように機能します。A typeMismatchは理にかなっているかもしれませんが、それは電子メールまたはURLタイプの場合のみです
Bergi

@Bergi上記の表は、数値入力が無効になる可能性がある例を示しています: "q"、 "11"(最大値は10)、 "0"(最小値が1の場合)、 ""(要素はrequired
Ianボイド

1
@Bergi .badInput 11/20/2012 に追加されました。しかしbadInput、入力が有効かどうかを確認するために誰も見ているべきではありません。彼らは見ている必要があります.valid.badInputがfalseである可能性があり(かつ正しい)、それでも無効な入力がある。.validは、検証エラー(例:不一致、オーバーフロー、アンダーフロー)が存在しないこととして定義され.badInputます。これらのエラーは1種類のみです。上のグラフ.badInputはfalseですが、入力はまだ無効です。
Ian Boyd


4

キーコードに基づいて、押されたすべてのキーを追跡します

キーアップイベントをリッスンし、キーコードに基づいて入力されたすべての文字の配列を保持できると思います。しかし、これはかなり退屈な作業であり、おそらくバグが発生しやすくなります。

http://unixpapa.com/js/key.html

入力を選択し、文字列として選択を取得します

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

すべてのクレジット:int32_t


その解決策は他の場所で試されたため、機能しません。特にときにユーザープレスDeleteBackspaceCtrl+XCtrl+VRight-click-cutRight-click-paste
Ian Boyd

私はあなたに同意します、基本的にOPが尋ねたことは不可能です。しかし、私が言及した両方のハック(そしてそれらはハックであり、私はそれを否定しません)はある程度機能します。おそらく、それらは誰かにとって役立つ場合がありますか?
sandstrom 2013年

驚くべきことに、セレクションはうまくいくようです。その方法の制限は何ですか?
njzk2

制限:テキストは視覚的に選択されます。ユーザーが何かを入力すると、コンテンツは消えます
fregante

この方法の悪さを示すライブデモで編集
vsync 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.