0

我想在按下键后触发一个事件,仅在释放向下箭头键后触发一个不同的事件,如下所示:

$('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

4 回答 4

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()方法。

于 2012-10-21T23:10:57.767 回答
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/

于 2012-10-21T23:16:29.540 回答
0
$('body').keydown(function (e)
{
    console.log('down');
}​).keyup(function(e){console.log('up')});​​​​
于 2012-10-21T23:12:58.857 回答
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);​
于 2012-10-21T23:17:47.290 回答