ThinkEditorKit 概述

ThinkEditorKit 是信译编辑器 一体化 UI 套件,封装工具栏(文件/编辑/插入/打印/视图)、文档页签栏、文档编辑区及多文档 ThinkEditorInstance 管理。

典型用法:

const thinkEditorKit = new ThinkEditorKit({
  instanceName: "实例1",
  lib: "/editorSdk/",
  // selectToolTab: "edit",  // 默认即为编辑页签,可省略
});
await thinkEditorKit.LoadAsync(document.getElementById("editor-root"));
const thinkEditor = await thinkEditorKit.CreateEditorAsync({ docName: "doc1", showName: "新文档", selectEditor: true });
thinkEditor.NewDoc("doc1", E_DOC_TYPE.Entity);

更多 Kit UI 配置见 Kit UI 常用配置示例

ThinkEditorKit 继承 EventTarget,可监听编辑器内部事件(经 editorInstance 路由后冒泡到 Kit)。常用注册方式见 Kit 事件


构造函数

描述

创建 Kit 实例,合并默认配置与 options,并初始化内部 ThinkEditorInstance

Load / LoadAsync 之前也可仅通过 options 预置配置;UI 相关项在 LoadAsync 后才会渲染到 DOM。

接口

new ThinkEditorKit(options?: object)

参数

参数名 必填 类型 说明 备注
options object Kit 与编辑器合并配置 配置项说明

返回值

类型 说明 备注
ThinkEditorKit Kit 实例

Load

描述

加载 Kit UI 到指定 DOM 容器(LoadAsync 的同步包装)。

会清空 container 内容,创建工具栏、工具面板、文档页签栏(可选)、文档编辑区,并初始化工具页签(默认选中 selectToolTab,未配置时为 编辑 页签)。

接口

async Load(container: HTMLElement): Promise<void>

参数

参数名 必填 类型 说明 备注
container HTMLElement 挂载根节点 需有可用高度;内部使用 flex 纵向布局

返回值

类型 说明 备注
Promise 等价于 LoadAsync

LoadAsync

描述

