根据我的经验,input type="text" onchange事件通常只发生在你离开(模糊)控件之后。

有办法迫使浏览器触发onchange每次文本字段内容的变化?如果不是,那么“手动”跟踪这种情况的最佳方法是什么?

使用onkey* events是不可靠的,因为您可以右键单击字段并选择粘贴,这将在没有任何键盘输入的情况下更改字段。

setTimeout是唯一的方法吗?丑:-)


当前回答

2018年到了,我是这么做的:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

如果你能指出这种方法的缺陷,我会很感激。

其他回答

我认为在2018年最好使用输入事件。

-

正如WHATWG规范所描述的(https://html.spec.whatwg.org/multipage/indices.html#event-input-input):

当用户更改值时向控件触发(参见 改变事件)

-

下面是一个如何使用它的例子:

<input type="text" oninput="handleValueChange()">

Javascript在这里是不可预测和有趣的。

Onchange只在模糊文本框时发生 Onkeyup & onkeypress并不总是发生在文本更改 Onkeydown发生在文本更改时(但不能跟踪鼠标点击的剪切和粘贴) Onpaste & oncut发生在键盘,甚至鼠标右键单击。

因此,要跟踪文本框中的变化,我们需要onkeydown, oncut和onpaste。在这些事件的回调中,如果你检查文本框的值,那么你不会得到更新的值,因为该值在回调后发生了变化。因此,解决方案是设置一个超时函数,其超时时间为50毫秒(或更少),以跟踪更改。

这是一个肮脏的黑客,但据我研究,这是唯一的方法。

这里有一个例子。 http://jsfiddle.net/2BfGC/12/

onkeyup发生在你输入之后,例如,我按下t,当我抬起手指的动作发生,但在keydown动作发生在我数字字符t之前

希望这对某些人有所帮助。

onkeyup更适合发送刚才输入的内容。

要跟踪每一个,请尝试这个示例,并在此之前将光标闪烁率完全降低到零。

< body > -试试onkeydown、onkeyup onkeypress <输入类型=“文本”“> <跨越> < /跨越> < >脚本 我的功能(瓦尔) /警报(val); var mySpan =文档. getelementsby mySpan += val+"<br>"; 文件。getElementsByTagName(“跨越”)[0 - 9]。内html = mySpan; 的 剧本< - > < / body >

Onblur:退出时生成事件

Onchange:如果在输入文本中做了任何更改,则在退出时生成事件

Onkeydown:在任何按键时产生事件(对于长时间按住键也一样)

Onkeyup:在任何密钥释放时生成事件

Onkeypress:与onkeydown(或onkeyup)相同,但不会对ctrl,backsace,alt其他做出反应

下面的代码为我工作良好的Jquery 1.8.3

HTML: <输入类型=“文本”id=“myId”/>

Javascript/JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});