<input type=text />
HTML テキスト入力 ( ) で数字キー (および '.') のみを許可するように設定するための簡単な方法はありますか?
ベストアンサー1
JavaScript
更新:より簡単な解決策は、beforeinput
イベント。
<input>
以下の機能を使用してテキストの入力値をフィルタリングできますsetInputFilter
(コピー+貼り付け、ドラッグ+ドロップ、キーボードショートカット、コンテキストメニュー操作、入力できないキー、キャレットの位置、さまざまなキーボードレイアウト、妥当性エラーメッセージなどをサポート)。IE 9以降のすべてのブラウザ):
// Restricts input for the given textbox to the given inputFilter function.
function setInputFilter(textbox, inputFilter, errMsg) {
[ "input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop", "focusout" ].forEach(function(event) {
textbox.addEventListener(event, function(e) {
if (inputFilter(this.value)) {
// Accepted value.
if ([ "keydown", "mousedown", "focusout" ].indexOf(e.type) >= 0){
this.classList.remove("input-error");
this.setCustomValidity("");
}
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
}
else if (this.hasOwnProperty("oldValue")) {
// Rejected value: restore the previous one.
this.classList.add("input-error");
this.setCustomValidity(errMsg);
this.reportValidity();
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
}
else {
// Rejected value: nothing to restore.
this.value = "";
}
});
});
}
setInputFilter
次の関数を使用して入力フィルターをインストールできるようになりました。
setInputFilter(document.getElementById("myTextBox"), function(value) {
return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp.
}, "Only digits and '.' are allowed");
好みのスタイルをinput-error
クラスに適用します。以下は提案です:
.input-error{
outline: 1px solid red;
}
サーバー側の検証も行う必要があることに注意してください。
もう 1 つの注意点は、直接設定するため、元に戻すスタックが壊れることですthis.value
。つまり、CtrlZ無効な文字を入力した後は、入力を元に戻すことはできません。
デモ
を参照してくださいJSFiddle デモ入力フィルターのその他の例については、以下のスタック スニペットを実行してください。
// Restricts input for the given textbox to the given inputFilter.
function setInputFilter(textbox, inputFilter, errMsg) {
[ "input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop", "focusout" ].forEach(function(event) {
textbox.addEventListener(event, function(e) {
if (inputFilter(this.value)) {
// Accepted value.
if ([ "keydown", "mousedown", "focusout" ].indexOf(e.type) >= 0) {
this.classList.remove("input-error");
this.setCustomValidity("");
}
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
}
else if (this.hasOwnProperty("oldValue")) {
// Rejected value: restore the previous one.
this.classList.add("input-error");
this.setCustomValidity(errMsg);
this.reportValidity();
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
}
else {
// Rejected value: nothing to restore.
this.value = "";
}
});
});
}
// Install input filters.
setInputFilter(document.getElementById("intTextBox"), function(value) {
return /^-?\d*$/.test(value);
}, "Must be an integer");
setInputFilter(document.getElementById("uintTextBox"), function(value) {
return /^\d*$/.test(value);
}, "Must be an unsigned integer");
setInputFilter(document.getElementById("intLimitTextBox"), function(value) {
return /^\d*$/.test(value) && (value === "" || parseInt(value) <= 500);
}, "Must be between 0 and 500");
setInputFilter(document.getElementById("floatTextBox"), function(value) {
return /^-?\d*[.,]?\d*$/.test(value);
}, "Must be a floating (real) number");
setInputFilter(document.getElementById("currencyTextBox"), function(value) {
return /^-?\d*[.,]?\d{0,2}$/.test(value);
}, "Must be a currency value");
setInputFilter(document.getElementById("latinTextBox"), function(value) {
return /^[a-z]*$/i.test(value);
}, "Must use alphabetic latin characters");
setInputFilter(document.getElementById("hexTextBox"), function(value) {
return /^[0-9a-f]*$/i.test(value);
}, "Must use hexadecimal characters");
.input-error {
outline: 1px solid red;
}
<h2>JavaScript input filter showcase</h2>
<p>Supports Copy+Paste, Drag+Drop, keyboard shortcuts, context menu operations, non-typeable keys, the caret position, different keyboard layouts, and <a href="https://caniuse.com/#feat=input-event" target="_blank">all browsers since IE 9</a>.</p>
<p>There is also a <a href="https://jsfiddle.net/emkey08/tvx5e7q3" target="_blank">jQuery version</a> of this.</p>
<table>
<tr>
<td>Integer</td>
<td><input id="intTextBox"></td>
</tr>
<tr>
<td>Integer >= 0</td>
<td><input id="uintTextBox"></td>
</tr>
<tr>
<td>Integer >= 0 and <= 500</td>
<td><input id="intLimitTextBox"></td>
</tr>
<tr>
<td>Float (use . or , as decimal separator)</td>
<td><input id="floatTextBox"></td>
</tr>
<tr>
<td>Currency (at most two decimal places)</td>
<td><input id="currencyTextBox"></td>
</tr>
<tr>
<td>A-Z only</td>
<td><input id="latinTextBox"></td>
</tr>
<tr>
<td>Hexadecimal</td>
<td><input id="hexTextBox"></td>
</tr>
</table>
タイプスクリプト
以下は TypeScript バージョンです。
function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean, errMsg: string): void {
["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop", "focusout" ].forEach(function(event) {
textbox.addEventListener(event, function(this: (HTMLInputElement | HTMLTextAreaElement) & { oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null }) {
if (inputFilter(this.value)) {
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
}
else if (Object.prototype.hasOwnProperty.call(this, "oldValue")) {
this.value = this.oldValue;
if (this.oldSelectionStart !== null &&
this.oldSelectionEnd !== null) {
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
}
}
else {
this.value = "";
}
});
});
}
jQuery
これにはjQueryバージョンもあります。この答え。
HTML5
HTML5にはネイティブソリューションがあります<input type="number">
(仕様そしてドキュメンテーション)。ドキュメントには、この入力タイプの動作デモが記載されています。
- プロパティを読む代わりに
value
、valueAsNumber
入力のプロパティを使用して、入力された値を文字列ではなく数値として取得します。 - 検証が容易になるため、内での使用
<form>
が推奨されます。たとえば、 を押すと、Enter値が無効な場合にエラー メッセージが自動的に表示されます。- あなたは
checkValidity
方法またはrequestSubmit
明示的に有効性をチェックするために、フォーム全体にメソッドを適用します。 required
空の入力を禁止するには、属性を使用する必要があることに注意してください。
- あなたは
- あなたは
checkValidity
方法またはvalidity
明示的に有効性をチェックするために、入力要素自体にプロパティを設定します。 - 使用できます
reportValidity
エラーメッセージを表示して使用するにはsetCustomValidity
独自のメッセージを設定します。
このアプローチは、根本的に異なるユーザー エクスペリエンスをもたらします。無効な文字を入力することが許可され、検証は別途実行されます。これには、元に戻すスタック ( ) が壊れないという利点がありますCtrlZ。どちらのアプローチを選択した場合でも、サーバー側の検証は必ず実行する必要があることに注意してください。
ただし、ブラウザのサポートは異なることに注意してください。
- ほとんどのブラウザは、入力時には検証せず、フォームの送信時にのみ入力内容を検証します。
- ほとんどのモバイルブラウザ
step
、、属性min
はサポートされていませんmax
。 - Chrome(バージョン71.0.3578.98)では、ユーザーは引き続きフィールドに文字を入力できます
e
。Q &Aもご覧ください。E
HTML 入力ではなぜフィールドにtype="number"
文字を入力できるのでしょうか?e
。 - Firefox (バージョン 64.0) および Edge (EdgeHTML バージョン 17.17134) では、ユーザーは引き続きフィールドに任意のテキストを入力できます。
デモ
document.querySelector("form").addEventListener("submit", (event) => {
event.preventDefault();
console.log(`Submit!
Number is ${event.target.elements.number.valueAsNumber},
integer is ${event.target.elements.integer.valueAsNumber},
form data is ${JSON.stringify(Object.fromEntries(new FormData(event.target).entries()))}.`);
})
label {
display: block;
}
<form>
<fieldset>
<legend>Get a feel for the UX here:</legend>
<label>Enter any number: <input name="number" type="number" step="any" required></label>
<label>Enter any integer: <input name="integer" type="number" step="1" required></label>
<label>Submit: <input name="submitter" type="submit"></label>
</fieldset>
</form>