← 全部文档

多个可编辑区域

让一个页面上的多个编辑器像一个编辑器那样工作:只有作者正在编辑的区域显示工具栏,并且由一个组 API 同时读写所有区域。适用于包含标题、摘要和正文的 CMS 表单,这些区域不应各自带有一整套工具栏。

标记为 Title、Summary 和 Body 的三个编辑器;只有光标所在的 Summary 显示了工具栏
组 "article" 中的三个区域。工具栏只显示在获得焦点的区域上,这里是 Summary。

启用

该功能由 multiroot.js 插件提供(也包含在 plugins/all_plugins.js 中)。为每个区域创建一个编辑器,并为它们设置相同的 multiRootGroup。它没有按钮。

<label>Title</label><div id="title"><h1>Spring release notes</h1></div>
<label>Summary</label><div id="summary"><p>What changed in the editor this quarter.</p></div>
<label>Body</label><div id="body"><p>The body text goes here.</p></div>
<script>
function root(id, height) {
  return new RichTextEditor("#" + id, { multiRootGroup: "article", height: height, toolbar: "basic" });
}
var title = root("title", "110px");
var summary = root("summary", "110px");
var body = root("body", "200px");
</script>

每个区域以其元素的 id 命名,因此这个组包含 title、summary 和 body 三个根。第一个根一开始处于活动状态。

选项

选项默认值作用
multiRootGroupnull(关闭)组名相同的编辑器组成一个多根编辑器。
multiRootName元素的 id,否则为 root1、root2……该根在组 API 中的名称。
multiRootToolbarHostnull用于放置活动工具栏的元素或元素 id。在 2.6.12 中请不要使用它;见“注意事项”。

组 API

组中的每个编辑器都会得到同一个 editor.multiRoot 对象:

成员作用
getRoots()["title", "summary", "body"]
getActive()带有工具栏的根的名称,例如 "summary"。
getEditor(name)该根的编辑器实例。
focusRoot(name)让该根成为活动根并获得焦点。
getHTML()每个根一个条目,这正是 CMS 要保存的内容:{"title":"<h1 id=\"spring-release-notes\">Spring release notes</h1>","summary":"<p>What changed in the editor this quarter.</p>","body":"<p>The body text goes here.</p>"}
setHTML(map)加载映射中列出的每个根;不在映射中的根保持不变。
onActiveChange(fn)当另一个根成为活动根时调用 fn({ active, editor })。返回一个用于移除该监听器的函数。
getCapabilities(){ sharedToolbar: true, sharedGroupApi: true, perRootUndo: true, sharedUndoStack: false, selectionAcrossRoots: false, sharedCollaborationSession: false, note }
title.multiRoot.onActiveChange(function (e) {
  document.getElementById("where").textContent = "Editing: " + e.active;
});
fetch("/api/article/42", { method: "PUT", body: JSON.stringify(title.multiRoot.getHTML()) });

使用方法

点击进入某个区域,或者任何让焦点进入该区域的操作(包括 focusRoot()),都会让它成为活动区域:它的工具栏出现,其他区域的工具栏被隐藏。工具栏按钮作用于该区域。在测试中,选中正文末尾并点击 Bold,在 body 中保存了 <p>The body text goes h<b>ere.</b></p>,其他根保持不变。

注意事项

  • 各区域是独立的编辑器。撤销按区域进行,选区不能跨越两个区域,使用协作时每个区域各自同步。getCapabilities() 也说明了这一点。
  • 隐藏的工具栏不占空间,因此活动区域改变时,下方的内容会移动一个工具栏的高度。
  • 在 2.6.12 中,调整窗口大小会让所有工具栏重新显示,直到作者移到另一个区域为止。这是编辑器自身的响应式代码恢复了它们。
  • multiRootToolbarHost 在 2.6.12 中无法正常工作。移入宿主元素的工具栏会失去编辑器的样式(以非常大的图标渲染),而且已经移入的工具栏不会再被隐藏,因此随着作者切换区域,它们会越堆越多。请让工具栏保持在原位。
  • 每个区域都是一个有自己配置的普通编辑器,因此不同的区域可以有不同的工具栏;请为它们全部设置相同的 multiRootGroup。

相关内容:同一页面上的多个编辑器演示、获取 HTML。