jQuery在keydown之后等待keyup

时间:2012-10-21 23:03:39

标签: javascript jquery keydown keyup

我想在按下键后触发一次事件,只有在向下箭头键释放后触发另一个事件,如下所示:

$('body').keydown(function (e)
{
    if(e.keyCode==40)
    {
        //do something
    }
    $('body').keyup(function (d)
    {
        if(d.keyCode==40)
        {
            //do something else
        }
    }
}

此代码仅部分起作用。当按住向下箭头键时,将持续触发keydown。

我有一个setInterval,当我按住箭头键时,我的刷新率正在改变。不幸的是,在这种情况下,setTimeOut不是一个选项。

所以我的代码看起来像这样:

        clearInterval(interval);
        refresh = 100;
        interval();

4 个答案:

答案 0 :(得分:1)

$('body').keydown(function (e) {
    if(e.keyCode==40) {
        //do something
    }
    return false;
})
.keyup(function(e) {
    if(e.keyCode==40) {
        //do something else
    }
    return false;
});


$('body').on('keyup', function (e) {
    if(e.keyCode==40) {
        //do something
    }
    // after first keyup set to handle next keydown only once:
    $(this).one('keydown', function(e) {
        if(e.keyCode==40) {
            //do something else
        }
    });
});

如果您需要完全触发该事件,并且未处理,则需要使用$.trigger()方法。

答案 1 :(得分:1)

如果您只想在按键保持按下时执行一次操作,只需跟踪:

var arrowKeyDown = false;

$('body').keydown(function(e) {
    if (e.which == 40 && !arrowKeyDown) {
        arrowKeyDown = true;
        // ...
    }
});

$('body').keyup(function(e) {
    if (e.which == 40) {
        arrowKeyDown = false;
    }
});

演示:http://jsfiddle.net/utfwQ/

答案 2 :(得分:0)

$('body').keydown(function (e)
{
    console.log('down');
}​).keyup(function(e){console.log('up')});​​​​

答案 3 :(得分:0)

如果你真的需要在完成后删除keyup监听器, http://jsfiddle.net/CgmCT/

document.body.addEventListener('keydown', function (e) {
    if(e.keyCode === 40){
        console.log('key 40 down');
        // key down code
        document.body.addEventListener('keyup', function listener(d){
            if(d.keyCode === 40){
                document.body.removeEventListener('keyup', listener, true);
                console.log('key 40 up');
                // key up code
            }
        }, true);
    }
}, true);​