我认为您的要求有点混乱,或者至少我被它们弄糊涂了。因此,为了回答您的问题,我将重新表述这些要求,以便我更好地理解它们。这是一个有用的练习,当我不能 100% 确定要求时,我会尝试这样做;如果我不能得到正确的要求,那我还能得到正确的代码吗?
所以要求——据我所知——是:
Given each amount input
When the input has a value
And that value is a number
Then add the value to the total
And make the input color black
But if the input does not have a value
Or that value is not a number
Then make the input color red
通过您的代码,我可以看到它存在许多问题。首先,我注意到AmountNumber
和AmountValue
都是全局变量,因为它们没有用var 关键字声明为局部变量。所以在修复我们的代码之前,让我们改变它。让我们也将变量名称更改为更准确地描述它们的名称,希望使代码更易于理解:
var input = $('amount' + i);
var value = input.value;
现在,请注意我选择将元素存储在input
变量中。这样我们就不必在循环中多次查找它。在 DOM 中查找内容可能会很昂贵,因此我们希望将其保持在最低限度。还有其他查找元素的方法,例如getElementsByClassName、querySelector和querySelectorAll;这些留作练习供读者研究和评估。
接下来,在循环的每次迭代中,检查它AmountValue
不是字符串,同时也不是数字:
if (AmountValue != "" && isNaN(AmountValue)) {
只要它AmountValue
是真的(非空字符串就是这种情况)并且isNaN
认为它是一个数字(包含数字的字符串就是这种情况),这就是真的。这真的很令人困惑;如果我正确理解了您的代码,则此子句用于检查无效输入,如果为真,则应将输入字段标记为红色并设置一个标志。即这是上述要求中的but子句。
让我们将其重写为when子句,稍后我们会处理but。在我们这样做之前,让我们看一下myErrorFlag
. 它被用来——我认为——查看所有输入是否格式正确,在这种情况下,将它们全部加起来。好吧,验证和求和可以一举完成,所以让我们摆脱标志并在验证它们时对值求和。所以我们myErrorFlag
用一个total
变量替换:
var total = 0;
现在,让我们回到我们的条款。要求说:
When the input has a value
And that value is a number
Then add the value to the total
在代码中,应该是这样的:
if (value && !isNaN(value)) {
total += parseInt(value, 10);
input.style.color = 'black';
}
这里发生了几件事。一方面,if 语句与原来的情况有所不同。它首先检查它是否value
为真,然后它是一个数字。第二个检查可能有点难以阅读,因为它本质上是双重否定;在英语中它读作“不是不是数字”,即“是一个数字”。我将把它作为练习留给读者,以了解是否有更容易理解的方式来编写这张支票。
那么我们需求中的but子句呢?
But if the input does not have a value
Or that value is not a number
Then make the input color red
好吧,它本质上是我们之前的语句的逆,所以让我们简单地添加一个else
子句:
else {
input.style.color = 'red';
}
因为需求没有提到total
这个条款中的变量,所以它被简单地忽略并且不会出现在最终结果中。
全部加起来(没有双关语)代码——带有注释——看起来像这样:
var calculateBills = function () {
var total = 0;
for (i = 1; i <= 4; i++) {
// Given each amount input
var input = $('amount' + i);
var value = input.value;
if (value && !isNaN(value)) {
// When the input has a value
// And that value is a number
// Then add the value to the total
total += parseInt(value, 10);
// And make the input color black
input.style.color = 'black';
} else {
// But if the input does not have a value
// Or that value is not a number
// Then make the input color red
input.style.color = 'red';
}
}
$('total').value = total;
};
可以从中学到更多的东西来编写更好的代码。例如,如果输入的数量发生变化,或者它们的 id 名称发生变化,则此代码将中断。这是因为它们是由它们的 ID 专门选择的,因此,如果它们发生更改,则此代码将不再起作用。
另一个潜在的问题是我们在遍历输入时设置了内联样式。这意味着为了使此代码与站点的样式保持同步,它必须进行更改。一般来说,像这样混合样式和功能不是一个好主意,应该避免。这样做的一种方法是改用类名,并打开和关闭它们。顺便说一句,这也可以帮助我前面提到的问题。
还有其他问题,但我们将把这些留到另一天。希望这可以帮助!