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

JavaScript如何实现点击元素时同步删除DOM中两个相同id的元素

问题根源

HTML 规范要求 ID 必须全局唯一,你当前页面存在重复ID,所以querySelector只会返回第一个匹配元素,getElementById也只会返回首个匹配结果,这是原生API的既定逻辑。

解决方案

我们可以使用属性选择器绕过ID唯一限制,匹配所有ID值相同的元素,统一删除对应的父级li节点,修改后的JS代码如下:

document.addEventListener("DOMContentLoaded", () => { 
  // 绑定到最外层的content容器,适配插件动态生成的元素
  document.querySelector(".content").addEventListener("click", getItem) 
}) 

function getItem(e) { 
  // 只响应可见绿色元素的点击
  let visibleLi = e.target.closest(".visible")
  if (!visibleLi) return

  const targetId = e.target.id
  // 用属性选择器匹配所有id等于targetId的span元素
  const allMatchSpans = document.querySelectorAll(`span[id="${targetId}"]`)
  
  // 遍历所有匹配的span,删除它们的父级li
  allMatchSpans.forEach(span => {
    const parentLi = span.closest("li")
    parentLi && parentLi.remove()
  })
}

代码说明

  • 事件绑定改到外层.content容器,不管插件后续怎么动态生成#container内的元素,事件委托都能生效
  • 用span[id="xxx"]属性选择器可以无视ID唯一限制,拿到所有同ID的span元素
  • 遍历所有匹配元素统一删除父级li,无需单独区分紫色(hidden类)和绿色(visible类)元素

最佳实践建议

如果可以调整插件生成规则,建议将标识属性从id改为自定义data属性,比如给span设置data-id="1",取值时用e.target.dataset.id,完全符合HTML规范,也不会出现重复ID的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:36:06