我有一个网页,我想将Ctrl + N重新映射到不同的行为。我按照YUI的注册Key Listeners示例调用了我的函数,但Firefox仍然创建了一个新的浏览器窗口。事情似乎在IE7上运行良好。如何阻止新窗口显示?

示例:

var kl2 = new YAHOO.util.KeyListener(document, { ctrl:true, keys:78 },
             {fn:function(event) {
                     YAHOO.util.Event.stopEvent(event); // Doesn't help
                     alert('Click');}});
kl2.enable();

可以删除默认行为。 Google文档会覆盖Ctrl + S以保存文档,而不是显示Firefox的保存对话框。我用Ctrl + S尝试了上面的例子,但Firefox的保存对话框仍然弹出。由于谷歌可以阻止保存对话框出现,我确信有一种方法可以阻止大多数默认键盘快捷键。

有帮助吗?

解决方案

诀窍是'fn'功能很糟糕。

通过实验,您可以看到fn的函数类型有两个参数。第一个参数实际上包含事件类型。第二个包含......这很复杂:一个包含索引0处的代码点和索引1处的实际事件对象的数组。

所以稍微改变你的代码, 应该是这样的:

function callback(type, args)
{
    var event = args[1]; // the actual event object
    alert('Click');

    // like stopEvent, but the event still propogates to other YUI handlers
    YAHOO.util.Event.preventDefault(event);
}
var kl2 = new YAHOO.util.KeyListener(document, { ctrl:true, keys:78 }, {fn:callback});
kl2.enable();

另外,为了热爱lisp,请不要在代码中使用原始代码点。使用'N'.charCodeAt(0)代替“78”。或者将其作为一个函数包装起来

function ord(char)
{
    return char.charCodeAt(0);
}

其他提示

我只是在猜这里,但我认为不能这样做。

如果可能的话绝对不应该。通用键盘快捷键是你不应该搞乱的东西。下一步是什么?勾住窗口关闭按钮打开一个新窗口...

使用YUI的event util,您可以尝试使用 stopEvent 方法:

但是,因为大多数用户习惯于在浏览器中执行特定操作的那些按键(在您的示例中为新窗口),所以我总是避免冲突,这实际上意味着我不使用任何元或控制键。

我只是单独使用字母,这样就可以了,直到你有文字输入框,所以这些建议对你来说可能没那么有用。

尽管覆盖默认浏览器快捷方式并非易事,但在某些情况下,这样做是值得的,因为它可以提供更专业的应用程序外观。看一下这个脚本:

http://www.openjs.com/scripts/events /keyboard_shortcuts/index.php#disable_in_input

事实证明这对我来说很好..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top