防止在浏览器中使用ctrl+z

Preventing ctrl+z in browser

本文关键字:ctrl+z 浏览器      更新时间:2023-09-26

我使用下面的代码示例禁用ctrl + cctrl + v,它可以工作。我使用类似的机制禁用ctrl + z(撤消)在浏览器中,但它不起作用。

var ctrlDown = false;
var ctrlKey = 17, vKey = 86, cKey = 67, zKey = 90;
$('body').keydown(function(e) {
  if (e.keyCode == 17 || e.keyCode == 91) {
    ctrlDown = true;
  };
}).keyup(function(e) {
  if (e.keyCode == 17 || e.keyCode == 91) {
    ctrlDown = false;
  };
});
$("body").keydown(function(e){
  if ((ctrlDown && e.keyCode == zKey) || (ctrlDown && e.keyCode == vKey) || (ctrlDown && e.keyCode == cKey)) {
    e.preventDefault();
    return false;
  }
});

我可以从测试中看到,如果条件在你的$("body")。Keydown处理器没有触发。虽然ctrlDown确实被设置为true,但由于某种原因,您的一系列条件没有触发。我不认为在全局作用域中存储键代码和ctrl状态将是一个很好的方法。

比起单独的处理程序来测试ctrl的使用,在"z"键下处理程序中测试是否使用ctrl(或Meta命令,也要与mac兼容)会更容易。在这种情况下,event对象具有布尔属性ctrlKeymetaKey。所以你的代码应该是:

$("body").keydown(function(e){
  var zKey = 90;
  if ((e.ctrlKey || e.metaKey) && e.keyCode == zKey) {
    e.preventDefault();
    return false;
  }
});

这仍然不是很健壮,因为你只想在Mac上检查metaKey,在Linux/Windows上检查ctrl来处理一些边缘情况,有人可能会按"Meta + Z"(这在Windows中有什么用吗?),但它很接近。它可以在我的Mac上运行。


谨慎和;您可能已经考虑过这一点——禁用操作系统级别的键盘快捷键是非常危险的。它以一种糟糕的方式扰乱了用户的期望。如果你在一个大的浏览器应用程序中重写类似的东西,这是完全合理的。小心!