6

我有一个奇怪的问题,我似乎无法弄清楚:

这个keydown/keypress函数只返回前一个值(即第一次什么都不返回,第二次返回第一个值,第三次返回第二个值,等等...)

http://jsfiddle.net/ZRPfb/

有人能告诉我为什么keydownkeypress不起作用,但keyup起作用吗?

 $(".modal-body #rowDownload").unbind().on('keypress',function(){
    var numRows = $(".modal-body #rowDownload").val();
    // var numRows = $(this).val();
    alert(numRows);

    if (typeof numRows !== 'number') return;

});
4

3 回答 3

9

简短的回答

改用.keyup()事件

这就是为什么

这是 javascript 的正常行为。您在按键上调用的函数在添加值本身之前正在运行。

让我给你演示一下。当你.preventDefault()在按键上做时,会发生什么?不会插入字符。后面的代码添加字符然后运行preventDefault()并删除字符是否合乎逻辑?我不这么认为,这就是函数在添加字符之前运行的原因。

它将起作用,.keyup()因为已经添加了角色。

希望这能澄清一点!

于 2013-06-30T18:36:08.640 回答
3

我已经检查了链接。使用“keyup”事件。有用。这是因为当您使用 keydown 或 keypress 事件时,事件函数在输入标签的值更新之前运行,因为它是 keydown。如果您通过按键一段时间来尝试代码,那么您将看到该功能立即运行。但是在 keyup 上,该功能将在密钥被释放和更新后运行。

于 2013-06-30T18:30:17.290 回答
0

这只是一个插件来Karl-André Gagnon's回答。是的,这是因为执行顺序。所以使用keyup事件而不是keypress来解决这个问题。

如果您坚持使用按键来执行此操作,则可以在很短的时间间隔后在超时内运行剩余的代码。

例如:

$(document).on('keypress', 'input.selectorclass', function(e){
    var that = this;
    setTimeout(function() { 
        console.log($(that).val());
    }, 1);
}); 
于 2020-07-21T09:37:31.100 回答