异步加载 Kit 完整 UI 结构。

  1. 清空并记录 container
  2. showToolBar / showToolPanel / showDocBar / showDocPanel 创建对应区域
  3. 初始化工具页签与工具面板内容(激活页签见 selectToolTab,默认 "edit"
  4. 刷新文档页签栏与 docPanel 高度

接口

async LoadAsync(container: HTMLElement): Promise<void>

参数

参数名 必填 类型 说明 备注
container HTMLElement 挂载根节点 Load

返回值

类型 说明 备注
Promise

Configure

描述

运行时合并配置并应用到 UI(工具栏页签名/显隐、iconMap、toolBarAutoWrapselectToolTabpreventDefaultKeys、文档栏等)。

  • Load 之前调用:合并 this.configeditorCommonOptions(Kit 键见 KIT_ONLY_CONFIG_KEYS),不操作 DOM
  • Load 之后调用:同步 DOM、工具栏实例;若 *Bar.items / iconMap 等变更会重建工具面板;lib / auth 等编辑器项写入 editorCommonOptions,影响后续 CreateEditorAsync;若传入 selectToolTab 会切换到对应工具页签;若 toolBarAutoWrap 变更会重建工具面板

接口

async Configure(settings?: object): Promise<void>

参数

参数名 必填 类型 说明 备注
settings object 待合并的配置片段 字段与构造函数 options 相同,深度合并

返回值

类型 说明 备注
Promise

CreateEditorAsync

描述

创建并注册一个新的 ThinkEditor 文档实例:执行 InitAsync、预置 container = docPanel、注册右键菜单、加入 editorInstance

首份文档创建后无论 selectEditor 为何值,都会自动 SelectEditorLoaddocPanel
第 2 份及以后selectEditor === false 时仅 InitAsync + AddEditor,待 SelectEditor(或页签切换)再 Load,避免多 canvas 堆叠。

docName 已存在,直接返回已有实例。

showDocBar === false 时,创建新文档前会自动 CloseAllEditors()(单文档模式),且创建后会自动 SelectEditor 以立即显示文档。

接口

async CreateEditorAsync(editorOptions?: object): Promise<ThinkEditor>

参数

参数名 必填 类型 说明 备注
editorOptions object 单文档配置 与 Kit 构造时的 editorCommonOptions 合并
editorOptions.docName 是* string 文档内部名 *新建时必填;重复则返回已有
editorOptions.showName string 页签显示名 默认同 docName
editorOptions.selectEditor boolean 创建后是否选中并 Load 首份文档忽略此标志始终 Load;第 2 份起默认 false 不挂载,trueSelectEditor
editorOptions.lib string | ArrayBuffer WASM 路径或二进制 继承 Kit 默认
editorOptions.fontPath string 字体目录
editorOptions.auth object 授权配置
editorOptions.logLevel number 日志级别 E_LOG_LEVEL
editorOptions.forbidCallAutoSetInputFocus boolean 禁止自动 focus input 默认 false

返回值

类型 说明 备注
Promise 文档编辑器实例 创建失败时 InitAsync 抛错

批量创建多文档(推荐)

连续创建时第 1 份会自动显示;其余使用 selectEditor: false,需要时再 SelectEditor

for (const item of docList) {
  await thinkEditorKit.CreateEditorAsync({ docName: item.name, showName: item.title, selectEditor: false });
}
// 首份已自动 Load;若要默认展示其他文档:
// thinkEditorKit.SelectEditor(docList[2].name);

SelectEditor

描述

docName 切换当前选中文档:对旧文档 UnLoad,对新文档 Load,并刷新文档页签栏。

内部经 ThinkEditorInstance.SelectEditor 处理,切换后会恢复输入焦点(SetInputFocus / SetEditorFocus)。

接口

SelectEditor(docName: string): void

参数

参数名 必填 类型 说明 备注
docName string 目标文档名 不存在时 Instance 层 console.warn

返回值

类型 说明 备注
void Instance 层返回 boolean;Kit 层无返回值

SelectEditorByEditorId

描述

editorId 切换当前选中文档,并刷新文档页签栏。

接口

SelectEditorByEditorId(editorId: string): boolean

参数

参数名 必填 类型 说明 备注
editorId string 编辑器 ID

返回值

类型 说明 备注
boolean 是否切换成功 false:找不到对应 editor

CloseEditor

描述

关闭指定文档(UnInit 并移出列表),自动选中最近使用的文档,并刷新页签栏。

接口

CloseEditor(doc: string | ThinkEditor): boolean

参数

参数名 必填 类型 说明 备注
doc string | ThinkEditor 文档名或实例

返回值

类型 说明 备注
boolean 是否关闭成功 文档不存在时 false

CloseAllEditors

描述

关闭全部已打开文档,并刷新页签栏。

接口

CloseAllEditors(): void

参数

无。

返回值

类型 说明 备注
void

AddEditor

描述

将已在外部创建并完成 InitAsyncThinkEditor 注册到 Kit 的 editorInstance

docName 重复时拒绝添加。

接口

AddEditor(thinkEditor: ThinkEditor): boolean

参数

参数名 必填 类型 说明 备注
thinkEditor ThinkEditor 编辑器实例 通常更推荐使用 CreateEditorAsync

返回值

类型 说明 备注
boolean 是否添加成功

GetEditors

描述

获得Kit在所有编辑器ThinkEditor对象。

接口

GetEditors(): Array<ThinkEditor> | undefined

参数

参数名 必填 类型 说明 备注

返回值

类型 说明 备注
Array | undefined 编辑器实例数组 不存在时为 undefined

GetEditor

描述

docName 获取已注册的 ThinkEditor 实例。

接口

GetEditor(docName: string): ThinkEditor | undefined

参数

参数名 必填 类型 说明 备注
docName string 文档名

返回值

类型 说明 备注
ThinkEditor | undefined 编辑器实例 不存在时为 undefined

GetEditorByShowName

描述

按页签显示名 showName 查找编辑器。

接口

GetEditorByShowName(showName: string): ThinkEditor | undefined

参数

参数名 必填 类型 说明 备注
showName string 显示名称

返回值

类型 说明 备注
ThinkEditor | undefined 编辑器实例

GetEditorByIndex

描述

按打开顺序索引获取编辑器(从 0 开始)。

接口

GetEditorByIndex(index: number): ThinkEditor | undefined

参数

参数名 必填 类型 说明 备注
index number 索引 越界返回 undefined

返回值

类型 说明 备注
ThinkEditor | undefined 编辑器实例

GetEditorByEditorId

描述

editorId 获取编辑器实例。

接口

GetEditorByEditorId(editorId: string): ThinkEditor | undefined

参数

参数名 必填 类型 说明 备注
editorId string 编辑器 ID

返回值

类型 说明 备注
ThinkEditor | undefined 编辑器实例

GetSelectedEditor

描述

获取当前选中的 ThinkEditor 实例。

接口

GetSelectedEditor(): ThinkEditor | undefined

参数

无。

返回值

类型 说明 备注
ThinkEditor | undefined 当前选中文档 无文档时 undefined

GetSelectedDocName

描述

获取当前选中文档的 docName

接口

GetSelectedDocName(): string

参数

无。

返回值

类型 说明 备注
string 文档名 无选中时为空字符串

GetEditorCount

描述

返回当前打开的文档数量。

接口

GetEditorCount(): number

参数

无。

返回值

类型 说明 备注
number 文档数

GetLastEditor

描述

selectedTime 获取最近一次被选中的编辑器(关闭文档时用于自动切换)。

接口

GetLastEditor(): ThinkEditor | undefined

参数

无。

返回值

类型 说明 备注
ThinkEditor | undefined 最近选中的编辑器

Destroy

描述

销毁 Kit 对 editorInstance 内部事件的路由监听(removeInnerEventListenerAgent)。

注意:不会自动 CloseAllEditors / UnInit 各 ThinkEditor,也不会移除已挂载 DOM。页面卸载前建议业务先关闭全部文档。

接口

Destroy(): void

参数

无。

返回值

类型 说明 备注
void

事件监听

描述

ThinkEditorKit 继承 EventTarget。各 ThinkEditor 的内部事件经 ThinkEditorInstance 汇聚后,由 Kit 的 OnInnerEvent 再次 dispatchEvent 到 Kit 自身。

业务可在 Kit 上监听经 ThinkEditorInstance 汇聚后冒泡的事件(事件名见 E_EVENT_KEY)。常用 Kit 级事件见 Kit 事件

接口

kit.addEventListener(type: string, listener: EventListener): void
kit.removeEventListener(type: string, listener: EventListener): void

参数

参数名 必填 类型 说明 备注
type string 事件名 E_EVENT_KEY.closeDoc
listener function 回调 回调参数为 ThinkEditorEvent

返回值

类型 说明 备注
void

Kit 事件

描述

ThinkEditorKit 在构造时会通过 addInnerEventListenerAgent()editorInstance 上的全部 E_EVENT_KEY 事件路由到 Kit 的 OnInnerEvent,再 dispatchEvent 到 Kit 自身。业务在 LoadAsync 之后 向 Kit 注册监听即可收到多文档场景下的统一回调。

回调参数为 ThinkEditorEvent,常用字段:

字段 类型 说明
evt.type string E_EVENT_KEY 枚举值相同
evt.data ThinkEditorEventData 事件载荷
evt.data.editor ThinkEditor 触发事件的文档实例(部分事件有)
evt.data.instance ThinkEditorInstance 多文档管理器(Instance 转发时填充)
evt.data.data any 内核或 DOM 附带的扩展数据

需在业务侧从 SDK 引入 E_EVENT_KEY(如 ThinkEditor.Defined.ts / 打包后的等价导出)。

注册示例

import { E_EVENT_KEY } from "./ThinkEditor.Defined.js"; // 路径以项目为准

await thinkEditorKit.LoadAsync(container);

thinkEditorKit.addEventListener(E_EVENT_KEY.docModified, OnDocModified); // 文档内容有修改
thinkEditorKit.addEventListener(E_EVENT_KEY.instanceChange, OnInstanceChange); // 文档有增减
thinkEditorKit.addEventListener(E_EVENT_KEY.focusChange, OnDocFocusChange); // 文档中输入焦点有变化
thinkEditorKit.addEventListener(E_EVENT_KEY.drop, OnDocDropEvent); // 拖动内容到文档中
thinkEditorKit.addEventListener(E_EVENT_KEY.selectEditorChange, OnSelectEditorChange); // 文档 docTab 发生了切换
thinkEditorKit.addEventListener(E_EVENT_KEY.closeDoc, OnCloseDocRequest); // tab 的 × 被点击

function OnDocModified(evt) {
  const editor = evt.data.editor;
  // ...
}

function OnCloseDocRequest(evt) {
  // 返回 false 或调用 evt.preventDefault() 可取消 Kit 默认关页行为
  if (!confirm("关闭文档?")) {
    evt.preventDefault();
    return false;
  }
}

页面卸载或 Kit 销毁前,应对称调用 removeEventListenerDestroy() 仅移除 Kit 内部路由,不会自动移除业务监听。

常用 Kit 事件

事件名 (E_EVENT_KEY) 说明 典型触发时机 备注
docModified 文档内容有修改 内核标记文档已改 可用于脏标记、自动保存提示
instanceChange 文档实例有增减 CreateEditorAsync / CloseEditor / CloseAllEditors evt.data.instance 为当前 ThinkEditorInstance
focusChange 文档内输入焦点变化 光标/选区/元素焦点变化 editorFocus(单击进入编辑器)不同
drop 拖动内容落入文档 canvas dropdataTransfer 解析为 JSON evt.data.data 含拖放载荷;可 preventDefault 拦截默认处理
selectEditorChange 当前选中文档切换 页签点击、SelectEditor、关闭文档后自动选中上一文档 evt.data.editor 为切换后的文档
closeDoc 请求关闭文档 文档页签栏 × 点击 可取消preventDefault() 后 Kit 不执行 closeDocument;类型为 request 句柄

closeDoc 与页签关闭

页签 × 时 Kit 调用 editor.dispatchEditorRequest(E_EVENT_KEY.closeDoc, { docName }),监听方取消后不会调用 closeDocument。业务若仅监听 Kit 而未拦截,Kit 在请求未被取消时会默认关闭该文档。

与单文档 thinkEditor.addEventListener 的区别

监听对象 范围 适用场景
thinkEditorKit 经 Instance 汇聚的多文档事件 页签、脏标记、统一拖放处理
thinkEditor 仅该文档实例 单文档脚本、元素级逻辑

同一 E_EVENT_KEY 在单文档上也会触发;多文档应用推荐在 Kit 上注册上述实例级事件,避免为每个 thinkEditor 重复绑定。


配置项说明

构造函数 options / Configure(settings) 支持的主要字段:

Kit 布局

参数名 类型 默认值 说明
showToolBar boolean true 顶部工具页签栏(文件/编辑/插入/打印/视图)
showToolPanel boolean true 工具面板(Ribbon 按钮区)
showDocBar boolean true 多文档页签栏
showDocPanel boolean true 文档编辑区
toolBarAutoWrap number 1 工具面板换行:默认开启1);组内仅一行时按图标宽度换行,组内多行时整组换行(保留组内行结构);显式 0 时不换行(单行、超出裁剪)
selectToolTab string "edit" 当前选中的工具页签:file | edit | insert | print | viewLoadAsync 时作为初始页签,未配置时默认为 edit;若该页签被隐藏则回退到第一个可见页签;Configure 传入时立即切换
instanceName string “实例1” ThinkEditorInstance 标识
iconUrlPath string “/editorRes/“ 工具栏图标资源根路径
iconMap object 工具栏图标映射(Kit 层,不传 SetEditorConfig)
iconUrlMap object 工具栏图标 URL 映射(Kit 层)
fontInfoList array 编辑栏字体下拉列表(Kit 层)
hideToolBarItems string[] [] 强制隐藏的工具页签,如 ["fileBar"]
preventDefaultKeys string[] [] 工具栏快捷键拦截列表

