如何在按键事件后获得 jQuery .val()?

IT技术 javascript jquery forms events jquery-events
2021-03-17 13:51:59

我有:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

现在警报总是返回之前的值keypress(例如,该字段为空,我输入'a',警报给我''。然后我输入'b',警报给我'a'...)。但我想要之后的valuekeypress- 我怎么做?

背景:我想在文本字段包含至少一个字符后立即启用按钮。所以我对每个keypress事件都运行这个测试,但是使用返回val()的结果总是落后一步。使用该change()事件对我来说不是一个选项,因为在您离开文本框之前,该按钮将被禁用。如果有更好的方法来做到这一点,我很高兴听到它!

5个回答

更改keypresskeyup

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypress按下键时keyup触发,松开键时触发。

keypress 的定义并不完全正确。这就是keydown的定义。参见quirksmode.org/dom/events/keys.html
2021-05-09 13:51:59
@Brilliand 你是对的。我为此做了一个解决方法,它在下面发布。
2021-05-10 13:51:59
你是如何在 iPhone/Android 设备上完成这项工作的?它们不支持 keyup 功能。
2021-05-10 13:51:59

很惊讶没有人提到js“输入”事件:

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

受到推崇的。

https://developer.mozilla.org/en-US/docs/Web/Events/input

当您需要忽略输入字段中的按箭头键、移位等时,这也很棒。
2021-04-22 13:51:59
caniuse.com/#search=input浏览器支持比较好。比听每个键都更好的答案。
2021-05-10 13:51:59
哇,这是几个未回答/回答不好的 SO 问题的答案。
2021-05-11 13:51:59
它拯救了我的一天!谢谢你。我使用了以下代码: $('.subject_mark').on("input", function () { var $th = $(this); $th.val($th.val().replace(/[^ 0-9]/g, 函数 (str) { return ''; }));
2021-05-11 13:51:59

而不是按键,使用keyup

或者,您可以使用超时为 0 的 keydown 事件。

这样,更改将立即应用,而不是在用户停止按住键时应用。

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});
啊,没关系,OP 没有指定如果清除文本字段会发生什么。
2021-04-21 13:51:59
在按住 Backspace 的情况下,这仍然会表现得很奇怪……也许按键超时为 0?
2021-04-30 13:51:59

尝试这样的事情:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

这只是引入了超时,以便在“keypress”事件循环完成后,您的代码将在此后几乎立即运行。如此短的计时器间隔(即使被浏览器四舍五入)也不会引起注意。

编辑——或者你可以像其他人说的那样使用“keyup”,尽管它的语义不同。

对; 这就是我所说的“语义不同”的意思。
2021-04-27 13:51:59
这不是良性聪明的问题keyup 事件不提供相同的结果。您可以通过 keyup 获得不同的 shift、ctrl 等事件 - 如果您想获得正在键入的实际字符(例如与号),而不是一系列必须检查 shift 或 ctrl 键、按键状态的按键事件是要走的路。
2021-05-11 13:51:59