在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
仅在模糊文本框时才会发生 -
onkeyup
&onkeypress
并不总是出现在文本更改 -
onkeydown
发生在文本更改(但不能跟踪鼠标点击剪切和粘贴) -
onpaste
&oncut
与按键发生,甚至用鼠标右键单击。
所以,为了跟踪文本框的变化,我们需要onkeydown
, oncut
和onpaste
。 在这些事件的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风格的文本字段)。 用onkeyup
和onchange
。 onchange
实际上是在从现场失去焦点期间照顾鼠标粘贴操作。
[更新]在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。
确保检查代码不需要太多的时间…否则用户得到一个不好的印象。
是的,诀窍是发射钥匙和鼠标…但要小心,都可以被解雇,所以要记住这样的!
您也可以使用keydown
, keyup
和keypress
事件。
请使用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>