0

我这里有一些代码可以验证来自文本框的输入是否不是空字符串和 isNaN。当我对输入的金额进行这些验证时,我希望它把它们加起来。但是当用户没有在一个或多个金额字段中输入任何内容时,程序应该只添加输入的字段。但是相反,我在总字段中显示了 NaN。

完整代码链接:http: //jsfiddle.net/KxNqQ/

var $ = function (id) {
return document.getElementById(id);
}

var calculateBills = function () {

var myErrorFlag = "N";

for (i = 1; i <= 4; i++) {
    AmountNumber = 'amount' + i;
    AmountValue = $(AmountNumber).value;

    if (AmountValue != "" && isNaN(AmountValue)) {
        $(AmountNumber).style.color = "red";
        myErrorFlag = "Y";
    } else {
        $(AmountNumber).style.color = "black";
        myErrorFlag = "N";
    }


}

if (myErrorFlag != "Y") {
    var Amount = 0;
    for (i = 1; i <= 4; i++) {
        Amount += parseInt($('amount' + i).value,10);
    }
    $('total').value = Amount;
    }

   }
var clearFields = function () {

for (i = 1; i <= 4; i++) {
    itemName = 'item' + i;
    $(itemName).value = "";
}
for (i = 1; i <= 4; i++) {
    amountName = 'amount' + i;
    $(amountName).value = "";
}
$('total').value = "";


}
window.onload = function () {
$("clearfields").onclick = clearFields;
$("addbills").onclick = calculateBills;
}
4

2 回答 2

3

我认为您的要求有点混乱,或者至少我被它们弄糊涂了。因此,为了回答您的问题,我将重新表述这些要求,以便我更好地理解它们。这是一个有用的练习,当我不能 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

通过您的代码,我可以看到它存在许多问题。首先,我注意到AmountNumberAmountValue都是全局变量,因为它们没有用var 关键字声明为局部变量。所以在修复我们的代码之前,让我们改变它。让我们也将变量名称更改为更准确地描述它们的名称,希望使代码更易于理解:

var input = $('amount' + i);
var value = input.value;

现在,请注意我选择将元素存储在input变量中。这样我们就不必在循环中多次查找它。在 DOM 中查找内容可能会很昂贵,因此我们希望将其保持在最低限度。还有其他查找元素的方法,例如getElementsByClassNamequerySelectorquerySelectorAll;这些留作练习供读者研究和评估。

接下来,在循环的每次迭代中,检查它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 专门选择的,因此,如果它们发生更改,则此代码将不再起作用。

另一个潜在的问题是我们在遍历输入时设置了内联样式。这意味着为了使此代码与站点的样式保持同步,它必须进行更改。一般来说,像这样混合样式和功能不是一个好主意,应该避免。这样做的一种方法是改用类名,并打开和关闭它们。顺便说一句,这也可以帮助我前面提到的问题。

还有其他问题,但我们将把这些留到另一天。希望这可以帮助!

于 2013-10-20T02:32:50.180 回答
0

尝试这个

var calculateBills = function () {
    var Amount = 0;
    for (i = 1; i <= 4; i++) {
        var AmountElement = $('amount' + i),
            AmountValue = AmountElement.value;
        if (AmountValue != "" && !isNaN(AmountValue)) {
            AmountElement.style.color = "red";
            Amount += parseInt(AmountValue,10);
        } else {
            AmountElement.style.color = "";
        }
    }
    $('total').value = Amount;
};

演示

无论如何,您可以使用类(例如)而不是使用带有 id 的元素,例如id="amount1", id="amount2",等id="amount3"class="amount".getElementsByClassName

于 2013-10-20T00:46:14.867 回答