防止默认事件行为不起作用...?

8

我正在尝试在我的网站上添加键盘快捷键,以便使用键盘进行快速导航。然而,当我尝试使用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出现了问题。http://jsfiddle.net/rQKUn/5/ - mrtsherman
好吧,至少有些安慰,但我希望有人能够解决IE的这个问题... - Niet the Dark Absol
这个问题只适用于 alt+X,还是适用于其他菜单快捷键?要快速检测 keyCode 的方法,请使用:http://asquare.net/javascript/tests/KeyCode.html - Rob W
Alt+X,Alt+C,Alt+V,Alt+Space,等等。 - Niet the Dark Absol
3个回答

4

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

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

参考链接

另一篇SO问题提到,preventDefault在IE中存在问题。

更新

根据MSDN参考资料,尝试使用以下代码。

event.returnValue=false;

以下内容来自 “检测按键”

一些常见的注意事项:

  • 通常来说,Mac比Windows不太可靠,并且某些按键无法被检测到。
  • 在Internet Explorer中,删除、结束、回车、ESC、功能键、首页、插入、上/下一页以及制表符都无法触发keypress事件。
  • 在Safari中,delete、end、功能键、home和pageUp.Down会产生奇怪的keyCode值(在63200区间)。而onkeydown和onkeyup的值是正常的。
  • 除了在Opera中可以检测到Alt、Cmd、Ctrl和Shift之外,Mac无法检测到这些键。但可以始终使用altKey、ctrlKey和shiftKey属性。

我认为在网站中使用 ALT 作为快捷键组合不是一个好主意(或者说不确定是否在 HTML 中可行),即使 Google 文档也没有将 ALT 列入其快捷键列表。而且,当我们创建 IE 或其他浏览器工具栏时,我们还必须先编写额外的逻辑来“获取工具栏中的事件”,然后再处理 ALT 的按键事件。 - Harsh Baid
检测按键的示例程序可以检测到 alt 键。 - Harsh Baid
我刚刚测试了returnValue=false的事情,但似乎这也无法停止菜单。 - Niet the Dark Absol

3

我之前使用CTRL快捷键在一个Web应用程序上完美地工作,但后来决定聪明地使用accesskey属性,并遇到了IE的这个确切问题。

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

Ctrl+Alt相对安全,但需要用户付出更多努力。

我倾向于尝试坚持IE不会固执地处理的ALT快捷键。

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

这个答案似乎暗示着除非将IE放入kiosk模式,否则无法禁用菜单快捷键。


Ctrl+Alt 是我目前使用的,看起来效果不错。如果没有人有一种真正置顶菜单的方法,这可能是最好的答案。 - Niet the Dark Absol
1
@RobW我无法让任何已记录的方法工作,这证实了我的先前经验。 我正在回应赏金评论。 这似乎是一种半官方的“不可能”。http://answers.microsoft.com/en-us/ie/forum/ie8-windows_other/how-do-i-disable-ie-assigned-alt-ctrl-keys/3e24800d-06f8-41ac-818a-bc1670bcc47c - Kevin Stricker
@Kolink 我会选择 Shift + ctrl 或者 Shift + Alt 的组合键。Ctrl+alt+... 是一个常用的热键组合,可能会干扰用户的预期行为。 - Rob W

1

请注意,如果您成功地防止浏览器检测到某个键组合,可能会使您的页面对某些用户无法使用。许多屏幕阅读器已经保留了几乎所有您可以想到的键来控制屏幕阅读器,如果您的页面在添加快捷键代码之前可以使用屏幕阅读器进行访问,则在添加后需要屏幕阅读器的用户可能完全无法访问。

在解决此问题之前,请阅读有关访问键的文章(有点旧但可能仍然相关),以及有关保留按键组合的文章


访问键也取决于浏览器,就像这个问题所述:https://dev59.com/3UbRa4cB1Zd3GeqP0nUb - Harsh Baid
由于该网站是一个游戏,非图形浏览器用户可能不会经常使用它,如果有的话,因此我认为影响可访问性并不是太大的问题。谢谢提醒,我会记住的。 - Niet the Dark Absol

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