Javascript tip calc方程在第一个输出上工作,但在第二个输出上返回NaN,编号为()
请看这里的代码笔Javascript tip calc方程在第一个输出上工作,但在第二个输出上返回NaN,编号为(),javascript,Javascript,请看这里的代码笔 最后的输出应计算账单+小费除以支付人数。第一个输出没有中断,所以我不知道为什么第二个输出会中断。起初,我想使用parseInt()而不是Number()将字符串转换为数字,但这也使得第一个输出为NaN。您有document.getElementsByName而不是document.getElementById,这就是拆分值为NaN的原因。我已将更正后的代码放在下面。在上面提供的链接上测试代码 document.getElementById('container').oncha
最后的输出应计算账单+小费除以支付人数。第一个输出没有中断,所以我不知道为什么第二个输出会中断。起初,我想使用parseInt()而不是Number()将字符串转换为数字,但这也使得第一个输出为NaN。您有
document.getElementsByName
而不是document.getElementById
,这就是拆分值为NaN的原因。我已将更正后的代码放在下面。在上面提供的链接上测试代码
document.getElementById('container').onchange = function() {
var bill = Number(document.getElementById('billTotal').value);
var tipPercent = Number(document.querySelector('input[name = "tip"]:checked').value);
var split = Number(document.getElementById('number-of-people').value);
var tipTotal = bill * tipPercent;
var finalTotal = (bill + tipTotal) / split;
document.getElementById('newTipTotal').innerHTML = tipTotal;
document.getElementById('newTotalWithTip').innerHTML = finalTotal;
}
您尚未在输入元素中为人数添加属性“name” 您可以使用:
var split = Number(document.getElementById('number-of-people').value);
欢迎来到SO Jim
虽然前面的回答是正确的,但如果使用container onchange
函数计算所有内容,则当某些数据丢失时,将导致错误。例如,当您第一次更改billTotal
(并且还没有更改任何其他内容)时,您将得到一个未捕获的类型错误(TypeError:无法在htmlVelment.document.getElementById.onchange处读取null属性“value”)页面在哪里查找不存在的小费百分比值和人数
在不更改html的情况下,这里有一个替代解决方案。这为每个数据输入提供了onchange
侦听器,在收集值时更新并保存这些值。一旦所有数据都存在,它就会计算总数
我在这里介绍了一些新东西,这些方法非常适合将数字字符串“1”
转换为实际数字1
let billInput = document.getElementById('billTotal');
let tipPercentInput = document.getElementById('tipPercent');
let splitInput = document.getElementById('number-of-people');
let billValue = false;
let tipPercentValue = false;
let splitValue = false;
billInput.onchange = function() {
billValue = parseInt(billInput.value);
calculateTip();
}
tipPercentInput.onchange = function() {
tipPercentValue = parseFloat(document.querySelector('input[name = "tip"]:checked').value);
calculateTip();
}
splitInput.onchange = function() {
splitValue = parseInt(splitInput.value);
calculateTip();
}
function calculateTip() {
if (billValue && tipPercentValue && splitValue) {
let tipTotal = billValue * tipPercentValue;
let finalTotal = (billValue + tipTotal) / splitValue;
document.getElementById('newTipTotal').innerHTML = tipTotal;
document.getElementById('newTotalWithTip').innerHTML = finalTotal;
}
}
如果您正在查看表单中的代码,则可以进一步了解代码
希望这对您有所帮助:)在进行数学运算之前,记录所有值。我敢打赌,它们并不都是数字。由于最终的输出是使用split
——我的钱花在split
上,因为它是一个空字符串或null文档。getElementsByName
->文档。getElementById
我同意@tymeJV,一个很好的做法是慢慢添加内容并在运行时记录。确保使用数字的一个技巧是使用console.log(typeof变量)代码>。这将记录您正在处理的数据类型<代码>控制台.log(类型为“1”);//日志字符串
,而console.log(typeof 1);//日志编号
谢谢。所以我想澄清一下。。。将所有三个初始变量设置为false,然后在每次输入更改后添加calculateIP()函数,以在触发之前立即检查所有三个初始变量是否为true?所以,如果输入了部分数据,它不会很快触发?只有在所有三个变量都被用户输入改变后,正确吗?这是正确的。每次触发onchage
方法时,它都会将相应的值分配给它的变量,然后它会检查calculate
tip函数,如果所有变量的值都不是false
,它会计算tip。在这种情况下,写入if(billValue){}
与if(billValue!==false){}
相同。这是有意义的,因为有人可以以不同的顺序输入数据。谢谢
let billInput = document.getElementById('billTotal');
let tipPercentInput = document.getElementById('tipPercent');
let splitInput = document.getElementById('number-of-people');
let billValue = false;
let tipPercentValue = false;
let splitValue = false;
billInput.onchange = function() {
billValue = parseInt(billInput.value);
calculateTip();
}
tipPercentInput.onchange = function() {
tipPercentValue = parseFloat(document.querySelector('input[name = "tip"]:checked').value);
calculateTip();
}
splitInput.onchange = function() {
splitValue = parseInt(splitInput.value);
calculateTip();
}
function calculateTip() {
if (billValue && tipPercentValue && splitValue) {
let tipTotal = billValue * tipPercentValue;
let finalTotal = (billValue + tipTotal) / splitValue;
document.getElementById('newTipTotal').innerHTML = tipTotal;
document.getElementById('newTotalWithTip').innerHTML = finalTotal;
}
}