
ace 编辑器支持在同一页面中创建多个独立实例,关键在于避免硬编码 id 依赖、正确传入 dom 元素或使用 null 创建无绑定容器,再手动挂载到文档中。
Ace 编辑器默认示例常以 ace.edit("editor") 形式调用,这容易让人误以为它强制依赖 ID 为 "editor" 的元素。实际上,这是历史惯性写法,并非限制——Ace 完全支持多实例,只需遵循其 API 设计规范。
✅ 正确做法:两种可靠初始化方式
方式一:传入已存在的 DOM 元素(推荐用于结构化布局)
确保每个编辑器容器是空的 然后在 JavaScript 中显式获取并传入元素: editor.container 是 Ace 创建的完整 UI 容器(含编辑区、滚动条、状态栏等),可自由操作 DOM。 立即学习“前端免费学习笔记(深入)”; ❌ 错误:复用相同 ❌ 错误:在 DOM 尚未加载完成时调用 ace.edit() → 返回 null 或报错。
// 初始化第一个编辑器
const editor1 = ace.edit(document.getElementById("editor1"));
editor1.setTheme("ace/theme/monokai");
editor1.session.setMode("ace/mode/html");
editor1.setValue(`Hello from Editor 1
`, -1);
// 初始化第二个编辑器(ID 不同,完全独立)
const editor2 = ace.edit(document.getElementById("editor2"));
editor2.setTheme("ace/theme/github");
editor2.session.setMode("ace/mode/css");
editor2.setValue("body { margin: 0; font-family: sans-serif; }", -1);⚠️ 注意: 内不能包含 或其他子节点。Ace 会清空该容器并注入自己的 iframe 和 UI 结构。你提供的原始代码中, 内嵌了 ,这会导致初始化失败或渲染异常——请将源码内容移至 JS 中通过 setValue() 设置。
方式二:传入 null,动态创建并挂载(更灵活,适合动态生成场景)
// 创建一个不绑定任何 DOM 的编辑器实例
const editor3 = ace.edit(null);
editor3.setTheme("ace/theme/twilight");
editor3.session.setMode("ace/mode/javascript");
editor3.setValue("console.log('Dynamic editor loaded!');", -1);
// 手动将其容器插入页面(例如追加到 body 或指定父容器)
document.querySelector(".editor-container").appendChild(editor3.container);? 常见错误与修复
✅ 修复:确保脚本置于











