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

4

我有一个网页,想要将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可以阻止保存对话框弹出,我相信有一种方法可以防止大多数默认键盘快捷键。

4个回答

7
技巧在于 '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();

另外,请不要在代码中使用原始的代码点,使用'N'.charCodeAt(0)代替"78"。或将其封装为函数。

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

0

我只是猜测,但我认为这是不可能完成的。

如果可能的话,它绝对不应该这样做。通用键盘快捷键是你不应该去干扰的东西。接下来呢?将窗口关闭按钮钩到打开一个新窗口...


可以实现。尝试使用Google文档。他们覆盖了Ctrl+S以保存文档,而不是保存页面。我尝试覆盖Ctrl+S作为测试,但是保存对话框弹出了。 - Cristian
真遗憾。我不是说在这种情况下谷歌功能不好,但我仍然认为默认的快捷键功能不应该被更改。 - Gene

0

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

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

我只使用字母,直接输入即可,但这种方式会对文本输入框产生影响,所以这个建议可能对您没有那么有用。


0

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