纯JavaScript解号输入会显示2位小数
Pure JavaScript solution number input will display 2 decimal places
我正在尝试使用以下代码(在此处找到:Make an html number input always display 2 decimal places)强制数字输入在输入丢失时显示两位小数 focus/onchange:
function setDecimal(event) {
this.value = parseFloat(this.value).toFixed(2);
}
<input placeholder="[=11=].00" type="number" onchange="setDecimal" name="amount_20_20_amt" id="amount_20_20_amt" value="" autocomplete="off" min="0" max="50000000" step="0.01">
由于某些原因这不起作用,尽管我能够使用以下内联解决方案并且它完美地工作:
onchange="(function(el){el.value=parseFloat(el.value).toFixed(2);})(this)"
我不能使用 jQuery 或任何其他库(业务规则),我需要它在输入失去焦点时显示。将步骤调整为“.01”或 "any" 无法实现此目的。
JS 存储在加载正常的 .js 文件中,.js 文件中的其他所有内容都工作正常,所以我认为它一定是代码段中的错误,尽管我无法弄清楚什么。
我哪里错了?
您需要调用onchange
中的函数。目前,您只是在引用它。
改变这个:
onchange="setDecimal"
… 对此:
onchange="setDecimal(this)"
this
将输入传递给函数。
然后将您的函数更改为:
function setDecimal(input) {
input.value = parseFloat(input.value).toFixed(2);
}
function setDecimal(input) {
input.value = parseFloat(input.value).toFixed(2);
}
<input placeholder="[=14=].00" type="number" onchange="setDecimal(this)" name="amount_20_20_amt" id="amount_20_20_amt" value="" autocomplete="off" min="0" max="50000000" step="0.01">
无论何时调用函数,this
都会根据调用函数的方式进行设置。如果您在对象上调用函数(例如 myObject.doTheThing()
),那么当您处于该函数的范围内时,this
将是该对象。如果在没有对象的情况下调用 this
,则 this
成为全局对象 (window
)。
您的第二个示例有效,因为您传递了 this
,因此它可以被引用为 el
。你可以通过这样做达到同样的效果:
function setDecimal(input) {
input.value = parseFloat(input.value).toFixed(2);
}
<input placeholder="[=10=].00" type="number"
onchange="setDecimal(this)" name="amount_20_20_amt" id="amount_20_20_amt"
value="" autocomplete="off" min="0" max="50000000" step="0.01">
您也可以考虑使用 addEventListener 来绑定事件。
document.querySelector('input').addEventListener('blur', function() {
this.value = parseFloat(this.value).toFixed(2);
});
<input>
编辑:@RickHitchcock 也是正确的。我在没有注意到的情况下修复了函数括号问题。您将需要确保您有括号 和 确保可以在函数范围内引用该元素。
我正在尝试使用以下代码(在此处找到:Make an html number input always display 2 decimal places)强制数字输入在输入丢失时显示两位小数 focus/onchange:
function setDecimal(event) {
this.value = parseFloat(this.value).toFixed(2);
}
<input placeholder="[=11=].00" type="number" onchange="setDecimal" name="amount_20_20_amt" id="amount_20_20_amt" value="" autocomplete="off" min="0" max="50000000" step="0.01">
由于某些原因这不起作用,尽管我能够使用以下内联解决方案并且它完美地工作:
onchange="(function(el){el.value=parseFloat(el.value).toFixed(2);})(this)"
我不能使用 jQuery 或任何其他库(业务规则),我需要它在输入失去焦点时显示。将步骤调整为“.01”或 "any" 无法实现此目的。
JS 存储在加载正常的 .js 文件中,.js 文件中的其他所有内容都工作正常,所以我认为它一定是代码段中的错误,尽管我无法弄清楚什么。
我哪里错了?
您需要调用onchange
中的函数。目前,您只是在引用它。
改变这个:
onchange="setDecimal"
… 对此:
onchange="setDecimal(this)"
this
将输入传递给函数。
然后将您的函数更改为:
function setDecimal(input) {
input.value = parseFloat(input.value).toFixed(2);
}
function setDecimal(input) {
input.value = parseFloat(input.value).toFixed(2);
}
<input placeholder="[=14=].00" type="number" onchange="setDecimal(this)" name="amount_20_20_amt" id="amount_20_20_amt" value="" autocomplete="off" min="0" max="50000000" step="0.01">
无论何时调用函数,this
都会根据调用函数的方式进行设置。如果您在对象上调用函数(例如 myObject.doTheThing()
),那么当您处于该函数的范围内时,this
将是该对象。如果在没有对象的情况下调用 this
,则 this
成为全局对象 (window
)。
您的第二个示例有效,因为您传递了 this
,因此它可以被引用为 el
。你可以通过这样做达到同样的效果:
function setDecimal(input) {
input.value = parseFloat(input.value).toFixed(2);
}
<input placeholder="[=10=].00" type="number"
onchange="setDecimal(this)" name="amount_20_20_amt" id="amount_20_20_amt"
value="" autocomplete="off" min="0" max="50000000" step="0.01">
您也可以考虑使用 addEventListener 来绑定事件。
document.querySelector('input').addEventListener('blur', function() {
this.value = parseFloat(this.value).toFixed(2);
});
<input>
编辑:@RickHitchcock 也是正确的。我在没有注意到的情况下修复了函数括号问题。您将需要确保您有括号 和 确保可以在函数范围内引用该元素。