2015-08-22 114 views
2

我使用的代码示例下面以禁用CTRL + ÇCTRL + v和它的工作原理。我使用了类似的机制来禁用浏览器中的ctrl + z(撤销),但它不起作用。防止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; 
    } 
}); 
+2

此代码可防止在我的测试中使用Ctrl + Z,Ctrl + C和Ctrl + V。 http://jsfiddle.net/xg3z2p5o/ –

+6

这是什么意思?您的代码不会使*编辑*菜单消失,因此这些操作都不会被禁用。你只是在讨厌你自己。 –

+0

对于同一个事件使用多个处理程序没有任何意义,或者是 – charlietfl

回答

0

我可以从测试中看到,$(“body”)。keydown处理程序中的if条件未触发。虽然ctrlDown确实设置为true,但出于某种原因,您的系列条件并未触发。我不认为在全局范围内存储关键代码和ctrl状态将是一个很好的方法。

而不是一个单独的处理程序测试ctrl使用情况,只是在“z”keydown处理程序中测试是否正在使用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来处理一些边缘情况下,有人可能会按“元+ Z”(这是否在Windows中做任何事情?),但它很接近。它适用于我的Mac。


一个caution-你可能已经考虑过这个-,禁用操作系统级的键盘快捷键可真危险&。它以糟糕的方式混淆了用户的期望。如果你压倒性地在大型浏览器应用程序中做类似的事情,那么这很合理。小心!