首先,我不是专业人士。这是一个个人项目,如果我的术语或问题的观点有误,请道歉。我正在开发一种特殊的计算器,需要用户输入才能进行计算。该计算器由多个表格组成,但第一个表格是最重要的。它只需要用户将单个“单位”划分为将在计算器的其余部分中使用的比率。这些数字必须等于 100,否则其余输出将不正确。
我希望“TOTAL (%)”有一个函数来检查文本框中计算的数字是否等于 100。如果不等于 100,我希望该数字变成红色并带有警告。
我遇到的问题是该功能似乎不起作用。我的结论是,这可能是以下一个或多个原因:
这是我编写的代码:
function valTotal() {
var x = document.getElementById('t1total').value;
var y = 100;
if (x > y) {
alert("Warning! Your total is greater than 100%. Please adjust your ratios above so that the total equals 100% before continuing.");
x.style.color = "#cf0911";
return false;
}
}
function myFun0() {
let water = document.getElementById('t1water').value;
let ingr1 = document.getElementById('t1ingr1').value;
let ingr2 = document.getElementById('t1ingr2').value;
let ingr3 = document.getElementById('t1ingr3').value;
let ingr4 = document.getElementById('t1ingr4').value;
let ingr5 = document.getElementById('t1ingr5').value;
let ingr6 = document.getElementById('t1ingr6').value;
let total = Number(water) + Number(ingr1) + Number(ingr2) + Number(ingr3) + Number(ingr4) + Number(ingr5) + Number(ingr6);
document.getElementById("t1total").value = total;
}
body {
font-family: monospace;
}
table,
td {
border: 1px solid black;
border-collapse: collapse;
}
.invis {
border-style: hidden;
}
.txcenter {
text-align: center;
}
.txbox1 {
width: 50px;
}
<!DOCTYPE html>
<html>
<head>
</head>
<!--Calculator-->
<body>
<div>
<h2 id="calc">Substrate Calculator</h2>
<table class="invis">
<tr>
<td>
<!--Table 1: SUB RATIO-->
<table style="float: left">
<tr style="background-color:#751e0b">
<td colspan="2">
<div class="txcenter">
<b style="color:white">SUB RATIO</b>
</div>
</td>
</tr>
<!--Table 1: SUB RATIO > Water (%)-->
<tr>
<td>
<div>Water (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1water" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > Ingredient 1 (%)-->
<tr>
<td>
<div>Ingredient 1 (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1ingr1" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > Ingredient 2 (%)-->
<tr>
<td>
<div>Ingredient 2 (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1ingr2" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > Ingredient 3 (%)-->
<tr>
<td>
<div>Ingredient 3 (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1ingr3" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > Ingredient 4 (%)-->
<tr>
<td>
<div>Ingredient 4 (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1ingr4" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > Ingredient 5 (%)-->
<tr>
<td>
<div>Ingredient 5 (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1ingr5" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > Ingredient 6 (%)-->
<tr>
<td>
<div>Ingredient 6 (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1ingr6" onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()">
</td>
</tr>
<!--Table 1: SUB RATIO > TOTAL (%)-->
<tr>
<td>
<div>TOTAL (%)</div>
</td>
<td>
<input class="txbox1" type="textbox" id="t1total" onchange="valTotal()" readonly>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>
只是计算器的第一个表格。我遇到的问题是“TOTAL (%)”字段,这是唯一使用验证函数的地方。
非常感谢。
编辑:有问题的函数是 valTotal() 函数。
您的代码中有一些错误。
在函数 valTotal
var x = document.getElementById('t1total');
中,使用此行您将获取元素本身而不是其值。因此,要在最后遇到这种情况,您应该执行var x = document.getElementById('t1total').value;
,这就是验证无法正常工作的原因。将来请执行 console.log
检查您是否获得了您想要的值。
在 if 语句中,您也更改了 x 的颜色,因此也可以使用 else 语句将其恢复回来
if (x > y) { alert("Warning! Your total is greater than 100%. Please adjust your ratios above so that the total equals 100% before continuing."); x.style.color = "#cf0911"; return false;
}else { document.getElementById('t1total').style.color = ""; // Reset color if valid }
如果您之前设置了颜色(例如,红色表示错误状态),这会将其重置回默认值。
在函数 myFun0 中调用 valTotal 函数,因此在输入下一个成分之前,如果它超过 100%,您可以获得。
function myFun0(){
// rest of the code
valTotal()
}
现在在输入的html中
type = "textbox"
没有这样的东西使用type = "text"
或者代替使用number
并且在您调用的所有输入上onkeyup="myFun0();myFun1();myFun2()" onchange="myFun0();myFun1();myFun2()"
所以首先 onkeyup
和 onchange
都在做同样的事情,调用相同的函数,所以你可以只使用其中一个,你也可以通过这个链接 onkeyup onchnage 阅读它们。您正在调用的另一个函数甚至没有写在您的代码中。只需对所有输入执行 <input class="txbox1" type="text" id="t1water" onkeyup="myFun0()">
即可。
总计无需调用
onchange = "valTotal()"
,因为每次按键都会计算总计。
希望这对您有帮助。
function valTotal() {
var x = document.getElementById('t1total').value;
var y = 100;
// Convert the value to a number for comparison
if (Number(x) > y) {
alert("Warning! Your total is greater than 100%. Please adjust your ratios above so that the total equals 100% before continuing.");
document.getElementById('t1total').style.color = "#cf0911"; // Change color to red
return false;
} else {
document.getElementById('t1total').style.color = ""; // Reset color if valid
}
}
function myFun0() {
let water = document.getElementById('t1water').value;
let ingr1 = document.getElementById('t1ingr1').value;
let ingr2 = document.getElementById('t1ingr2').value;
let ingr3 = document.getElementById('t1ingr3').value;
let ingr4 = document.getElementById('t1ingr4').value;
let ingr5 = document.getElementById('t1ingr5').value;
let ingr6 = document.getElementById('t1ingr6').value;
// Calculate the total sum of all ingredient values
let total = Number(water) + Number(ingr1) + Number(ingr2) + Number(ingr3) + Number(ingr4) + Number(ingr5) + Number(ingr6);
// Display the result in t1total
document.getElementById("t1total").value = total;
// Call valTotal to check if the total exceeds 100%
valTotal();
}
<!DOCTYPE html>
<html>
<head>
<title>Substrate Calculator</title>
</head>
<body>
<div>
<h2 id="calc">Substrate Calculator</h2>
<table class="invis">
<tr>
<td>
<!-- Table 1: SUB RATIO -->
<table style="float: left;">
<tr style="background-color:#751e0b;">
<td colspan="2">
<div class="txcenter">
<b style="color:white;">SUB RATIO</b>
</div>
</td>
</tr>
<!-- Input rows -->
<tr>
<td>Water (%)</td>
<td><input class="txbox1" type="text" id="t1water" onkeyup="myFun0()"></td>
</tr>
<tr>
<td>Ingredient 1 (%)</td>
<td><input class="txbox1" type="text" id="t1ingr1" onkeyup="myFun0()"></td>
</tr>
<tr>
<td>Ingredient 2 (%)</td>
<td><input class="txbox1" type="text" id="t1ingr2" onkeyup="myFun0()"></td>
</tr>
<tr>
<td>Ingredient 3 (%)</td>
<td><input class="txbox1" type="text" id="t1ingr3" onkeyup="myFun0()"></td>
</tr>
<tr>
<td>Ingredient 4 (%)</td>
<td><input class="txbox1" type="text" id="t1ingr4" onkeyup="myFun0()"></td>
</tr>
<tr>
<td>Ingredient 5 (%)</td>
<td><input class="txbox1" type="text" id="t1ingr5" onkeyup="myFun0()"></td>
</tr>
<tr>
<td>Ingredient 6 (%)</td>
<td><input class="txbox1" type="text" id="t1ingr6" onkeyup="myFun0()"></td>
</tr>
<!-- Total row -->
<tr>
<td>TOTAL (%)</td>
<!-- because of okKeyup the total is calculating on everykeyup no need to call function here -->
<td><input class="txbox1" type="text" id="t1total" readonly></td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>