禁用Internet Explorer快捷键

7
有没有可能禁用浏览器的快捷键?
因为应用程序中使用了许多快捷键。例如,使用Ctrl+p,我不想让浏览器弹出打印窗口。最近等待一段时间后仍未得到答复,我决定现在只对IE进行快捷方式禁用操作。是否有可能通过vbscript禁用IE快捷键访问菜单/打印等功能?

你成功让它工作了吗?我也遇到了同样的问题,但还没有找到解决方案。 - Diana Amza
@DianaAmza,我找不到这个问题的解决方案。IE 不允许你覆盖默认行为。 - Ramiz Uddin
6个回答

4

是的,你可以使用JavaScript监听各种键盘组合,并禁用默认行为。甚至有一个库可以使用和测试这里。我刚刚在Google Chrome和Firefox中使用它们的演示文本区域进行了测试,它可以按照你想要的方式工作。

shortcut.add("Ctrl+P",function() {
    return;
});

这在我上面列出的浏览器中运作正常,但IE在某些情况下不允许你覆盖默认行为。

在IE中,你唯一的选择是使用类似以下内容来完全禁用Ctrl键:

document.onkeydown = function () { 
  if (event.keyCode == 17) alert('Ctrl Key is disabled'); 
};

这并不是理想的情况,也可能不是您想要的,但它可以工作。


按下 Ctrl+P 可以打开打印窗口 :( - Ramiz Uddin
我刚刚尝试使用下面的“实时执行”面板,将快捷键从“Ctrl+Shift+X”更改为“Ctrl+P”,它显示了打印窗口。这意味着浏览器仍在监听按键。我正在使用Firefox 3。 - Ramiz Uddin
1
有些操作是无法禁用的。 - Boldewyn
我正在调用一个警告窗口,当我这样做时,会弹出一个带有警告消息“你好”的打印窗口。以下是脚本: shortcut.add("Ctrl+P",function() { alert("你好"); return; }); - Ramiz Uddin
感谢Keith的帮助。我尝试了shortcut.js,一开始看起来很好,但经过彻底测试后,我发现了一些问题,比如:Alt+M被触发,IE命令菜单也出现了。我必须禁用一些IE快捷键。其中一些是:Ctrl+P(正常工作)和Alt+M(被触发,但同时打开命令菜单的主页菜单)。如果您禁用了命令菜单,请先启用它以查看此问题。 - Ramiz Uddin

3

有一个不错的技巧可以应对IE10+,避免显示浏览器菜单在按下alt键组合时,比如Alt + FAlt + H ...

我最近在IE11上使用了这个技巧,只需在body元素上添加一个带有属性accesskey[yourKey]的锚点即可。

<body>
   <a href="#" accesskey="f"></a>
   <script type="text/javascript">
    window.onkeydown = function(e){
          console.log(e.keyCode + " alt: " + e.altKey);
          e.preventDefault();
    };
    window.onkeyup = function(e){
          console.log(e.keyCode + " alt: " + e.altKey);
          e.preventDefault();
    };
   </script>
</body>

现在当你按下Alt + f时,浏览器不会像往常一样显示“文件弹出窗口”,而是让keydown和keyup事件传递给你,而不仅仅是keydown。

3
你可以尝试为keydown事件创建一个事件处理程序,检查keyCode并在需要时阻止其默认操作。但是,这在所有浏览器中都不起作用。
Firefox的示例(取消“打印”快捷键,已验证):
document.addEventListener("keydown", function(oEvent) {
    if (oEvent.keyCode == 80 && oEvent.ctrlKey)
        oEvent.preventDefault();
}, false)

谢谢Sergey。有没有类似IE的东西的想法? - Ramiz Uddin
不,我想没有办法阻止IE中的快捷键。但是尝试这样做真的有意义吗?用户仍然可以通过访问菜单来打印或粘贴文本。 - Sergey Ilinsky
我需要禁用一些按键并将它们用于其他目的。实际上,这是一个要求,因为该系统最初是在桌面上编写的,现在正在转移到Web上。在这个转换的第一阶段,他们希望用户拥有相同的体验。他们经常使用某些按键进行某些操作,而ctrl + p是其中之一。 - Ramiz Uddin
太好了,那么我想你的用户过去习惯使用Ctrl+P进行打印,所以让他们继续使用这种方式吧。 - Sergey Ilinsky
如果应用程序用户需要通过应用程序打印,他会假定并点击打印屏幕按钮 :) 这是在桌面上的工作方式,也是它应该的工作方式。你可以说我们只是将它们从一个平台移动到另一个平台,而没有对用户体验进行任何练习,因为他们不希望用户在日常操作中感受到任何差异。 - Ramiz Uddin

1

我正在处理类似的问题,钩取键盘事件 下面的代码可以很好地禁用,但是在IE上的Flash对象没有获得焦点。由于我正在尝试处理Flash对象上的键盘事件,所以这段代码对我无效。

function hookKeyboardEvents(e) {
    // get key code
    var key_code = (window.event) ? event.keyCode : e.which;

    // case :if it is IE event
    if (window.event)
    {
        if (!event.shiftKey && !event.ctrlKey) {
            window.event.returnValue = null;
            event.keyCode = 0;
        }
    }
    // case: if it is firefox event
    else
        e.preventDefault();
}

window.document.onkeydown = hookKeyboardEvents;

这段代码可以阻止所有按键,仅适用于火狐浏览器。 - Oki
你传递的是“e”,而不是“event”。所以改变所有对“window.event”的引用或使用“e”。它们应该是相同的。 - Derek Wade

1

在您的应用程序中,在按下Ctrl+P后调用该方法后,将键码设置为零。我认为这将解决您的问题...

window.event.keyCode=0;

这将把按键码设置为零。因此,当浏览器检查按键码时,它将为零。因此默认函数将不会执行...

尝试一下...只是一个建议。


0
这在IE 8中对我有效。重要的是IE需要将ev.returnValue设置为false。注意:只有在文档上有焦点的情况下才能起作用...也就是说,如果你只是加载页面然后按下'ctrl-p',你会看到打印对话框。但是如果你在页面上点击某个地方,然后再尝试一下,它应该会抑制打印对话框。
document.onkeydown = function (e) { 

    var ev = e||window.event; 

    // Do what I want keys to do ...

    // Block browser short cuts
    if(ev.preventDefault) // non-IE browsers
        ev.preventDefault();
    else  // IE Only
        ev.returnValue = false;
};

1
你真的测试过这个吗?因为它似乎在IE9中无法工作。 - Paul
是的,我已经在生产中使用了很多年,它运行良好。然而,可能是我忘记在上面传递“e”参数了。我刚刚编辑了它。我还添加了一条注释,说明此解决方案仅在文档具有焦点时才起作用。如果页面没有焦点,则会出现打印对话框。我认为没有任何绕过这个问题的方法。 - cakidnyc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接