【发布时间】:2012-01-11 09:39:40
【问题描述】:
对于<input type="number"> 元素,maxlength 不起作用。如何限制该数字元素的 maxlength?
【问题讨论】:
-
max 属性在 Android 平板电脑的 chrome 浏览器中不起作用。
对于<input type="number"> 元素,maxlength 不起作用。如何限制该数字元素的 maxlength?
【问题讨论】:
您可以指定min 和max 属性,这将只允许在特定范围内输入。
<!-- equivalent to maxlength=4 -->
<input type="number" min="-9999" max="9999">
不过,这只适用于微调器控制按钮。尽管用户可能能够键入大于允许的max 的数字,但表单不会提交。
从 Chrome 15 截取的屏幕截图
您可以在 JavaScript 中使用 HTML5 oninput 事件来限制字符数:
myInput.oninput = function () {
if (this.value.length > 4) {
this.value = this.value.slice(0,4);
}
}
【讨论】:
maxlength......
要使用的更多相关属性是min 和max。
【讨论】:
与type="number" 一样,您指定max 而不是maxlength 属性,这是可能的最大数量。所以 4 位数字,max 应该是 9999,5 位数字 99999 等等。
另外,如果你想确保它是一个正数,你可以设置min="0",确保为正数。
【讨论】:
【讨论】:
min="-999" max="999" 来伪造maxlength="3"。
您可以像这样组合所有这些:
<input name="myinput_drs"
oninput="maxLengthCheck(this)"
type = "number"
maxlength = "3"
min = "1"
max = "999" />
<script>
// This is an old version, for a more recent version look at
// https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/
function maxLengthCheck(object)
{
if (object.value.length > object.maxLength)
object.value = object.value.slice(0, object.maxLength)
}
</script>
更新:
您可能还希望阻止输入任何非数字字符,因为object.length 将是数字输入的空字符串,因此其长度将为0。因此maxLengthCheck 函数将不起作用。
Demo - 在此处查看完整版代码:
http://jsfiddle.net/DRSDavidSoft/zb4ft1qq/1/
更新 2: 这是更新代码: https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/
更新 3: 请注意,允许输入多个小数点可能会导致数值混乱。
【讨论】:
如果您正在寻找一种移动网络解决方案,希望您的用户在其中看到数字键盘而不是全文键盘。使用类型=“电话”。它将与 maxlength 一起使用,从而使您免于创建额外的 javascript。
Max 和 Min 仍然允许用户输入超过 max 和 min 的数字,这不是最优的。
【讨论】:
<input type="number" inputMode="numeric" pattern="[0-9]*" min="1" max="2112"> 然后如果需要,可以使用一些 JavaScript 来增强它?
很简单,用一些javascript就可以模拟出maxlength,看看吧:
//maxlength="2"
<input type="number" onKeyDown="if(this.value.length==2) return false;" />
【讨论】:
keydown 的问题是您不能在最大字符处使用退格。 keypress 的问题是您可以复制+粘贴超过最大字符数。
Maycow Moura 的回答是一个好的开始。 但是,他的解决方案意味着当您输入第二个数字时,该字段的所有编辑都会停止。所以你不能改变值或删除任何字符。
以下代码在 2 处停止,但允许继续编辑;
//MaxLength 2
onKeyDown="if(this.value.length==2) this.value = this.value.slice(0, - 1);"
【讨论】:
或者,如果您的最大值为 99 且最小值为 0,您可以将其添加到输入元素(您的值将被您的最大值等重写)
<input type="number" min="0" max="99"
onKeyUp="if(this.value>99){this.value='99';}else if(this.value<0){this.value='0';}"
id="yourid">
然后(如果你愿意的话),你可以检查是否输入了真正的数字
【讨论】:
onKeyUp="if(this.value>this.max)this.value=this.max;if(this.value<this.min)this.value=this.min;"
你也可以试试这个有长度限制的数字输入
<input type="tel" maxlength="3" />
【讨论】:
我之前遇到过这个问题,我用html5数字类型和jQuery的组合解决了。
<input maxlength="2" min="0" max="59" name="minutes" value="0" type="number"/>
脚本:
$("input[name='minutes']").on('keyup keypress blur change', function(e) {
//return false if not 0-9
if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
return false;
}else{
//limit length but allow backspace so that you can still delete the numbers.
if( $(this).val().length >= parseInt($(this).attr('maxlength')) && (e.which != 8 && e.which != 0)){
return false;
}
}
});
我不知道这些事件是否有点矫枉过正,但它解决了我的问题。 JSfiddle
【讨论】:
正如其他人所说,min/max 与 maxlength 不同,因为人们仍然可以输入一个大于您预期的最大字符串长度的浮点数。要真正模拟 maxlength 属性,您可以在紧要关头做这样的事情(这相当于 maxlength="16"):
<input type="number" oninput="if(value.length>16)value=value.slice(0,16)">
【讨论】:
maxlength 不受数字输入的支持。在我的示例中,value.slice(0,16) 不会启动,除非输入值超过 16 个字符。
type="number" 负责处理:)。
我知道已经有了答案,但如果您希望输入的行为与 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();
【讨论】:
您可以将其指定为文本,但添加仅匹配数字的 pettern:
<input type="text" pattern="\d*" maxlength="2">
它完美运行,并且在移动设备上(在 iOS 8 和 Android 上测试)弹出数字键盘。
【讨论】:
pattern 只会导致验证突出显示。
最大长度不适用于<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"
/>
【讨论】:
//For Angular I have attached following snippet.
<div ng-app="">
<form>
Enter number: <input type="number" ng-model="number" onKeyPress="if(this.value.length==7) return false;" min="0">
</form>
<h1>You entered: {{number}}</h1>
</div>
如果您使用“onkeypress”事件,那么在开发时您将不会受到任何用户限制(对其进行单元测试)。如果您有要求不允许用户在特定限制后进入,请查看此代码并尝试一次。
【讨论】:
我发现您不能使用任何onkeydown、onkeypress 或onkeyup 事件来获得包括移动浏览器在内的完整解决方案。顺便说一句,onkeypress 已被弃用,并且不再出现在 chrome/opera for android 中(请参阅:UI Events
W3C Working Draft, 04 August 2016)。
我想出了一个仅使用oninput 事件的解决方案。
您可能需要根据需要进行额外的数字检查,例如负/正号或小数和千位分隔符等,但首先以下内容就足够了:
function checkMaxLength(event) {
// Prepare to restore the previous value.
if (this.oldValue === undefined) {
this.oldValue = this.defaultValue;
}
if (this.value.length > this.maxLength) {
// Set back to the previous value.
this.value = oldVal;
}
else {
// Store the previous value.
this.oldValue = this.value;
// Make additional checks for +/- or ./, etc.
// Also consider to combine 'maxlength'
// with 'min' and 'max' to prevent wrong submits.
}
}
我还建议将maxlength 与min 和max 结合使用,以防止多次错误提交。
【讨论】:
另一种选择是只为具有 maxlength 属性的任何内容添加一个侦听器,并将切片值添加到其中。假设用户不想在与输入相关的每个事件中使用函数。这是一个代码sn-p。忽略 CSS 和 HTML 代码,JavaScript 才是最重要的。
// Reusable Function to Enforce MaxLength
function enforce_maxlength(event) {
var t = event.target;
if (t.hasAttribute('maxlength')) {
t.value = t.value.slice(0, t.getAttribute('maxlength'));
}
}
// Global Listener for anything with an maxlength attribute.
// I put the listener on the body, put it on whatever.
document.body.addEventListener('input', enforce_maxlength);
label { margin: 10px; font-size: 16px; display: block }
input { margin: 0 10px 10px; padding: 5px; font-size: 24px; width: 100px }
span { margin: 0 10px 10px; display: block; font-size: 12px; color: #666 }
<label for="test_input">Text Input</label>
<input id="test_input" type="text" maxlength="5"/>
<span>set to 5 maxlength</span>
<br>
<label for="test_input">Number Input</label>
<input id="test_input" type="number" min="0" max="99" maxlength="2"/>
<span>set to 2 maxlength, min 0 and max 99</span>
【讨论】:
HTML 输入
<input class="minutesInput" type="number" min="10" max="120" value="" />
jQuery
$(".minutesInput").on('keyup keypress blur change', function(e) {
if($(this).val() > 120){
$(this).val('120');
return false;
}
});
【讨论】:
为数字输入设置最大长度的一种简单方法是:
<input type="number" onkeypress="return this.value.length < 4;" oninput="if(this.value.length>=4) { this.value = this.value.slice(0,4); }" />
【讨论】:
呃。就像有人在实现它的过程中放弃了,并认为没有人会注意到。
无论出于何种原因,上面的答案都没有使用min 和max 属性。这个 jQuery 完成了它:
$('input[type="number"]').on('input change keyup paste', function () {
if (this.min) this.value = Math.max(parseInt(this.min), parseInt(this.value) || 0);
if (this.max) this.value = Math.min(parseInt(this.max), parseInt(this.value) || 0);
});
如果你是那些“jQuery-is-the-devil”类型中的一种,它可能也可以作为一个命名函数“oninput”w/o jQuery。
【讨论】:
<input type="number" onchange="this.value=Math.max(Math.min(this.value, 100), -100);" />
或者如果您不想输入任何内容
<input type="number" onchange="this.value=this.value ? Math.max(Math.min(this.value,100),-100) : null" />
【讨论】:
假设您希望最大允许值为 1000 - 输入或使用微调器。
您可以使用以下方法限制微调器值:
type="number" min="0" max="1000"
并使用 javascript 限制键盘输入的内容:
onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }"
<input type="number" min="0" max="1000" onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }">
【讨论】:
这可能对某人有所帮助。
使用一点 javascript,您可以搜索所有本地日期时间输入,搜索用户尝试输入的年份,超过未来 100 年:
$('input[type=datetime-local]').each(function( index ) {
$(this).change(function() {
var today = new Date();
var date = new Date(this.value);
var yearFuture = new Date();
yearFuture.setFullYear(yearFuture.getFullYear()+100);
if(date.getFullYear() > yearFuture.getFullYear()) {
this.value = today.getFullYear() + this.value.slice(4);
}
})
});
【讨论】:
我对所有输入使用一个简单的解决方案(使用 jQuery):
$(document).on('input', ':input[type="number"][maxlength]', function () {
if (this.value.length > this.maxLength) {
this.value = this.value.slice(0, this.maxLength);
}
});
代码选择所有定义了 maxlength 的 input type="number" 元素。
【讨论】:
可行的简单解决方案,
输入滚动事件
通过键盘复制粘贴
鼠标复制粘贴
输入类型等案例
<input id="maxLengthCheck"
name="maxLengthCheck"
type="number"
step="1"
min="0"
oninput="this.value = this.value > 5 ? 5 : Math.abs(this.value)" />
查看 this.value > 5 的条件,只需将 5 更新为您的最大限制。
解释:
如果我们的输入数字大于我们的限制更新输入值 this.value 与适当的数字 Math.abs(this.value)
否则,只需达到您的最大限制,即 5。
【讨论】:
由于我希望验证并且只允许整数,因此我采用了现有答案之一并对其进行了改进
这个想法是从 1 到 12 进行验证,如果输入低于 1,则将其设置为 1,如果输入高于 12,则将其设置为 12。不允许使用十进制符号。
<input id="horaReserva" type="number" min="1" max="12" onkeypress="return isIntegerInput(event)" oninput="maxLengthCheck(this)">
function maxLengthCheck(object) {
if (object.value.trim() == "") {
}
else if (parseInt(object.value) > parseInt(object.max)) {
object.value = object.max ;
}
else if (parseInt(object.value) < parseInt(object.min)) {
object.value = object.min ;
}
}
function isIntegerInput (evt) {
var theEvent = evt || window.event;
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();
}
}
}
【讨论】:
如果有人在 React 中遇到这个问题,我发现的最简单的解决方案是使用 onChange 函数,如下所示:
const [amount, setAmount] = useState("");
return(
<input onChange={(e) => {
setAmount(e.target.value);
if (e.target.value.length > 4) {
setAmount(e.target.value.slice(0, 4));
}
}} value={amount}/>)
所以这基本上做的是它获取输入的值,如果输入值长度大于 4,它会切掉它后面的所有数字,所以你只能得到前 4 个数字(当然你可以改变您可以通过更改代码中的所有 4 来键入数字)。我希望这对任何在这个问题上苦苦挣扎的人有所帮助。另外,如果您想了解 slice 方法 的作用,可以查看out here
【讨论】:
这是使用maxlength 的最简单解决方案:
<form>
<input class="form-control" id="code_pin" oninput="if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);" type="number" maxlength="4">
</form>
【讨论】: