TinyMCE 初始化后无法获取编辑器内容怎么办?
我在 Vue 项目里引入了 TinyMCE,初始化看起来没问题,但调用 tinymce.activeEditor.getContent() 时总是返回空字符串或者报错说 activeEditor 是 null,这到底是啥情况?
我试过在 setup 回调里获取,也试过加 setTimeout 延迟执行,都不行。下面是我的初始化代码:
tinymce.init({
selector: '#my-editor',
setup: (editor) => {
editor.on('init', () => {
console.log('Editor initialized');
// 这里想立刻获取内容,但失败了
});
}
});
tinymce.activeEditor,这玩意儿在编辑器还没完全ready或者有多个实例的时候根本靠不住。在 setup 回调里,editor 参数就是当前编辑器实例,直接用它就行:
另外检查一下你的 selector
#my-editor对应的 DOM 元素是否真的存在,有很多情况是容器还没渲染出来就开始初始化了。如果是在 Vue 里,更推荐把 editor 存到 ref 里,方便组件内任何地方调用:
核心就一点:别依赖全局的 activeEditor,用你手里有的 editor 对象。
问题原因
你在 init 事件回调里用
tinymce.activeEditor.getContent()是有问题的。setup 回调里的editor参数才是当前编辑器的实例,而tinymce.activeEditor是一个全局属性,指的是"当前激活的编辑器"。问题在于 init 事件触发时,这个全局的 activeEditor 可能还没被正确设置。解决方案
在 setup 的 init 回调里,直接用传入的 editor 对象就行了:
如果你需要在组件其他地方获取内容
setup 回调里只能在这个闭包内访问 editor,外部拿不到。你需要把 editor 实例保存下来:
额外提醒
Vue 项目里还有个坑要注意:如果你的组件会被重复挂载(比如路由切换),一定要在 onUnmounted 或者 beforeUnmount 里调用
editor.destroy()清理实例,否则下次初始化会出问题,activeEditor 也会指向错误的实例。还有一种情况会导致 activeEditor 为 null:你的 selector 选中的元素不存在,或者初始化失败了。你可以在 init 的配置里加个 failed 回调检查一下:
总结一下:绝大多数情况下,不是 activeEditor 有问题,而是你应该在 init 事件里用回调参数里的 editor,或者把 editor 实例保存下来再调用。