2012-06-27 36 views
0

我有一个库,可以即时创建编辑器(http://epiceditor.com),并自动设置键快捷方式。快捷键可以在选项中进行配置,所以我不能使用e.altKeye.ctrlKey等。Stuck alt /修饰键与javascript

由于某些原因,修改键未在Mac/Ubuntu浏览器上设置回false有时

在Windows上,它似乎每次都会发生。您可以通过单击JSBin中的渲染然后按alt + p来重现此操作。你应该看到“Yay”出现。现在,如果在Windows上再按只需 p。你会看到耶再次出现。 Mac和Ubuntu用户偶尔会看到同样的问题,但很难重现。

另外请注意,这只发生在alt键似乎。下面我在16(alt)旁边有16个(换班)。如果你交换出来,它会按预期工作。

为精简测试用例的代码是:

var modKey = false; 
var modKeyCode = 18; //16 
document.body.addEventListener('keydown', function (e) { 
    if (!modKey && modKeyCode == e.keyCode) { 
    modKey = true; 
    } 

    if (modKey && e.keyCode == 80) { 
    console.log('Yay!'); 
    } 
}); 

document.body.addEventListener('keyup', function (e) { 
    if (modKey && modKeyCode == e.keyCode) { 
    modKey = false; 
    } 
}); 

演示:http://jsbin.com/uhupah/3/edit#javascript,html

回答

0

我已经想出了一个修复方法,虽然是一种蹩脚的修复方法,但仍然是一个修复方法。

我去的修复是当任何组合键成功时重置修饰符var。即一个在alt+pp按下复位modKey假像这样:

var modKey = false; 
var modKeyCode = 18; //16 
document.body.addEventListener('keydown', function (e) { 
    if (!modKey && modKeyCode == e.keyCode) { 
    modKey = true; 
    } 

    if (modKey && e.keyCode == 80) { 
    console.log('Yay!'); 
    modKey = false; //THIS 
    } 
}); 

document.body.addEventListener('keyup', function (e) { 
    if (modKey && modKeyCode == e.keyCode) { 
    modKey = false; 
    } 
}); 

本寿的问题是,你不能做背靠背键命令。大多数情况下,这是正常的,因为用户将执行诸如“保存”或“预览”之类的关键命令,再输入一些命令,然后执行另一个关键命令。但是你不能够,让我们说:alt+p s触发alt+p然后alt+s而不必放开alt键。

0

我没有在时刻访问我的Linux机器,所以我不能测试你的代码。

因此,这里更多的是一种暗示:

的Linux(在我的经验)是挑剔的,当它涉及到的键码和关键事件的顺序。也许从KEYUP与中的keydown

if (!modKey && modKeyCode == e.keyCode) { 
    modKey = true; 
} else if (modKey && modKeyCode == e.keyCode) { 
    modKey = false; 
} 

上述建议与你有没有特殊要求兼得“的keydown”和“KEYUP”假设提出结合IF(..)。

+0

同样的问题:http://jsbin.com/uhupah/4/edit - 如果我把所有的代码移动到keydown。 Windows的问题更多的是Linux或OS X,因为这些发生的频率较低。 –

+0

@OscarGodson哇!不能始终如一地重现错误确实难以解决。希望你的解决方案足以满足你的需求。 – ddtpoison777