【问题标题】:jQuery keyboard eventsjQuery 键盘事件
【发布时间】:2011-04-01 23:30:54
【问题描述】:

使用 jQuery,我想捕获一个键盘事件:

  • 用户从按键上抬起手指之前
  • 键盘事件中的字符已经注册到输入框中。

为了澄清,请查看example。当keypress 触发时,input 的值尚未更新。

[编辑]

显然我不清楚我需要什么。

该函数必须用户从按键上抬起手指,但按键的字符被放入输入框之后调用。所以以下方法不起作用:

  • keydown:keypress事件时,文本框中的值没有更新
  • keypress:keypress事件时,文本框中的值没有更新
  • keyup:当用户抬起手指时调用,但为时已晚。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以使用input 事件,该事件适用于所有主流浏览器的最新版本:

    var input = document.getElementById("your_input_id");
    input.oninput = function() {
        alert(input.value);
    };
    

    不幸的是,它在 IE value 属性上使用 propertychange 事件:

    input.onpropertychange = function() {
        if (window.event.propertyName == "value") {
            alert(input.value);
        }
    };
    

    所以常规 JavaScript 回答者 @Andy E 在他的博客上详细介绍了这一点:https://web.archive.org/web/20140626060232/http://whattheheadsaid.com/2011/10/update-html5-oninput-event-plugin-for-jquery

    【讨论】:

    • 太棒了,我以前从未见过这个活动,但它非常有效!
    • @franzlorenzon:是的,Andy 的博客似乎坏了。我会给他发消息。
    • 如果以编程方式更改输入会怎样?有没有办法捕捉到这种变化? (例如:输入是只读的,只能通过一些 javascript 代码进行更改 - 如何捕捉这种更改?)
    • 请更新或删除该博客链接,它会重定向到垃圾邮件发送者网站。
    • @Maidul:真可惜。该网站上有一些有用的东西。我将删除或替换链接。
    【解决方案2】:

    使用keyup eventexample on jsFiddle

    $("textarea").keyup(function(e){
       alert($(this).val());
    });
    

    它发生在你举起钥匙之后。我不知道您想要实现什么,但是您可以在解除密钥(在keydownkeypress 上)之前存储状态,并在需要时稍后恢复。你也可以stop the output in the keyup event using e.preventDefault(),所以即使key up后也不会注册该区域的值。

    【讨论】:

      【解决方案3】:

      您可以监听keydown 事件并将值存储在变量中。该变量将具有新输入之前的值,并且新输入将包含在keyup 事件中

      更新:

      好的,我误解了您的要求,但是没有一个活动可以满足您的需求。我能想到的模拟这种行为的唯一方法是:

      • 收听keydown/keypress
      • event对象中获取值(获取event.which,然后将其转换为实际值)
      • 使用我在原始建议中提到的变量并将新输入连接到它

      这是一个小提琴:http://jsfiddle.net/HpXuU/13/

      这显然不是一个完美的解决方案,因为它需要一些(有人可能认为不必要的)工作才能正确完成。我建议重新考虑您的需求,但如果这种行为绝对是您所需要的,我认为这是朝着正确方向迈出的一步。

      【讨论】:

      • 我需要新的输入值之前键被解除。
      • 所以你需要代码是通灵的,并且知道用户将在下一毫秒而不是之后抬起手指?
      • @SW 嗯,嗯......这不正是我的建议会做的吗?这是一个小提琴:jsfiddle.net/HpXuU/10
      • keydown 将在键被解除之前为您提供值
      • 如果用户没有在文本框的末尾键入,小提琴将不起作用。
      【解决方案4】:

      你可以使用setTimeout

      $('input').keypress(function() {
          var that = this;
          setTimeout(function() {
              // read that.value
          }, 0);
      });
      

      现场演示: http://jsfiddle.net/HpXuU/8/

      【讨论】:

      • 除非我弄错了,否则不保证在指定时间正确调用超时。
      • @SW setTimeout 机制确实有一个最小延迟,即 cca。 10 毫秒(取决于浏览器)。但是,您可以定义一个 setZeroTimeout 函数 (code is here),该函数将在按键事件处理程序返回后立即执行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多