2012-06-27 35 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