【问题标题】:Function in JavaScript doesn't work while the other function worksJavaScript 中的函数不起作用,而其他函数起作用
【发布时间】:2017-12-01 17:16:04
【问题描述】:

我有一个用 HTML 编写的表单。在这种形式中,有 2 个按钮和一个表格。表格中的每一行都包含一个复选框和 2 个文本字段。

按钮用于在表格中添加和删除行。删除按钮仅适用于选中其复选框的行。他们有一个onClick 方法,它指的是在下面的<script> 标记上用JavaScript 编写的2 个方法,addRow(tableID)deleteRow(tableID)

addRow(tableID) 在我单击它的按钮时起作用,但当我单击删除按钮时没有任何反应,它指的是deleteRow(tableID) 方法。

这是表单的代码:

<form action="Page2.php" method="post" enctype="multipart/form-data">
  <!-- Contacts Details -->
  <p>
    <input type="button" value="Add Contact" onClick="addRow('contacts')" />
    <input type="button" value="Remove Contact" onClick="deleteRow('contacts')" />
    <p>(All actions apply only to entries with check marked check boxes only.)</p>
  </p>
  <table id="contacts" class="form" border="1">
    <tbody>
      <tr>
        <p>
          <td>
            <input type="checkbox" name="chk[]" checked="checked" />
          </td>
          <td>
            <label>Address</label>
            <input type="text" name="ADDRESS[]" />
          </td>
          <td>
            <label for="PHONE_NUMBER">Phone Number</label>
            <input type="text" class="small" name="PHONE_NUMBER[]" />
          </td>
        </p>
      </tr>
    </tbody>
  </table>
  <script>
    function addRow(tableID) {
      var table = document.getElementById(tableID);
      var rowCount = table.rows.length;
      if (rowCount < 10) {
        var row = table.insertRow(rowCount);
        var colCount = table.rows[0].cells.length;
        for (var i = 0; i < colCount; i++) {
          var newcell = row.insertCell(i);
          newcell.innerHTML = table.rows[0].cells[i].innerHTML;
        }
      } else {
        alert("Maximum Contacts Number is 10");
      }
    }

    function deleteRow(tableID) {
      var table = document.getElementById(tableID);
      var rowCount = table.rows.length;
      for (var i = 0; i < rowCount; i++) {
          debugger;
        var row = table.rows[i];
        var chkbox = row.cells[0].childNodes[0];
        if (null != chkbox && true == chkbox.checked) {
          if (rowCount <= 1) {
            alert("Cannot Remove all Contacts");
            break;
          }

          table.deleteRow(i);
          rowCount--;
          i--;
        }
      }
    }
  </script>

  <!-- Form Sending -->
  <input type="submit" value="Proceed">
</form>

编辑#!
我刚刚调试了上面的代码,发现deleteRow(tableID)方法中的变量chkboxrow在调试器中显示为undefined

我能做些什么来解决这个问题?

【问题讨论】:

  • 不要同时问两个问题。 Border 设置为 1 应该是一个单独的问题,这样它就可以被搜索并帮助其他人。此外,您应该有一个工作示例。最后,正如 Liam 提到的,您进行了哪些调试?
  • 我编辑了您的代码以包含调试器语句。在打开开发工具的情况下运行它,你会发现问题所在。检查您的 chkbox 变量。如果您之前从未调试过,请参阅 Liam 的链接 stackoverflow.com/questions/988363/…
  • 您是否尝试过我的建议?我的评论实际上告诉你问题出在哪里。如果你这样做了,你应该编辑你的问题,展示你如何调试它以及你当前面临的问题。 Stack Overflow 不是让别人为你调试你的代码,你必须证明你已经完成了至少某种程度的调试。真的,我已经回答了你的问题,但我正在推动你学习如何自己解决这个问题。一旦你添加了你所做的调试,我很高兴投票重新打开,但我很确定如果你按照我的提示,你会自己解决。
  • @JuanMendes 我刚刚调试了一下,发现变量chkboxrow是未定义的。我会将其添加到问题中,如果您重新打开问题,我将感谢您。
  • row is not undefined.... chkbox is not undefined... 听起来不像您实际调试过它。

标签: javascript html forms html-table rows


【解决方案1】:

问题在于使用row.cells[0].childNodes[0] 是一种非常脆弱的查找节点的方法。您正在检索文本节点而不是复选框。使用 childNodes 会因为对 HTML 的最小更改而中断。

更可靠的方法是query for the element你正在寻找

var chkbox = row.cells[0].querySelector('[type=checkbox]')

<form action="Page2.php" method="post" enctype="multipart/form-data">
  <!-- Contacts Details -->
  <p>
    <input type="button" value="Add Contact" onClick="addRow('contacts')" />
    <input type="button" value="Remove Contact" onClick="deleteRow('contacts')" />
    <p>(All actions apply only to entries with check marked check boxes only.)</p>
  </p>
  <table id="contacts" class="form" border="1">
    <tbody>
      <tr>
        <p>
          <td>
            <input type="checkbox" name="chk[]" checked="checked" />
          </td>
          <td>
            <label>Address</label>
            <input type="text" name="ADDRESS[]" />
          </td>
          <td>
            <label for="PHONE_NUMBER">Phone Number</label>
            <input type="text" class="small" name="PHONE_NUMBER[]" />
          </td>
        </p>
      </tr>
    </tbody>
  </table>
  <script>
    function addRow(tableID) {
      var table = document.getElementById(tableID);
      var rowCount = table.rows.length;
      if (rowCount < 10) {
        var row = table.insertRow(rowCount);
        var colCount = table.rows[0].cells.length;
        for (var i = 0; i < colCount; i++) {
          var newcell = row.insertCell(i);
          newcell.innerHTML = table.rows[0].cells[i].innerHTML;
        }
      } else {
        alert("Maximum Contacts Number is 10");
      }
    }

    function deleteRow(tableID) {
      var table = document.getElementById(tableID);
      var rowCount = table.rows.length;
      for (var i = 0; i < rowCount; i++) {
          debugger;
        var row = table.rows[i];
        var chkbox = row.cells[0].querySelector('[type=checkbox]');
        if (null != chkbox && true == chkbox.checked) {
          if (rowCount <= 1) {
            alert("Cannot Remove all Contacts");
            break;
          }

          table.deleteRow(i);
          rowCount--;
          i--;
        }
      }
    }
  </script>

  <!-- Form Sending -->
  <input type="submit" value="Proceed">
</form>

【讨论】:

  • 我刚刚检查了这个方法,但不幸的是这仍然不起作用。我认为它不起作用,因为正如我在问题中所写的那样,row 变量也是未定义的
  • @IdoNaveh 你是什么意思它不起作用?我同时按下了添加和删除联系人按钮,它们添加和删除了行。
  • @downvoter 这不应该像它那样困扰我......但是谁用完全符合 OP 要求但没有任何评论的代码否决了答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2022-07-20
  • 2023-03-15
相关资源
最近更新 更多