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

删除并重新添加含类定义的节点时触发重复声明错误,如何解决?

解决类重复声明错误的方案

问题原因

虽然你用remove()删除了id="box"的DOM节点,但节点内的<script>在第一次加载时已经执行,class Sample已经在全局作用域完成声明。由于JavaScript中类不允许重复声明,当你把节点重新添加回<body>时,脚本会再次执行,触发Uncaught SyntaxError: Identifier 'Sample' has already been declared错误。

可行解决方案

  • 移除节点前先删除内部脚本元素
    在移除box节点前,先把里面的<script>元素删掉,这样重新添加节点时就不会重复执行类声明代码:

    const box = document.getElementById('box');
    // 找到并移除内部的script标签
    const scriptEl = box.querySelector('script');
    if (scriptEl) scriptEl.remove();
    // 再移除box节点
    box.remove();
    // 重新添加回body时不会触发重复声明
    document.body.appendChild(box);
    
  • 用函数作用域包裹类声明
    修改原脚本,把类放在自执行函数作用域内,避免污染全局作用域,即使脚本重复执行也不会触发重复声明:

    <div id="box">
      <script>
        (function() {
          class Sample {
            // 类内容
          }
          // 若需全局访问,可挂载到window:window.Sample = Sample;
        })();
      </script>
    </div>
    
  • 克隆节点时排除脚本或不克隆子元素
    如果不需要保留原脚本的执行能力,可以克隆空的box节点,再重新添加所需内容:

    const box = document.getElementById('box');
    // 仅克隆box节点本身,不包含子元素
    const emptyBox = box.cloneNode(false);
    box.remove();
    // 往emptyBox添加内容后再append回body
    document.body.appendChild(emptyBox);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:03:11