在YUI中防止键侦听器中的默认行为

时间:2020-03-06 15:03:59  来源:igfitidea点击:

我有一个网页,我想将Ctrl + N重新映射到其他行为。我遵循了YUI的注册键侦听器的示例,并调用了我的函数,但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的"保存"对话框仍然弹出。由于Google可以阻止出现保存对话框,因此我敢肯定有一种方法可以阻止大多数默认键盘快捷键。

解决方案

我只是在这里猜测,但我不认为这是可以做到的。

如果可能的话,绝对不应该。通用键盘快捷键是我们不应弄混的东西。下一步是什么?钩上窗口关闭按钮以打开新窗口...

使用YUI的事件工具,我们可以尝试使用stopEvent方法:

但是,由于大多数用户习惯于在浏览器中执行特定功能的按键(在示例中为新窗口),因此我始终避免冲突,这实际上意味着我不使用任何meta键或者控制键。

我只是单独使用字母,这很好,直到我们有文本输入框为止,因此这条建议对我们可能没有太大用处。

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

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

事实证明对我来说很好。

诀窍是" 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);
}