在我看来,数字的 HTML 表单元素设计得很糟糕。它只需要整数,所以如果你想要一个零开头或两个零(在 24 小时制的情况下),这是不可能的。其他缺点是在字段中输入时对输入没有限制,因此您可以添加字母、符号等或完全忽略任何 HTML 定义的数字范围,这几乎无法达到目的。
另一方面,文本的 HTML 表单元素允许我们限制字符数(最大长度),我在下面的示例中已经这样做了。
JS 首先将输入限制为仅数字,然后针对类名而不是所有输入元素,因此可以在需要的时间和地点指定范围。
如果输入超出指定范围,我没有设置一个数字,而是选择完全删除该字段,因为这对用户来说会更明显,他们犯了错误并且不那么令人生气,因为设置特定值不太可能等于他们心目中的价值。
与 jQuery 3.4.1 结合使用
JSFiddle 链接: https://jsfiddle.net/u2smwbgL/1/
HTML
<h1>Set Hours & Minutes</h1>
<div class='left'>
<label> Hours
<input type="text" class='hour' maxlength="2" />
</label>
</div>
<div class='break'></div>
<div class='left'>
<label> Minutes
<input type="text" class='minute' maxlength="2" />
</label>
</div>
Javascript
// Filter Inputs
(function($) {
$.fn.inputFilter = function(inputFilter) {
return this.on("input keydown keyup mousedown mouseup select contextmenu drop",function() {
if (inputFilter(this.value)) {
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
} else if (this.hasOwnProperty("oldValue")) {
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
} else {
this.value = "";
}
});
};
}(jQuery));
// Hours & Minutes - Only Numbers
$(".hour,.minute").inputFilter(function(value) {
return /^[0-9]*$/i.test(value);
});
// Hours
$('.hour').on('input', function () {
var value = this.value;
if (value !== '') {
value = parseFloat(value);
if (value > 23)
this.value = '';
}
});
// Minutes
$('.minute').on('input', function () {
var value = this.value;
if (value !== '') {
value = parseFloat(value);
if (value > 59)
this.value = '';
}
});
CSS
.left {position:relative; float:left; width:100%;}
.break {position:relative; float:left; width:100%; height:20px;}
.minute,.hour {position:relative; float:left; width:50px; margin-left:20px; text-align:center;}
$('.minute').on('input', function () {
var value = this.value;
if (value !== '') {
value = parseFloat(value);
if (value > 59)
this.value = '';
}
});