保持jQuery函数动作的计数

时间:2019-01-03 01:45:53

标签: javascript jquery html

我有以下jquery函数

function checkIfAnyExist() { //new input
    var number = 0;
    if ($(this).length) {
      var number = number + 1;
    }
    console.log(number);
}

我使用以下方式致电

$("#myTable tr:not(.discarded,.old) td:nth-child(1)").each(checkIfAnyExist);

但是,由于重置了每个行号,此代码无法正常工作。我尝试取出var number = 0并将其放在调用函数上方,但这也不起作用。

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

您要声明两次变量:一次在函数中,一次在if条件内。这两个定义都会在每次函数迭代时将变量重置为零。

考虑在函数范围之外声明一次number。这样,可以在每次调用该函数时将其递增。

function checkIfAnyExist() {
  if ($(this).length) {
    number++;
  }
  console.log(number);
}

var number = 0;

$("#myTable tr:not(.discarded,.old) td:nth-child(1)").each(checkIfAnyExist);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<table id="myTable">
  <tr><td></td></tr>
  <tr><td></td></tr>
  <tr><td></td></tr>
  <tr><td></td></tr>
  <tr class="discarded"><td></td></tr>
  <tr class="old"><td></td></tr>
</table>

然后,您要计算不是.discarded.old的行中“第一个单元格”的数量。

正如@TylerRoper明智地解释的那样,$(this).length在这种情况下永远不会为假;传递给函数的每一行都有一个长度。因此,该功能似乎没有用。

jQuery的.length本身是一种更有效的计算适当行的方法:

var rowCount = $("#myTable tr:not(.discarded,.old)").length;
console.log(rowCount ? rowCount + ' rows found.' : 'There are no rows.');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<table id="myTable">
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr></tr>
  <tr class="discarded"></tr>
  <tr class="old"></tr>
</table>

注意:如果您要确定有多少行不为空,或者包含多个单元格,或者至少包含一个包含内容的单元格,或者其他更复杂的选择,则情况可能会不同。

>