【问题标题】:Prevent default event action not working...?防止默认事件操作不起作用...?
【发布时间】:2024-05-19 04:30:02
【问题描述】:

我正在尝试在我的网站上添加键盘快捷键,以便使用键盘进行快速导航。但是,我尝试使用 Alt+X 快捷方式时遇到了一个小问题。该事件运行得很好,并按原样返回false,但无论如何都会出现浏览器的文件菜单。我也尝试过preventDefault 方法,但没有任何变化。

脚本的精简版是:

document.documentElement.onkeydown = function(e) {
    e = e || window.event;
    switch( e.keyCode || e.which) {
        // some cases here - most notably:
        case 116: // F5 key
            if( activeFrame) {
                activeFrame.contentWindow.location.reload();
                // reloads an iframe if one is active
                return false;
            }
            break;
        // more cases...
        case 88: // X key
            if( e.altKey) {
                // do something
                return false;
            }
    }
}

如上所述,覆盖 F5 键的默认操作可以正常工作 - 仅当没有 iframe 处于活动状态时,浏览器才会重新加载页面。我不太明白如何防止按下 Alt+X 时出现菜单。

【问题讨论】:

  • 我在 IE9、FF 和 Chrome 中测试了这个。只有 IE 似乎有问题。 jsfiddle.net/rQKUn/5
  • 嗯,这至少是一些解脱,但我希望有人能解决这个问题的 IE...
  • 此问题是否仅适用于alt+X,或者也适用于其他菜单快捷方式?如需快速检测 keyCode 的方法,请使用:asquare.net/javascript/tests/KeyCode.html
  • Alt+X、Alt+C、Alt+V、Alt+Space,任你选择。

标签: javascript internet-explorer events javascript-events


【解决方案1】:

实际上,我有一个使用 CTRL 快捷键的 Web 应用程序可以正常工作,但后来决定我会很聪明并使用 accesskey 属性,并在 IE 中遇到了这个确切的问题。

使用 CTRL 快捷键的问题在于,其中许多快捷键在许多应用程序中更为标准/有用(例如:剪切、复制、粘贴、全选)。

Ctrl+Alt 相当安全,但需要用户做更多的工作。

我倾向于只尝试使用 ALT 快捷键,IE 并不固执地坚持处理。

CTRL+A/CTRL+F取消成功演示: http://jsfiddle.net/egJyT/

This 的回答似乎暗示在不将 IE 置于 kiosk 模式的情况下无法禁用菜单快捷方式。

【讨论】:

  • Ctrl+Alt 是我目前正在使用的,似乎做得很好。如果没有人有办法真正登上菜单,这可能是最好的答案。
  • @RobW 我无法让任何记录的方法起作用,这证实了我以前的经验。我正在解决赏金问题。这似乎是一个半官方的“不,这是不可能的”。 answers.microsoft.com/en-us/ie/forum/ie8-windows_other/…
  • @Kolink 我会选择Shift + ctrlShift + Alt 的组合。 Ctrl+alt+... 是常用的热键组合,可能会干扰用户的预期行为。
【解决方案2】:

使用stopPropagation(e); 代替preventDefault 方法

function stopPropagation(e)
{
    e = e || event;/* get IE event ( not passed ) */
    e.stopPropagation? e.stopPropagation() : e.cancelBubble = true;
}

Reference link

另一个 SO question 提到 preventDefault 在 IE 中存在问题。

更新

按照MSDN Reference尝试使用下面的代码

event.returnValue=false;

还有来自Detecting keystrokes的一些观点

一些一般性注意事项:

  • 一般来说,Mac 的可靠性不如 Windows,有些按键检测不到。
  • Explorer 不会触发删除、结束、输入、转义、功能键、主页、插入、pageUp/Down 和 tab 的按键事件。
  • Onkeypress,Safari 为删除、结束、功能键、主页和 pageUp.Down 提供了 63200 范围内的奇怪 keyCode 值。 onkeydown 和 -up 值是正常的。
  • 在 Mac 上无法检测到 Alt、Cmd、Ctrl 和 Shift,Opera 除外。但是,您始终可以使用 altKey、ctrlKey 和 shiftKey 属性。

【讨论】:

  • 我认为在网站中使用 ALT 作为快捷键(组合)不是一个好主意(或者不确定但在 html 中不可能),即使谷歌文档的快捷方式中也没有 ALT列表。当我们创建 IE 或其他浏览器工具栏时,我们还必须首先向Get event in the toolbar 编写额外的逻辑,然后为ALT 处理按键事件。
  • Detecting keystrokes 有检测到alt 键的样本。
  • 我刚刚去测试了returnValue=false 的东西,但这似乎也没有停止菜单。
【解决方案3】:

请注意,如果您成功阻止浏览器检测到组合键,您可能会导致某些用户无法使用您的页面。许多屏幕阅读器几乎保留了您能想到的任何键来控制屏幕阅读器,如果您的页面在您添加快捷键代码之前可以使用屏幕阅读器访问,那么在您添加后可能完全无法访问用户需要屏幕阅读器.

在你在这个问题上投入太多时间之前,请阅读this article about access keys(有点旧但可能仍然相关)和this article about Reserved Keystroke Combinations

【讨论】:

  • 访问密钥也取决于浏览器,因为这个问题的问题*.com/questions/515951/…
  • 由于该网站是一个游戏,如果有的话,非图形浏览器用户可能不会经常使用它,所以我认为影响可访问性不是什么大问题。不过,感谢您的提醒,我会记住的。