2015-09-15 18 views
0

我有一个应用程序3键盘快捷键。他们只被解雇,如果重点是网格行内,所以我添加了一个监听器来处理这个问题:Javascript中的多个热键代码

if (grid) { 
    var host = grid.hostElement; 
    //handle the keydown event 
    host.addEventListener('keydown', function (e) { 
     if (e.altKey && e.key == "q") { 
      doSomething(grid); 
     } 

     if (e.altKey && e.key == "n") { 
      doSomethingElse(grid); 
     } 
     if (e.altKey && e.key == "u") { 
      doAThirdThing(grid); 
     } 
    }); 

} 

这是工作的罚款,但是这是处理这一最有效的方式,从性能观点?我应该使用交换机还是多个监听器?

+0

我建议你在代码审查发布此过:http://codereview.stackexchange.com/ – Halcyon

+0

什么样的性能改进,你一直在想什么?你可以通过'if'块早日重新节省一个纳秒或两秒... – Teemu

+1

你可以使用一个Object来存储'key => handler'映射。 – fuyushimoya

回答

4

的几个问题,跨浏览器的兼容性让你的键码用:

var key = e.which || e.keyCode; 

支持所有浏览器。其次,e.key没有很好的浏览器支持(https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)。尽管它表示e.key在Chrome 45.0中受支持,但我在45.0.2454.85米中将其视为未定义。 这里是一个另类:

host.addEventListener('keydown', function (e) { 
     var key = e.which || e.keyCode; 
     if(e.altKey){ 
      switch(key){ 
       case 81: 
        // "q" 
        doSomething(grid); 
        break; 
       case 78: 
        // "n" 
        doSomething(grid); 
        break; 
       case 85: 
        // "u" 
        doSomething(grid); 
        break; 
      } 
     } 
    }); 
1

您可以使用一个开关case语句为你总是检查e.altKey是相同的值。就像这样:

if (grid) { 
    var host = grid.hostElement; 
    //handle the keydown event 
    host.addEventListener('keydown', function (e) { 
     if (e.altKey){ 
      switch(e.key){ 
       case "q": 
        doSomething(grid); 
       break; 

       case "n": 
        doSomethingElse(grid); 
       break 

       case "u": 
        doAThirdThing(grid); 
       break; 
      } 
     } 
    }); 
} 

想想值e如在一个罐子里饼干,并与每一个if语句,你把你的手在罐子里,检查饼干是什么,然后将其放回瓶子。这发生在每个有条件的IF语句上,这不是很有效。

如果使用switch语句是一样得到了饼干罐子和保持它在你的手 - 你可以更快地检查其属性的饼干和任何。

了解更多关于这里的switch语句: http://www.w3schools.com/js/js_switch.asp

+0

这种我在想什么,只是不知道该如何设置开关。 – alemus

+0

没问题,希望我以一种可以从表演pov理解的方式解释这一点。 – dj10dj100