【问题标题】:Disable Undo and Redo in browsers在浏览器中禁用撤消和重做
【发布时间】:2013-05-16 02:23:38
【问题描述】:

我想在所有使用 JavaScript 的浏览器中禁用撤消和重做。我想这样做,因为我们的应用内置了自己的撤消和重做历史记录。

我已经可以通过键盘输入来处理按键以禁用撤消和重做,但我也想禁用菜单项。 (标准菜单和右键菜单)

这可能吗?即使只有在某些浏览器中才有可能,但总比没有好。

【问题讨论】:

  • 我知道的唯一方法是检测字段中的更改并检查它是否不是由键盘输入、剪切/粘贴或您自己的脚本引起的,然后假设它是撤消/重做功能。据我所知,没有有效的事件处理程序来捕获撤消/重做事件,所以(如果你真的需要它)这可能是唯一的选择。

标签: javascript cross-browser undo-redo


【解决方案1】:

我知道这是旧的,但对于其他好奇的人来说,这对我有用。

$(window).bind('keydown', function(evt) { 
  if((evt.ctrlKey || evt.metaKey) && String.fromCharCode(evt.which).toLowerCase() == 'z') {
    evt.preventDefault();
  }
});

【讨论】:

  • 这真的“也禁用菜单项。(标准菜单和右键菜单)”?即它是否会阻止鼠标右键单击上下文菜单中的“撤消”选项?
  • 是的,您可能还想禁用上下文菜单。但是,我仍然很好奇当用户导航到应用程序菜单的 Edit -> Undo 选项时,您将如何停止传播事件?
  • 除了 Ctrl-z 之外,还应捕获 Ctrl-Shift-z 和 Ctrl-y 组合
【解决方案2】:

您可以做的一件事是拦截 popstate 事件。不幸的是,我认为它不能被取消,所以你必须通过添加一个虚拟状态来撤销它。

以下代码阻止我按回 Chrome 和 FF。随意在其他浏览器上进行测试。

window.setTimeout(function(){
  window.history.pushState({}, '', '#');
  window.addEventListener("popstate", function() {
    window.history.pushState({}, '', '#');
  });
},1000);

确保根据您自己的历史记录适当更改您的代码。 还可以考虑使用 HTML5 History API 而不是您自己的历史实现。

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

【讨论】:

  • 我不相信这个问题是在询问关于改变历史状态的问题,而是与 contentEditable 元素中的撤消/重做有关。
【解决方案3】:

无法使用浏览器 API。但是有几种方法可以检测或处理方法。 url 散列是处理后退或前进事件的一种方法。但是,出于用户安全考虑,浏览器不支持此功能。您可以搜索 javascript url 哈希脚本,但不要忘记与 html5 浏览器兼容的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2012-01-22
    • 2014-08-06
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多