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

JavaScript中如何在模板字符串内调用onclick点击事件

问题原因

你在模板字符串的onclick属性中直接写入${this.removeBook(bookItem)},这会在模板字符串拼接生成HTML的阶段立即执行removeBook方法,而非将其作为点击事件的回调函数绑定给按钮。你生成了3行表格,因此页面加载时会自动执行3次removeBook打印Hello。
另外你给所有删除按钮设置了相同的id="btnRemove",属于无效的HTML语法,同一个页面内id属性不能重复,直接保留class属性即可。

解决方案1:使用事件委托(推荐)

不需要给每个按钮单独绑定事件,直接给表格父容器绑定点击事件,通过事件冒泡判断点击目标是否为删除按钮即可,性能更好,也适配动态新增的表格行:

class DisplayBook {
  constructor() {
    // 初始化时给表格父容器绑定事件委托
    tableBody.addEventListener('click', (e) => {
      // 判断点击的是删除按钮
      if (e.target.classList.contains('btn-remove')) {
        // 拿到当前点击按钮所在的tr行,移除
        const targetTr = e.target.closest('tr')
        this.removeBook(targetTr)
      }
    })
  }

  // 渲染表格行的方法
  renderRow(bookItem) {
    // 模板字符串不需要写onclick属性
    let tableRow = `<tr>
                      <th scope="row">
                        <button class="btn-remove">Delete</button>
                      </th>
                      <td>${bookItem.lBookName}</td>
                      <td>${bookItem.lBookAuthor}</td>
                      <td>${bookItem.lBookType}</td>
                    </tr>`;
    tableBody.innerHTML += tableRow;
  }

  removeBook(trElement) {
    trElement.remove()
    console.log("Hello")
  }
}

解决方案2:单独创建DOM元素绑定事件

如果你不想用事件委托,可以不用innerHTML拼接字符串,改为手动创建DOM节点后绑定点击事件,注意要处理this指向问题:

class DisplayBook {
  renderRow(bookItem) {
    const tr = document.createElement('tr')
    tr.innerHTML = `<th scope="row">
                      <button class="btn-remove">Delete</button>
                    </th>
                    <td>${bookItem.lBookName}</td>
                    <td>${bookItem.lBookAuthor}</td>
                    <td>${bookItem.lBookType}</td>`
    // 拿到当前行的删除按钮,绑定点击事件
    const removeBtn = tr.querySelector('.btn-remove')
    removeBtn.addEventListener('click', () => {
      // 箭头函数继承外部this指向类实例,可以直接调用removeBook
      this.removeBook(tr)
    })
    tableBody.appendChild(tr)
  }

  removeBook(trElement) {
    trElement.remove()
    console.log("Hello")
  }
}

内容的提问来源于stack exchange,提问作者Anurag Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:54:02