在jQuery中检测输入更改?


359

在事件.change上使用jquery时,input仅当输入失去焦点时才会触发事件

就我而言,我需要在输入值更改后立即调用该服务(检查值是否有效)。我该怎么做?


3
什么样的输入?文本框?复选框?无线电?文本区域?让我们看看您到目前为止有什么想法
Patricia

抱歉,它是文本类型的输入。就像我说的,我已经尝试过更改,但这并不能激发我所需的方式(对于输入文本中的每个更改)。我也尝试过keydown,但是要使它正常工作,无论输入是否为“脏”,我都必须保持跟踪。
Banshee

2
如果他们按下某个键,那么它将有99%的时间发生变化,您始终可以检查事件处理程序中没有的键。
Patricia

Answers:


545

更新为澄清和示例

范例:http//jsfiddle.net/pxfunc/5kpeJ/

方法1。input事件

在现代浏览器中使用的input事件。当用户在任何时候将值从一个值更改为另一个值时,都将在文本字段中键入,粘贴,撤消操作时,将触发此事件。

在jQuery中这样做

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

从jQuery 1.7开始,替换bindon

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

方法2。keyup事件

对于较旧的浏览器,请使用keyup事件(一旦释放了键盘上的某个键,就会触发该事件,该事件会产生某种误报,因为释放“ w”时,输入值会更改,并且该keyup事件会触发keyup事件触发时释放“ shift”键,但未对输入进行任何更改。)如果用户右键单击并从上下文菜单中粘贴,此方法也不会触发:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

方法3。计时器(setIntervalsetTimeout

为了解决这些限制,keyup您可以设置一个计时器来定期检查输入的值以确定值的变化。您可以使用setIntervalsetTimeout进行此计时器检查。请参阅以下SO问题的标记答案:jQuery文本框更改事件,或查看小提琴以获取使用focusblur事件的工作示例,以启动和停止特定输入字段的计时器


您能否进一步说明此解决方案?如何获得当前值?我如何使它仅在对当前值进行更改时才能运行?
Banshee

输入事件?jQuery中没有输入事件(尚未)... stackoverflow.com/q/11189136/104380
vsync

对于方法2,我通常同时绑定到keyup change。这样,在没有按键的情况下发生输入(例如粘贴)的情况下,当输入失去焦点时,它将至少触发事件。
rspeed

1
@AdiDarachi MutationObserver将跟踪对DOM元素的更改。但是,用户在输入字段中更改数据不会触发MutationObserver更改...我设置了一个测试用例,只有将JS代码更改为innerTextvalue属性(模拟用户输入)才会触发MutationObserver事件jsfiddle.net/pxfunc/ 04chgpws / 1(请参阅console.log中的MutationObserver事件日志记录)。您可以查看其他测试用例吗?
MikeM '16

1
当脚本更改值时,这将不起作用
FalcoGer

189

如果您有HTML5:

  • oninput (仅在实际发生更改时触发,但立即触发)

否则,您需要检查所有这些可能表明输入元素的值发生更改的事件:

  • onchange
  • onkeyup不是 keydownkeypress因为输入的值尚未包含新的击键)
  • onpaste (如果支持)

有可能:

  • onmouseup (我不确定这一点)

我测试中的@naomik适用于复选框输入;IE / Edge除外。可能还会出现其他一些例外,但是将onchange用于那些输入类型(IMHO)会更聪明。
HellBaby

82

使用HTML5且不使用jQuery,您可以使用inputevent

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

每次输入文本更改时都会触发。

在IE9 +和其他浏览器中受支持。

这里jsFiddle中尝试它。



1
“更改”仅在模糊时触发,而不是在文本更改时触发。使用“输入”事件来检测文本更改。
Dermot Doherty

14

正如其他人已经建议的那样,您的解决方案是嗅探多个事件
执行此工作的插件通常会侦听以下事件:

$ input.on('change keydown keypress keyup mousedown click mouseup',handler);on 'change keydown keypress keyup mousedown click mouseup' handler );

如果您认为合适,可以添加focusblur以及其他事件。
我建议不要超出监听的事件,因为它会根据用户的行为在浏览器内存中加载进一步执行的程序。

注意:请注意,使用JavaScript更改输入元素的值(例如,通过jQuery .val()方法)不会触发上述任何事件。
(参考: https //api.jquery.com/change/)。


我还建议添加事件的内容,以避免问题的自动完成
比纳尔

我知道了。我搜索了一下,但是焦点集中似乎仅受IE支持,部分受Chrome支持,对吗?
Emanuele Del

5
就像一个温和的补充,要从jQuery触发事件,您可以.val()在输入字段发生更改事件后调用相应的动作,您可以执行以下操作…… $('#element').val(whatever).change()
techknowcrat

2

如果希望元素中发生任何更改时都触发该事件,则可以使用keyup事件。


好的,但这与按键不大相同吗?我自己必须检查输入是否“脏”?
Banshee

@SnowJim如果您只想在输入实际更改时做一些事情,则必须使用onchange或自己跟踪状态。 keydown不起作用,因为它更改输入状态之前触发。
Alnitak

@Alnitak exacly,这就是为什么我在这里问这个问题。onchange不起作用,仅在离开输入时才抛出。
Banshee

当然,房间里的大象是可以移动的。可以肯定的是,那里没有键盘或鼠标事件会很有用。:p
Askdesigners 2014年

@Askdesigners Keyup / down事件在移动设备上仍应以相同的方式工作。
Jivings 2014年

2

// .blur在元素失去焦点时触发

$('#target').blur(function() {
  alert($(this).val());
});

//要手动触发,请使用:

$('#target').blur();

1
正如我所说,.change仅当inout失去焦点并且值更改时才抛出。我需要在input(text)更改后(输入内容中的文本更改)立即获得偶数。仅当输入失去焦点时才会触发模糊。
Banshee

1

您可以将jQuery事件(例如keyupkeypress)与输入HTML元素一起使用。您还可以使用blur()事件。


1
正如我所说,.change仅当inout失去焦点并且值更改时才抛出。我需要在input(text)更改后(输入内容中的文本更改)立即获得偶数。仅当输入失去焦点时才会触发模糊。
Banshee

1
您不能在keypress事件期间可靠地检查输入的值,因为按下的键尚未更改该值。
Alnitak

0

这涵盖了使用jQuery 1.7及更高版本对输入的所有更改:

$(".inputElement").on("input", null, null, callbackFunction);
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.