我如何获取jquery .val()之后的keypress事件?


101

我有:

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

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

背景:我想在文本字段中至少包含一个字符后启用一个按钮。因此,我在每个按键事件上都运行此测试,但是使用返回的val(),结果总是落后一步。对我而言,不能使用change()事件,因为在离开文本框之前,该按钮一直处于禁用状态。如果有更好的方法,我很高兴听到它!


如果删除了文本,是否应该再次禁用该按钮?如果是这样,您可能必须坚持按键操作。
Brilliand 2014年

Answers:


152

更改keypresskeyup

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

keypress按下键时keyup触发,释放键时触发。


@Brilliand你是对的。我为此做了一个解决方法,它在下面发布。
David Oliveros 2014年

7
您如何在iPhone / Android设备上做到这一点?他们不支持键入功能。
Merijn Den Houting 2014年

4
按键的定义并不完全正确。这就是keydown的定义。参见quirksmode.org/dom/events/keys.html
短片

59

令人惊讶的是,没有人提到js“输入”事件:

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

推荐的。

https://developer.mozilla.org/zh-CN/docs/Web/Events/input


8
哇,这是对几个未解决/差强人意的SO问题的答案。
本·拉西科特

4
当您需要在输入字段中忽略按箭头键,Shift等时,这也很棒。
hovado 2015年

2
caniuse.com/#search=input相对好的浏览器支持。比听每个按键更好的答案。
詹姆斯·豪格

1
它拯救了我的一天!谢谢。我使用了以下代码:$('。subject_mark')。on(“ input”,function(){var $ th = $(this); $ th.val($ th.val()。replace(/ [^ 0-9] / g,函数(str){return ;;}));
arsho


5

或者,您可以使用keydown事件,并将其超时设置为0。

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

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});

在按住Backspace的情况下,这仍然会表现得很奇怪……也许按键的超时值为0?
Brilliand 2014年

嗯,没关系,如果清除了文本字段,OP不会指定应该怎么办。
Brilliand

4

您可能需要连接onchange事件处理程序,而不是使用任何关键事件。

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

使用Edit > Paste或单击鼠标右键,然后粘贴将触发更改事件,但不会触发关键事件。请注意,某些浏览器可能会在粘贴上模拟按键事件(尽管我不知道有任何事件),但是您不能指望该行为。


4

尝试这样的事情:

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

这只是引入了一个超时,因此在“ keypress”事件循环完成之后,您的代码将在此之后立即运行。这样短的计时器间隔(即使浏览器将其舍入)也不会引起注意。

编辑 -或者您可以像其他人一样使用“ keyup”,尽管其语义不同。


这不是benig smart的问题。keyup事件不会提供相同的结果。您可以通过keyup获得关于shift,ctrl等的独特事件-如果您想输入要键入的实际字符(例如“&”号),而不是一系列必须检查shift或ctrl键状态的按键事件,请按键是要走的路。
Ripside

1
对; 这就是我的意思,“它的语义是不同的”。
尖尖的2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.