【发布时间】:2018-01-17 22:42:22
【问题描述】:
为了提供上下文,我的团队正在浏览器中构建一个富文本编辑器,它需要在会话之间将状态持久化到服务器。编辑器的状态显然可以从包含 keydown 事件的文档的更新中改变,但我们还应该考虑由撤消/重做事件触发的编辑器阶段的更新。
很遗憾,浏览器没有本机撤消/重做事件 (ref)。除了禁用上下文菜单之外,一个提议的hack 似乎是停止传播映射到撤消的键盘快捷键的keydown 事件。 然而,这仍然让用户在应用程序的菜单栏中直接导航到Edit -> Undo,这将直接触发document.execCommand('undo') 而不会触发事件。结果,我们不知道向服务器发送更新。
这是关于此问题的 W3C thread。在撰写本文时,似乎仍在制定解决方案...
当另一个浏览器文本编辑器Quill 遇到这个问题时,他们的团队似乎advise:“禁用本机撤消/堆栈”,这就是Facebook 的Draft.js 实际上does。鉴于这似乎是我们正在使用的,有没有人知道一种方法来禁用/替换浏览器的本机撤消/重做堆栈?显然,这是一种激进的解决方案,但在撰写本文时,这似乎是唯一的选择。
与此同时,这个问题的答案可能隐藏在 Draft 代码的某个地方。如果没有人击败我的团队,我会报告 Draft 似乎在做什么。认为至少值得记录这个问题。
【问题讨论】:
标签: javascript dom events dom-events undo