在YUI中防止键侦听器中的默认行为
我有一个网页,我想将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); }