配置分流:上表及 *Bar 页签配置仅作用于 Kit UI(this.config),不会传入 SetEditorConfig。其余字段(如 libauth)进入 editorCommonOptions,在 CreateEditorAsync 时传给编辑器。完整 Kit 键列表见源码 KIT_ONLY_CONFIG_KEYS

各工具页签(fileBar / editBar / insertBar / printBar / viewBar)

参数名 类型 说明
name string 页签显示名
items object 工具组配置;null/[] 可隐藏页签或 group
iconMap object 图标映射
iconUrlMap object 图标 URL 映射

页签/group 显隐规则见源码注释 KIT_BAR_CONFIG_KEYSisKitBarToolbarAbsent

编辑器公共项(传入 CreateEditorAsync / SetEditorConfig)

options / Configure(settings)除 Kit 专用键外的字段均合并进 editorCommonOptions(见 KIT_ONLY_CONFIG_KEYS)。

参数名 类型 默认值 说明
lib string | ArrayBuffer “/editorSdk/“ WASM 路径或二进制
fontPath string “/editorFonts/“ 字体目录
logLevel number Debug 日志级别
useInnerUI boolean true 使用内置 UI
useInnerMenuBox boolean false 内置菜单盒
auth object { mode: 0 } 授权配置
forbidCallAutoSetInputFocus boolean false 禁止接口自动 focus
forbidLocalFonts boolean 禁用本地字体
debugFont boolean 字体调试

