You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DOM的onClick函数删除表格指定行?点击X按钮误删首行问题

解决点击删除按钮总是删除表格第一行的问题

我明白你遇到的问题了——每次点击X按钮都只删掉第一行,这确实挺闹心的。你自己也精准找到了问题根源:所有表格行都用了同一个id="mainTR",而getElementById()只会返回匹配到的第一个元素,所以每次触发删除时,都只会选中第一行。

下面给你几种实用的解决方案,你可以根据自己的需求选择:

方案1:给每行设置唯一ID,删除时传入对应标识

我们可以利用循环的索引给每行生成唯一的ID,然后在点击删除按钮时把对应的索引传进去,就能精准找到要删除的行了:

function render(){
  for (let i = 0; i < allMovie.length; i++) {
    var tr = document.createElement('tr');
    tr.setAttribute("id", `mainTR-${i}`); // 用索引生成唯一ID
    table.appendChild(tr);
    // 以下td创建代码保持不变
    var td1 = document.createElement('td');
    td1.textContent = allMovie[i].MovieName11;
    td1.setAttribute("class", "td1");
    tr.appendChild(td1);
    var td2 = document.createElement('td');
    td2.textContent = allMovie[i].selectPlatform11;
    td2.setAttribute("class", "td2");
    tr.appendChild(td2);
    var td3 = document.createElement('td');
    td3.textContent = allMovie[i].randomRate;
    td3.setAttribute("class", "td3");
    tr.appendChild(td3);
    var td4 = document.createElement('td');
    td4.textContent = allMovie[i].monthlyPay11;
    td4.setAttribute("class", "td4");
    tr.appendChild(td4);
    var td5 = document.createElement('td');
    td5.setAttribute("id", "td5");
    td5.innerHTML = `<button onclick="remove(${i})"> X </button>` // 传入索引
    tr.appendChild(td5);
  }
}
function remove(index) {
  var removeOBJ = document.getElementById(`mainTR-${index}`);
  if(removeOBJ) removeOBJ.remove(); // 先判断元素存在再删除,避免报错
}

方案2:利用事件对象定位当前行(无需ID)

这种方法不用维护唯一ID,直接通过点击事件的源头(按钮),往上找到它所在的表格行,更灵活:

function render(){
  for (let i = 0; i < allMovie.length; i++) {
    var tr = document.createElement('tr');
    table.appendChild(tr);
    // 以下td创建代码保持不变
    var td1 = document.createElement('td');
    td1.textContent = allMovie[i].MovieName11;
    td1.setAttribute("class", "td1");
    tr.appendChild(td1);
    var td2 = document.createElement('td');
    td2.textContent = allMovie[i].selectPlatform11;
    td2.setAttribute("class", "td2");
    tr.appendChild(td2);
    var td3 = document.createElement('td');
    td3.textContent = allMovie[i].randomRate;
    td3.setAttribute("class", "td3");
    tr.appendChild(td3);
    var td4 = document.createElement('td');
    td4.textContent = allMovie[i].monthlyPay11;
    td4.setAttribute("class", "td4");
    tr.appendChild(td4);
    var td5 = document.createElement('td');
    td5.setAttribute("id", "td5");
    td5.innerHTML = `<button onclick="remove(event)"> X </button>` // 传入事件对象
    tr.appendChild(td5);
  }
}
function remove(event) {
  // 用closest找到最近的tr元素,比一层层parentNode更可靠
  const targetTr = event.target.closest('tr');
  if(targetTr) targetTr.remove();
}

方案3:事件委托(推荐,性能更优)

如果你的表格行是动态生成的(比如后续还会添加新行),事件委托是最好的选择——只需要给表格绑定一次事件,就能处理所有按钮的点击,不用给每个按钮单独绑定:

// 先给表格绑定点击事件,可以放在页面初始化时执行
table.addEventListener('click', function(event) {
  // 判断点击的是删除按钮
  if(event.target.tagName === 'BUTTON' && event.target.textContent.trim() === 'X') {
    const targetTr = event.target.closest('tr');
    if(targetTr) targetTr.remove();
  }
});

function render(){
  for (let i = 0; i < allMovie.length; i++) {
    var tr = document.createElement('tr');
    table.appendChild(tr);
    // 以下td创建代码保持不变
    var td1 = document.createElement('td');
    td1.textContent = allMovie[i].MovieName11;
    td1.setAttribute("class", "td1");
    tr.appendChild(td1);
    var td2 = document.createElement('td');
    td2.textContent = allMovie[i].selectPlatform11;
    td2.setAttribute("class", "td2");
    tr.appendChild(td2);
    var td3 = document.createElement('td');
    td3.textContent = allMovie[i].randomRate;
    td3.setAttribute("class", "td3");
    tr.appendChild(td3);
    var td4 = document.createElement('td');
    td4.textContent = allMovie[i].monthlyPay11;
    td4.setAttribute("class", "td4");
    tr.appendChild(td4);
    var td5 = document.createElement('td');
    td5.setAttribute("id", "td5");
    td5.innerHTML = `<button> X </button>` // 这里不用加onclick了
    tr.appendChild(td5);
  }
}

这几种方案都能解决你的问题,其中事件委托的方式更适合动态表格,维护起来也更省心~

内容的提问来源于stack exchange,提问作者Hamza SAMI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:17:30