检测jQuery中的输入更改?

Detecting input change in jQuery?

提问人:Banshee 提问时间:6/24/2011 最后编辑:mikemaccanaBanshee 更新时间:4/28/2017 访问量:605979

问:

在 上使用 jquery 时,只有在输入失去焦点时才会触发事件.changeinput

就我而言,我需要在更改输入值后立即调用服务(检查值是否有效)。我怎样才能做到这一点?

javascript jquery html

评论

3赞 Patricia 6/24/2011
什么样的输入?文本框?复选框?收音机?文本区域?让我们看看到目前为止你想出了什么
0赞 Banshee 6/24/2011
对不起,这是文本类型的输入。正如我所说,我已经尝试过更改,但这并没有以我需要的方式触发(对于输入中文本的每次更改)。我也尝试过按键,但要做到这一点,我将不得不跟踪输入是否“脏”。
2赞 Patricia 6/24/2011
如果他们按下一个键,它将在 99% 的时间内发生变化,您始终可以检查事件处理程序中没有的键。

答:

1赞 softwaredeveloper 6/24/2011 #1

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

评论

1赞 Banshee 6/24/2011
正如我所说,.change 仅在 inout 失去焦点并且值发生变化时才会抛出,我需要在输入(文本)更改后立即获得偶数(一旦输入中的文本发生更改)。模糊只会在输入失去焦点时触发。
1赞 Alnitak 6/24/2011
在事件期间,您无法可靠地检查输入的值,因为按下的键尚未更改该值。keypress
3赞 Kszili 6/24/2011 #2

当元素失去焦点时触发 .blur

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

要手动触发,请使用:

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

评论

1赞 Banshee 6/24/2011
正如我所说,.change 仅在 inout 失去焦点并且值发生变化时才会抛出,我需要在输入(文本)更改后立即获得偶数(一旦输入中的文本发生更改)。模糊只会在输入失去焦点时触发。
2赞 Jivings 6/24/2011 #3

如果您希望在元素中发生更改时触发事件,则可以使用 keyup 事件。

评论

0赞 Banshee 6/24/2011
好吧,但这或多或少与键盘相同吗?我将不得不自己检查输入是否“脏”?
0赞 Alnitak 6/24/2011
@SnowJim,如果你只想在输入实际改变时做一些事情,你必须使用 ,或者自己跟踪状态。 不起作用,因为它在输入状态更改之前触发。onchangekeydown
0赞 Banshee 6/24/2011
@Alnitak没错,这就是我在这里问这个问题的原因。onchange 不起作用,它是否仅在离开输入时抛出。
0赞 Askdesigners 6/29/2014
房间里的大象当然是移动的。可以肯定的是,没有键盘或鼠标事件在那里会有多大用处。:p
0赞 Jivings 6/30/2014
@Askdesigners Keyup/down 事件在移动设备上仍应以相同的方式工作。
566赞 MikeM 6/24/2011 #4

已更新以进行说明和示例

示例: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 事件

对于较旧的浏览器,使用该事件(一旦释放键盘上的键,就会触发该事件,此事件可能会给出一种误报,因为当释放“w”时,输入值会更改并触发事件,但当释放“shift”键时,事件会触发,但尚未对输入进行任何更改。此外,如果用户右键单击并从上下文菜单中粘贴,则不会触发此方法:keyupkeyupkeyup

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

方法 3.计时器(setIntervalsetTimeout

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

评论

0赞 Banshee 6/27/2011
您能解释一下这个解决方案的更多信息吗?如何获取当前值?如何让它仅在对当前值进行更改时运行?
0赞 vsync 2/25/2013
input 事件?jQuery中没有输入事件(目前)...stackoverflow.com/q/11189136/104380
0赞 rspeed 4/18/2013
对于方法 2,我通常绑定到 keyup change。这样,在没有按键的情况下进行输入(如粘贴),它至少会在输入失去焦点时触发事件。
0赞 jackocnr 10/15/2013
“input”事件的文档:whatwg.org/specs/web-apps/current-work/multipage/...
1赞 MikeM 7/28/2016
@AdiDarachi MutationObserver 将跟踪对 DOM 元素的更改。但是,用户更改输入字段中的数据不会触发 MutationObserver 更改...我设置了一个测试用例,只有对 or 属性的 JS 代码更改(模拟用户输入)才会触发 MutationObserver 事件 jsfiddle.net/pxfunc/04chgpws/1(请参阅 MutationObserver 事件日志记录console.log)。你有我可以查看的其他测试用例吗?innerTextvalue
192赞 Alnitak 6/24/2011 #5

如果您使用的是 HTML5:

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

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

  • onchange
  • onkeyup (不是,或者因为输入的值还没有新的击键)keydownkeypress
  • onpaste(支持时)

也许:

  • onmouseup(我不确定这个)

评论

0赞 HellBaby 3/7/2017
@naomik从我的测试来看,它适用于复选框输入;IE/Edge 除外。可能会出现其他一些异常,但对这些输入类型使用 onchange 更明智(恕我直言)。
0赞 rybo111 4/5/2013 #6

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

$(".inputElement").on("input", null, null, callbackFunction);
89赞 Drew Noakes 8/23/2014 #7

使用 HTML5 且不使用 jQuery,您可以使用 input 事件

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

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

每次输入的文本更改时,都会触发此操作。

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

在这里的 jsFiddle 中实时尝试一下。

评论

1赞 Dermot Doherty 1/27/2017
“更改”仅在模糊时触发,而不是在文本更改时触发。使用“input”事件检测文本更改。
15赞 yodabar 8/22/2015 #8

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

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

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

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

评论

0赞 binar 1/5/2016
我还建议添加 Focusout 以避免自动完成问题
0赞 yodabar 1/11/2016
明白了。我搜索了一下,focusout 似乎只有 IE 支持,Chrome 部分支持,对吗?
6赞 SourceVisor 9/22/2016
作为一个温和的补充,要从jQuery触发事件,您可以在例如输入字段上的更改事件之后调用相应的操作,您将执行如下操作....val()$('#element').val(whatever).change()