在input type =“text”中跟踪onchange的最佳方式是什么?

根据我的经验, input type="text" onchange事件通常只有在离开( blur )控件后才会发生。

每当textfield内容发生变化时,是否有办法强制浏览器触发onchange ? 如果不是,那么“手动”跟踪这种最优雅的方式是什么?

使用onkey*事件是不可靠的,因为您可以右键单击该字段并select粘贴,这将更改该字段,而无需任何键盘input。

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

更新:

请参阅另一个答案 (2015)。


原创2009答案:

那么,你想让onchange事件在keydown,模糊粘贴? 这是魔术。

如果您想在input时跟踪更改,请使用"onkeydown" 。 如果您需要使用鼠标进行粘贴操作,请使用"onpaste" ( IE , FF3 )和"oninput" ( FF,Opera,Chrome,Safari 1 )。

1 在Safari上破解<textarea> 改用textInput

这些日子听取oninput 这感觉就像onchange没有需要失去对元素的重点。 这是HTML5。

每个人(甚至手机)都支持它,IE8及以下版本除外。 为IE添加onpropertychange 。 我这样使用它:

 <script> onload = function () { var e = document.getElementById('myInput');   e.oninput = myHandler; e.onpropertychange = e.oninput; // for IE8 // e.onchange = e.oninput; // FF needs this in <select><option>... // other things for onload() }; </script> <input type=text id=myInput> 

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

  • onchange仅在模糊文本框时才会发生
  • onkeyuponkeypress并不总是出现在文本更改
  • onkeydown发生在文本更改(但不能跟踪鼠标点击剪切和粘贴)
  • onpasteoncut与按键发生,甚至用鼠标右键单击。

所以,为了跟踪文本框的变化,我们需要onkeydownoncutonpaste 。 在这些事件的callback中,如果你检查文本框的值,那么你没有得到更新的值,因为在callback之后该值被改变。 所以一个解决scheme就是设置一个超时function,超时时间为50毫秒(或者可能更less)来跟踪更改。

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

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

下面的代码适用于Jquery 1.8.3

HTML: <input type="text" id="myId" />

使用Javascript / JQuery的:

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

onkeyup发生后,你键入例如我按t当我举起手指的行动发生,但在keydown行动发生之前,我数字字符t

希望这对某人有帮助。

所以onkeyup是更好的,当你想发送你刚刚input的东西。

如果您只使用Internet Explorer,则可以使用以下命令:

 <input type="text" id="myID" onpropertychange="TextChange(this)" /> <script type="text/javascript"> function TextChange(tBox) { if(event.propertyName=='value') { //your code here } } </script> 

希望有所帮助。

我有一个类似的要求(Twitter风格的文本字段)。 用onkeyuponchangeonchange实际上是在从现场失去焦点期间照顾鼠标粘贴操作。

[更新]在HTML5或更高版本中,使用oninput获取实时字符修改更新,如上面其他答案中所述。

有一个相当接近的解决scheme(不要修复所有的粘贴方式),但大多数:

它适用于投入以及textareas:

 <input type="text" ... > <textarea ... >...</textarea> 

这样做:

 <input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" > <textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea> 

正如我所说的,并不是所有的方法都会在所有的浏览器上粘贴一个事件…最糟糕的是一些事件根本不会触发任何事件,但是定时器对于这样的事情是非常可怕的。

但是大部分的粘贴方式都是通过键盘和/或鼠标完成的,所以粘贴后通常会激活onkeyup或onmouseup,而在键盘上打字时也会触发onkeyup。

确保检查代码不需要太多的时间…否则用户得到一个不好的印象。

是的,诀窍是发射钥匙和鼠标…但要小心,都可以被解雇,所以要记住这样的!

您也可以使用keydownkeyupkeypress事件。

请使用JQuery来判断下一个方法:

HTML:

 <input type="text" id="inputId" /> 

使用Javascript(JQuery的):

 $("#inputId").keyup(function(){ $("#inputId").blur(); $("#inputId").focus(); }); $("#inputId").change(function(){ //do whatever you need to do on actual change of the value of the input field }); 

“input”为我工作。

 var searchBar = document.getElementById("searchBar"); searchBar.addEventListener("input", PredictSearch, false); 

跟踪每一个尝试这个例子,在这之前,完全减less光标闪烁率为零。

 <body> //try onkeydown,onkeyup,onkeypress <input type="text" onkeypress="myFunction(this.value)"> <span> </span> <script> function myFunction(val) { //alert(val); var mySpan = document.getElementsByTagName("span")[0].innerHTML; mySpan += val+"<br>"; document.getElementsByTagName("span")[0].innerHTML = mySpan; } </script> </body>