Opera在按键按下事件中阻止默认行为的方法preventDefault()

5

我正在尝试在我的Web应用程序中嵌入一些键绑定,但是在Opera浏览器中遇到了困难。我有以下代码:

window.onkeydown = function(e){
  var key = e.keyCode ? e.keyCode : e.charCode ? e.charCode : false;
  if (e.ctrlKey && key === 84) {
    alert("foo");
    e.preventDefault();
    // return false;
  }
}

在Firefox和Chrome中,它的表现非常好,但是在Opera中仍然会打开新标签页。使用return false;同样会发生这种情况。
我的信息:Opera/9.80(X11;Linux i686;U;en)Presto/2.7.62 Version/11.00
1个回答

8

Opera 不支持keydown上的preventDefault,只有在keypress上支持。

此示例所示,您应该为Opera绑定一个单独的keypress处理程序(根据您的情况进行调整):

var cancelKeypress = false;

document.onkeydown = function(evt) {
    evt = evt || window.event;
    cancelKeypress = (evt.ctrlKey && evt.keyCode == 84);
    if (cancelKeypress) {
        return false;
    }
};

/* For Opera */
document.onkeypress = function(evt) {
    if (cancelKeypress) {
        return false;
    }
};

2
感谢您帮助他,对于这个漏洞感到很抱歉 :-( - hallvors
@hallvors:不用谢,但是...你为什么要道歉呢?你在Opera工作吗? - Marcel Korpel
是的,我做到了 :)。这是困扰Web开发人员的最常见问题之一,我们应该在下一个主要版本发布之前与其他浏览器保持一致。 - hallvors
@hallvors:啊,我现在明白了。很高兴这里有Opera的人。顺便说一下,那个确实是Twitter一个可怕的浏览器嗅探决定,尤其是他们正在使用jQuery(是的,我看到了inputtextInput之间的区别)。 - Marcel Korpel
@hallvors:只有一个问题:当Opera不再存在这个错误时,我们将如何检测它?使用功能推断来检测浏览器版本,就像此处所示?甚至有一个很好的页面,准确描述了支持哪些函数。;-) - Marcel Korpel
你救了我的命。 - Muthukumar Anbalagan

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