目前我有以下代码
<input type="number" />
出来像这样
右边的小选择器项使数字变为负数。我该如何预防?
我对使用有疑问type="number"
,它引起的问题多于解决的问题,无论如何我都要进行理智检查,所以我应该回到使用状态type="text"
吗?
目前我有以下代码
<input type="number" />
出来像这样
右边的小选择器项使数字变为负数。我该如何预防?
我对使用有疑问type="number"
,它引起的问题多于解决的问题,无论如何我都要进行理智检查,所以我应该回到使用状态type="text"
吗?
Answers:
min="0.000001"
在大多数情况下,将属性更改为会有所帮助。小数点后6位以上,JavaScript会将其转换为指数格式。
这取决于您要达到的精度。您只想接受整数,而不是:
<input type="number" min="1" step="1">
例如,如果要使用小数点后两位数字进行浮点运算:
<input type="number" min="0.01" step="0.01">
max
值,就可以忽略它。
您可以通过以下方式防止数字输入形式的负输入:
<input type="number" onkeyup="if(this.value<0){this.value= this.value * -1}">
尝试
<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">
我找不到理想的解决方案,因为有些输入工作而不是复制粘贴,有些则相反。这个解决方案对我有用。它可以防止输入负数,键入“ e”,复制并粘贴“ e”文本。
创建一个功能。
<script language="JavaScript">
// this prevents from typing non-number text, including "e".
function isNumber(evt) {
evt = (evt) ? evt : window.event;
let charCode = (evt.which) ? evt.which : evt.keyCode;
if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
evt.preventDefault();
} else {
return true;
}
}
</script>
将这些属性添加到输入中。这两个防止复制和粘贴非数字文本,包括“ e”。您需要同时使它们同时生效。
<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />
如果您使用的是Vue ,则可以在此处参考此答案。我已经将其提取到可以重复使用的mixin中。
在您的输入类型中添加此代码;
onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"
例如:
<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />
其他解决方案是使用Js使其为正(当用户键入smth时,可以禁用min选项,并且该选项无效)。也可以使用负(如果不需要)和on('keydown')事件!
let $numberInput = $('#whatEverId');
$numberInput.on('change', function(){
let numberInputText = $numberInput.val();
if(numberInputText.includes('-')){
$numberInput.val(Math.abs($numberInput.val()));
}
});
这取决于您要的是int还是float字段。这是两者的外观:
<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">
因为int字段的最小值为1,所以它附加有正确的验证。但是float字段接受0;但是,float字段接受0。为了解决这个问题,您可以再添加一个约束验证器:
function checkIsPositive(e) {
const value = parseFloat(e.target.value);
if (e.target.value === "" || value > 0) {
e.target.setCustomValidity("");
} else {
e.target.setCustomValidity("Please select a value that is greater than 0.");
}
}
document.getElementById("float-field").addEventListener("input", checkIsPositive, false);
请注意,这些解决方案都不能完全阻止用户尝试输入无效的输入,但是您可以呼叫checkValidity
或reportValidity
弄清楚用户是否输入了有效的输入。
当然,您仍应具有服务器端验证,因为用户始终可以忽略客户端验证。