Kit UI 常用配置示例

选中工具页签(selectToolTab

未配置时默认即为 编辑 页签,无需额外设置:

const kit = new ThinkEditorKit({ lib: "/editorSdk/" });
await kit.LoadAsync(container);
// 加载后顶部工具页签与下方面板均为「编辑」

指定其他初始页签:

const kit = new ThinkEditorKit({
  lib: "/editorSdk/",
  selectToolTab: "file", // file | edit | insert | print | view
});

若指定页签被隐藏(如 hideToolBarItems: ["fileBar"]selectToolTab: "file"),则自动回退到第一个可见页签

运行时通过 Configure 代码切换页签:

await kit.Configure({ selectToolTab: "insert" });

工具栏自动换行(toolBarAutoWrap

默认 开启1,构造时可省略)。组内只有一行时,图标按宽度自动换行;组内有多行时(如开关 + 单选两行),整组换行并保留组内行结构:

const kit = new ThinkEditorKit({
  lib: "/editorSdk/",
  // toolBarAutoWrap 默认为 1,可省略
});

关闭自动换行(单行、超出裁剪):

const kit = new ThinkEditorKit({
  toolBarAutoWrap: 0,
});
await kit.LoadAsync(container);

await kit.Configure({ toolBarAutoWrap: 0 });

Kit 配置与编辑器配置分离

构造 / Configure 时,Kit 专用项只影响 UI,不会传入 SetEditorConfig其余字段进入 editorCommonOptions,在 CreateEditorAsync 时传给编辑器内核。

const kit = new ThinkEditorKit({
  // —— Kit UI(不进 SetEditorConfig)——
  selectToolTab: "edit",
  hideToolBarItems: [],
  editBar: {
    name: "编辑",
    // items: { group1: [...] }  // 可选,覆盖部分工具组
  },
  iconMap: { /* 工具栏图标 */ },

  // —— 编辑器(进 editorCommonOptions / SetEditorConfig)——
  lib: "/editorSdk/",
  fontPath: "/editorFonts/",
  auth: { mode: 0 },
});

await kit.LoadAsync(container);

// 运行时仅更新编辑器授权(影响后续新建的 ThinkEditor)
await kit.Configure({ auth: { mode: 1, company: "xxx" } });

Kit 专用键完整列表见源码 KIT_ONLY_CONFIG_KEYS(含 showToolBareditBarfileBarselectToolTabtoolBarAutoWrap 等)。

组合示例

const kit = new ThinkEditorKit({
  lib: "/editorSdk/",
  selectToolTab: "edit",       // 默认编辑页签(可省略)
  preventDefaultKeys: ["saveDoc"], // 保存按钮交给业务处理
});

await kit.LoadAsync(document.getElementById("editor-root"));
const editor = await kit.CreateEditorAsync({
  docName: "doc1",
  showName: "新文档",
  selectEditor: true,
});
editor.NewDoc("doc1", E_DOC_TYPE.Entity);

公开属性(只读/运行时)

属性名 类型 说明
config object 合并后的 Kit 配置
editorCommonOptions object 创建 ThinkEditor 时的默认 options
editorInstance ThinkEditorInstance 多文档管理器
container HTMLElement Load 后的根容器
toolBar HTMLElement 工具页签栏
toolPanel HTMLElement 工具面板
docBar HTMLElement 文档页签栏
docPanel HTMLElement 文档编辑区

典型生命周期

new ThinkEditorKit(options)
  → await LoadAsync(container)
  → await CreateEditorAsync({ docName, showName, selectEditor: true })
  → editor.NewDoc / ParseDoc ...
  → SelectEditor(otherDocName)     // 切换页签
  → CloseEditor(docName)           // 关闭文档
  → Destroy()                      // 页面卸载

单文档 ThinkEditor 生命周期(由 Kit 内部驱动):

InitAsync → Load ↔ UnLoad(切换页签)→ UnInit(关闭文档)

文档更新时间: 2026-06-16 15:57   作者:admin