是否可以在调整窗口大小时监听keydown和keyup

时间:2012-10-02 16:26:30

标签: javascript jquery javascript-events keypress window-resize

我正在尝试检测keydown和keyup,同时正在调整窗口大小。到目前为止我尝试过,只有在调整大小完成后才会触发关键事件

$(window).resize(function(){
    console.log("resizing");    
});

$(window).keydown(function(e){
    $("#key").css("background","green");
});

$(window).keyup(function(e){
    $("#key").css("background","red");
});

1 个答案:

答案 0 :(得分:1)

好吧,你可能遇到的部分问题是keydown不是onoff这个问题,它常常是火灾。
onresize也是如此。

当您调整窗口大小时,事件会一遍又一遍地被调用 此外,由于JS不是多线程的,因此这些事件中只有一个会同时发生。 在另一个事件结束后,另一个事件将排队等待立即运行。

所以你真正想要的是一个事件设置的状态机,另一个事件检查。

快速举例:

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) { /*...*/ }
};

那会起作用(除了它只能在屏幕被主动拉伸时才有效...所以在按键关闭且窗口边缘被保持但未被拖动的情况下不会发生这种情况(如果浏览器比调整大小更频繁地触发keydown事件,则可能导致闪烁。

更合适的答案可能是另一种方式:

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);
};

从架构的角度来看,这并不完美,但更多的是在另一个环境中你必须做的事情。