代码之家  ›  专栏  ›  技术社区  ›  connexo

意外自动插入tbody元素:表不是row.parentElement[重复]

  •  -1
  • connexo  · 技术社区  · 5 年前

    检查这个简单的表:

    const table = document.getElementById("table");
    
    table.addEventListener('click', e => {
      if (e.target.tagName === 'BUTTON') {
        const affectedRow = e.target.closest('tr');
        table.removeChild(affectedRow);
      }
    });
    <table border="1" id="table">
      <tr>
        <td>row A</td>
        <td><button>delete row</button></td>
      </tr>
      <tr>
        <td>row B</td>
        <td><button>delete row</button></td>
      </tr>
      <tr>
        <td>row C</td>
        <td><button>delete row</button></td>
      </tr>
    </table>

    尝试使用删除行 table.removeChild(affectedRow) 给了我

    Uncaught DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
    

    tbody 要素 强制性的

    表格主体 表格主体

    不使用 HTMLTableElement.prototype.deleteRow(index) ,仅使用 HTMLElement.prototype 方法和属性?

    3 回复  |  直到 5 年前
        1
  •  2
  •   Nick    5 年前

    您可以检查表下面是否有tbody元素,如果有,则从该元素下面删除行:

    const table = document.getElementById("table");
    const tbody = (table.firstElementChild.nodeName == 'TBODY' ? table.firstElementChild : table);
    
    table.addEventListener('click', e => {
      if (e.target.tagName === 'BUTTON') {
        const affectedRow = e.target.closest('tr');
        tbody.removeChild(affectedRow);
      }
    });
    <table border="1" id="table">
      <tr>
        <td>row A</td>
        <td><button>delete row</button></td>
      </tr>
      <tr>
        <td>row B</td>
        <td><button>delete row</button></td>
      </tr>
      <tr>
        <td>row C</td>
        <td><button>delete row</button></td>
      </tr>
    </table>
        2
  •  1
  •   Joy Biswas    5 年前

    用这种方法 table.tBodies[0].removeChild

    tbody、thead和tfoot由所有浏览器插入,即使是冠军IE也这样做,这是W3c规范。

    HTML Table Body元素(tbody)封装了一组表行(tr元素),表示它们构成了表的主体(Table),类似于表的页眉和页脚。

        3
  •  1
  •   JoshG    5 年前

    许多浏览器添加了 <tbody> 元素添加到HTML表中,如果不存在。你可以在这篇文章中了解更多的原因: Why do browsers insert tbody element into table elements?

    removeChild() 只删除子对象,不删除子对象。所以如果 <t车身> 然后存在 <tr> 你要删除的是 <t车身> ,而不是 <table> 元素。

    document.querySelector("#table tbody").removeChild(affectedRow);