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

仅IE浏览器中Dojo Widget报错:ID 'Frm1gpop'已被注册

解决IE中Dojo Dialog报错:"ID 'frmdlgpop'已被注册"

我之前碰到过不少类似的IE兼容性问题,你的这个报错核心原因是IE对DOM元素ID的唯一性校验比现代浏览器严格得多,再加上代码里固定ID的重复创建逻辑直接触发了这个问题。

问题根源

你给Dialog指定了固定的id: "frmdlgpop",当这段代码被多次执行(比如用户重复触发弹窗创建操作),或者旧的Dialog实例只是被隐藏、没有彻底销毁(对应的DOM元素还留在页面中),IE就会检测到同一个ID被重复注册,进而抛出这个错误。现代浏览器可能会自动覆盖或忽略这种情况,但IE不会。

解决方案

这里给你三个可行的解决办法,按推荐程度排序:

1. 去掉固定ID,让Dojo自动生成唯一ID

这是最省心的方案,Dojo会自动给每个Dialog实例分配唯一ID,从根源上避免重复问题:

var formDlg = new xwt.widget.layout.Dialog({ 
    title: DialogTitle + " Selection", 
    defaultButtonLabel: "Cancel", 
    "class": "frmdes", 
    style: "width:70%!important;" 
}); 
formDlg.startup();

2. 创建前检查并销毁旧实例

如果你因为业务需求必须保留固定ID,那每次创建新Dialog前,先检查是否已有对应的实例,存在就彻底销毁:

// 先查找是否存在旧的Dialog实例
var existingDlg = dijit.byId("frmdlgpop");
if (existingDlg) {
    existingDlg.destroyRecursive(); // 销毁实例及关联的DOM元素
}

// 再创建新的Dialog
var formDlg = new xwt.widget.layout.Dialog({ 
    title: DialogTitle + " Selection", 
    defaultButtonLabel: "Cancel", 
    "class": "frmdes", 
    "id": "frmdlgpop", 
    style: "width:70%!important;" 
}); 
formDlg.startup();

3. 关闭Dialog时自动销毁实例

如果Dialog是用户关闭后可能再次打开的场景,可以在关闭事件里销毁实例,确保DOM元素被完全移除:

var formDlg = new xwt.widget.layout.Dialog({ 
    title: DialogTitle + " Selection", 
    defaultButtonLabel: "Cancel", 
    "class": "frmdes", 
    "id": "frmdlgpop", 
    style: "width:70%!important;",
    onClose: function() {
        this.destroyRecursive(); // 关闭时彻底销毁实例
        return true; // 允许Dialog执行关闭操作
    }
}); 
formDlg.startup();

额外提示

IE的DOM兼容性问题一直是前端开发的痛点,Dojo虽然做了不少兼容处理,但固定ID重复创建这种场景很容易触发这类报错,优先用第一种自动生成ID的方案,能避免很多不必要的麻烦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:45:52