があり、<input type="number" />
数字以外の文字が入力されないようにしたいです。
<input id="app-client-id" type="number" pattern="[0-9]+" />
通常のキー押下を防ぐために、これを行うことができます
const validKeys = new Set([
'home',
'end',
'pageup',
'pagedown',
'delete',
'backspace',
'arrowleft',
'arrowright',
]);
function isValidKeypress(e) {
// numeric characters
if (e.charCode >= 48 && e.charCode <= 57) {
return true;
}
if (e.key && validKeys.has(e.key.toLowerCase())) {
return true;
}
// for allowing select all, copy, and paste
if (e.ctrlKey) {
return true;
}
return false;
}
$('#app-client-id').on('keypress', isValidKeypress);
あとは、数字以外の文字の貼り付けを防止するか、理想的には数字以外の文字を除外するだけです。
function filterPastedText(e) {
let clipboardData = e.originalEvent.clipboardData,
text = clipboardData.getData('text').replace(/[^\d]/g, '');
clipboardData.setData('text', text);
}
$('#app-client-id').on('paste', filterPastedText);
これは Chrome/Webkit で機能します。 ただし、Firefox では、次のエラーがスローされますsetData()
。
NoModificationAllowedError: このドキュメントの変更は許可されていません
呼び出しを許可するようにブラウザに指示する方法についてのアイデアはありますsetData()
か?
そのような方法が存在しない場合、フィルター処理された値を手動でinput
右のカーソル位置に「貼り付ける」方法はありますか (存在する場合は選択したテキストを置き換える) 、非表示を使用しtextarea
ませんか? input
テキストが選択されているかどうかに関係なく、要素内のカーソルの位置を検出できません。myInput.selectionStart
は常にnull
。
編集
実際、呼び出しsetData()
は Chrome では機能しないことがわかりました。「e」、「-」、および「.」を除くnumber
非数値文字を自動的に除外するようにタイプを設定し、テストしていた文字列には、これらの文字が含まれていませんでした。呼び出しは単にサイレントに失敗します。setData()