jQuery keypress .val()在函数运行后返回先前的值

时间:2013-06-30 18:20:26

标签: jquery

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

这个keydown / keypress函数只返回前一个值(即第一次没有返回,第二次返回第一个值,第三次返回第二个值等等)

http://jsfiddle.net/ZRPfb/

有人可以告诉我为什么 keydown keypress 不起作用,但 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;

});

3 个答案:

答案 0 :(得分:8)

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

让我向你展示一下。当您在按键上执行.preventDefault()时,会发生什么?不会插入该字符。后面的代码添加角色,然后运行preventDefault()并删除角色,这是逻辑吗?我不这么认为,这就是为什么函数在添加字符之前运行。

它将与.keyup()一起使用,因为已添加该字符。

希望澄清一点!

答案 1 :(得分:3)

我查了一下这个链接。使用'keyup'事件。有用。这是因为当您使用keydown或keypress事件时,事件函数会在更新输入标记的值之前运行,因为它是keydown。如果您按键一次尝试代码,那么您将看到该功能立即运行。但是在keyup上,函数将在密钥发布和更新后运行。

答案 2 :(得分:0)

这只是Karl-André Gagnon's答案的附加内容。是的,这是因为执行顺序。因此,请使用keyup事件而不是keypress来解决此问题。

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

例如:

$(document).on('keypress', 'input.selectorclass', function(e){
    var that = this;
    setTimeout(function() { 
        console.log($(that).val());
    }, 1);
});