【问题标题】:jQuery keypress .val() returns previous value after function runsjQuery keypress .val() 在函数运行后返回先前的值
【发布时间】:2013-06-30 18:20:26
【问题描述】:

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

这个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;

});

【问题讨论】:

  • 谢谢,但两者都不起作用。
  • 您需要改用keyup。查看文档以了解两者之间的差异。
  • @Zenith 谢谢!实际上我才意识到这一点,但仍然对 keypress 和 keydown 不起作用的原因感兴趣

标签: jquery


【解决方案1】:

简答

改用.keyup() 事件

原因如下

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

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

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

希望这能澄清一点!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      例如:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 2011-09-20
        • 2020-04-05
        • 1970-01-01
        相关资源
        最近更新 更多