有没有一种快速的方法可以设置HTML文本输入框(<input type=text />
)只允许数字按键(包括 '.')?
有没有一种快速的方法可以设置HTML文本输入框(<input type=text />
)只允许数字按键(包括 '.')?
您可以使用以下setInputFilter
函数过滤文本<input>
的输入值(支持复制+粘贴、拖放、键盘快捷方式、上下文菜单操作、不可输入键、插入符位置、不同键盘布局、有效性错误消息和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;
}
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 版本,可以参考 这个答案。
HTML5 有一个本地的解决方案,可以使用 <input type="number">
(请参阅规范和文档)。文档中还有此输入类型的工作演示。
value
属性,应该读取输入的 valueAsNumber
属性,以获取输入的值作为数字而不是字符串。<form>
中使用,因为这样可以更容易进行验证;例如,如果值无效,则按下 Enter 将自动显示错误消息。
checkValidity
方法或 requestSubmit
方法来明确检查有效性。required
属性来禁止空输入。checkValidity
方法或 validity
属性来明确检查有效性。reportValidity
显示错误消息,并使用 setCustomValidity
设置自己的消息。此方法基本上具有不同的用户体验:您允许输入无效字符,验证是分开执行的。 这样做的好处是撤消堆栈(CtrlZ)不会被打破。 请注意,无论选择哪种方法,都必须执行服务器端验证。
但请注意,浏览器支持各不相同:
step
、min
和 max
属性。e
和 E
。请参阅 Q&A:为什么 HTML 的 type="number"
输入框允许输入字母 e
?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>
input
事件是不够的? - Alex78191使用这个DOM
<input type='text' onkeypress='validate(event)' />
并且这个脚本
function validate(evt) {
var theEvent = evt || window.event;
// Handle paste
if (theEvent.type === 'paste') {
key = event.clipboardData.getData('text/plain');
} else {
// Handle key press
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode(key);
}
var regex = /[0-9]|\./;
if( !regex.test(key) ) {
theEvent.returnValue = false;
if(theEvent.preventDefault) theEvent.preventDefault();
}
}
这是一个简单的解决方案,允许输入一个小数,但只限一个。输入事件使用正则表达式根据以下两个模式实时替换文本:
<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1');" />
正如下面的评论所述,上面的解决方案不能处理前导零。如果您的特定用例要求不允许这样做,您可以像以下那样添加模式:
<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/^0[^.]/, '0');" />
这将允许0.123
或.123
,但不允许0123
或00.123
。
我为此进行了长时间的搜索,但我们迫切需要<input type="number"
,但除此之外,这是我能想到的最简洁的两种方法:
<input type="text"
onkeyup="this.value=this.value.replace(/[^\d]/,'')">
如果您不喜欢在被删除之前短暂地显示非接受字符,则下面的方法是我的解决方案。请注意许多其他条件,这是为了避免禁用各种导航和快捷键。如果有人知道如何压缩此内容,请告诉我们!<input type="text"
onkeydown="return ( event.ctrlKey || event.altKey
|| (47<event.keyCode && event.keyCode<58 && event.shiftKey==false)
|| (95<event.keyCode && event.keyCode<106)
|| (event.keyCode==8) || (event.keyCode==9)
|| (event.keyCode>34 && event.keyCode<40)
|| (event.keyCode==46) )">
/[^\d+]/
,就可以在按住键时使用。 - boecko/[^\d]+/
。虽然很好的解决方案。还有@user235859。 - Mosselman.
。你应该将它实际写成 /[^0-9.]/g
。 - Qsario大多数回答都有一个缺点,那就是使用键盘事件。
许多答案会限制您使用键盘宏、复制+粘贴等操作,产生不必要的行为。另外一些答案似乎依赖于特定的jQuery插件,这就像用重型武器打蚊子。
以下简单的解决方案对我来说跨平台效果最佳,无论输入方式(按键、复制+粘贴、右键复制+粘贴、语音转文字等),所有文本选择键盘宏仍然可以正常使用,并且甚至可以限制通过脚本设置非数字值的能力。
function forceNumeric(){
var $input = $(this);
$input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);
replace(/[^\d]+/g,'')
用空字符串替换所有非数字字符。不需要使用“i”(大小写不敏感)修饰符。 - Memochipan/[^\d,.]+/
。 - EJTHinput[type="number"]
永远无法找到 input[type="text"]
元素。这就是问题所在。请问自己:如果您将 input[type="number"]
替换为 input[type="text"]
,这个 polyfill 是否仍然有效(并且不会干扰可能存在的其他文本输入)? - JPAHTML5 支持正则表达式,因此您可以使用以下内容:
<input id="numbersOnly" pattern="[0-9.]+" type="text">
警告:部分浏览器目前还不支持此功能。
<input type=number>
。 - Mathias Bynens+
代表什么意思? - Sanjay GoswamiHTML5引入了<input type=number>
,这对你来说听起来很合适。目前只有Opera原生支持它,但是有一个项目提供了JavaScript实现。
type=number
的唯一问题是它不被 IE9 支持。 - J Rodtype=number
允许输入 e
字符,因为它将 e+10
视为数字。第二个问题是无法限制输入中的最大字符数。 - Hakan Fıstık还有一个例子,对我来说非常有效:
function validateNumber(event) {
var key = window.event ? event.keyCode : event.which;
if (event.keyCode === 8 || event.keyCode === 46) {
return true;
} else if ( key < 48 || key > 57 ) {
return false;
} else {
return true;
}
};
同时绑定到键盘按下事件
$(document).ready(function(){
$('[id^=edit]').keypress(validateNumber);
});
还有HTML:
<input type="input" id="edit1" value="0" size="5" maxlength="5" />
<input type="number" />
function isNumberKey(evt){
var charCode = (evt.which) ? evt.which : evt.keyCode
return !(charCode > 31 && (charCode < 48 || charCode > 57));
}
<input type="text" onkeypress="return isNumberKey(event);">
return !(charCode > 31 && (charCode < 48 || charCode > 57));
- schadeckJavaScript
function validateNumber(evt) {
var e = evt || window.event;
var key = e.keyCode || e.which;
if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
// numbers
key >= 48 && key <= 57 ||
// Numeric keypad
key >= 96 && key <= 105 ||
// Backspace and Tab and Enter
key == 8 || key == 9 || key == 13 ||
// Home and End
key == 35 || key == 36 ||
// left and right arrows
key == 37 || key == 39 ||
// Del and Ins
key == 46 || key == 45) {
// input is VALID
}
else {
// input is INVALID
e.returnValue = false;
if (e.preventDefault) e.preventDefault();
}
}
另外,您可以添加逗号、句号和破折号(,.-)。
// comma, period and minus, . on keypad
key == 190 || key == 188 || key == 109 || key == 110 ||
HTML
<input type="text" onkeydown="validateNumber(event);"/ >
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
- yurisich