さて、ここで遭遇するかもしれない問題の一部は、keydown はon
orではなく、off
常に火を噴くものだということです。
についても同様ですonresize
。
ウィンドウのサイズを変更すると、イベントが何度も呼び出されます。
また、JS はマルチスレッド化されていないため、一度に発生するイベントは 1 つだけです。他のイベントは、他のイベントが終了した直後に実行するためにキューに入れられます。
したがって、実際に必要なのは、1 つのイベントが設定し、もう 1 つのイベントがチェックするステート マシンです。
簡単な例:
var BrowserWindow = { width : 0, height : 0, prevWidth : 0, prevHeight : 0 };
window.onresize = function (e) {
/* set prevWidth/prevHeight, get new width/height */
};
window.onkeydown = function (e) {
if (BrowserWindow.prevWidth !== BrowserWindow.width) { /*...*/ }
};
それは機能します(ただし、画面がアクティブに引き伸ばされている場合にのみ機能します...したがって、キーが押されていて、ウィンドウの端が保持されているがドラッグされていない場合には発生しません(これにより、ブラウザがキーダウン イベントをサイズ変更よりも頻繁に発生させるとちらつきます)。
より適切な答えは、逆の方法である可能性があります。
var Keyboard = {
currentKeys : {},
previousKeys : {}
};
window.onkeydown = function (e) { Keyboard.currentKeys[e.keyCode] = true; };
window.onkeyup = function (e) { delete Keyboard.currentKeys[e.keyCode]; };
window.onresize = function (e) {
var key = <X>,
state = "";
state = Keyboard.currentKeys[key] && !Keyboard.previousKeys[key]
? "pressed"
: !Keyboard.currentKeys[key] && Keyboard.previousKeys[key]
? "released"
: Keyboard.currentKeys[key] && Keyboard.previousKeys[key]
? "held"
: "off";
Keyboard.previousKeys = Keyboard.currentKeys;
doSomething(state);
};
これは、アーキテクチャの観点からは完全ではありませんが、別の環境で何をしなければならないかという考えに沿っています。