我正在尝试使用 Javascript 和 JQuery 检测表单输入的值何时发生变化。不幸的是,我发现 JQuery 是$(elem).change()不够的,因为它只在elem失去焦点时触发更改事件。我必须立即知道表单输入值何时发生变化。为此,我将与输入值可能更改相关的事件范围缩小到keyup、paste、cut、undo和redo。但是,javascript 和 JQuery 似乎都没有处理撤消或重做的方法。
var onChange = function ()
{
alert('Checking for changes...');
};
$(this).off('keyup').on('keyup', onChange);
$(this).off('paste').on('paste', onChange);
$(this).off('cut').on('cut', onChange);
$(this).off('undo').on('undo', onChange); // undo ?
$(this).off('redo').on('redo', onChange); // redo ?
Run Code Online (Sandbox Code Playgroud)
我在 Javascript/JQuery 中搜索了撤消/重做事件,但没有找到任何有用的信息。有人可以帮助处理撤消/重做事件吗?
为了提供上下文,我的团队正在浏览器中构建一个富文本编辑器,它需要在会话之间将状态保存到服务器。编辑器的状态显然可以从包含 keydown 事件的文档更新中更改,但我们还应该考虑由撤消/重做事件触发的编辑器阶段的更新。
不幸的是,浏览器没有本机撤消/重做事件(参考)。一项提议的黑客似乎是除了禁用上下文菜单之外,还停止传播映射到撤消键盘快捷键的按键事件。然而,这仍然为用户提供了直接导航到Edit -> Undo应用程序菜单栏的能力,这将直接触发document.execCommand('undo')而不触发事件。因此我们不知道要向服务器发送更新。
这是关于此问题的W3C线程。截至撰写本文时,解决方案似乎仍在制定中......
当另一个浏览器文本编辑器Quill遇到这个问题时,他们的团队似乎建议:“禁用本机撤消/堆栈”,这正是 Facebook 的Draft.js实际所做的。鉴于这似乎是我们正在处理的问题,有谁知道如何禁用/替换浏览器的本机撤消/重做堆栈?显然,这是一个积极的解决方案,但是,在撰写本文时,这似乎是唯一的选择。
与此同时,这个问题的答案可能隐藏在草案代码的某个地方。如果没有人击败我的团队,我会报告选秀的情况。认为至少值得记录这个问题。