
ace 编辑器支持在同一页面中创建多个独立实例,关键在于避免硬编码 id 依赖、正确传入 dom 元素或使用 NULL 创建无绑定容器,再手动挂载到文档中。
Ace 编辑器默认示例常以 ace.edit(“editor”) 形式调用,这容易让人误以为它强制依赖 ID 为 “editor” 的元素。实际上,这是历史惯性写法,并非限制——Ace 完全支持多实例,只需遵循其 API 设计规范。
✅ 正确做法:两种可靠初始化方式
方式一:传入已存在的 DOM 元素(推荐用于结构化布局)
确保每个编辑器容器是空的
元素(不含子内容),并赋予唯一 ID 或 class:
然后在 javaScript 中显式获取并传入元素:
// 初始化第一个编辑器 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);
editor.container 是 Ace 创建的完整 UI 容器(含编辑区、滚动条、状态栏等),可自由操作 DOM。
立即学习“前端免费学习笔记(深入)”;
? 常见错误与修复
-
❌ 错误:复用相同
-
❌ 错误:在 DOM 尚未加载完成时调用 ace.edit() → 返回 null 或报错。
✅ 修复:确保脚本置于