admin管理员组文章数量:1125955
In my experience, input type="text"
onchange
event usually occurs only after you leave (blur
) the control.
Is there a way to force browser to trigger onchange
every time textfield
content changes? If not, what is the most elegant way to track this “manually”?
Using onkey*
events is not reliable, since you can right-click the field and choose Paste, and this will change the field without any keyboard input.
Is setTimeout
the only way?
In my experience, input type="text"
onchange
event usually occurs only after you leave (blur
) the control.
Is there a way to force browser to trigger onchange
every time textfield
content changes? If not, what is the most elegant way to track this “manually”?
Using onkey*
events is not reliable, since you can right-click the field and choose Paste, and this will change the field without any keyboard input.
Is setTimeout
the only way?
16 Answers
Reset to default 961These days listen for oninput
. It feels like onchange
without the need to lose focus on the element. It is HTML5.
It’s supported by everyone (even mobile), except IE8 and below. For IE add onpropertychange
. I use it like this:
const source = document.getElementById('source');
const result = document.getElementById('result');
const inputHandler = function(e) {
result.innerText = e.target.value;
}
source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler);
<input id="source">
<div id="result"></div>
Update:
See Another answer (2015).
Original 2009 Answer:
So, you want the onchange
event to fire on keydown, blur, and paste? That's magic.
If you want to track changes as they type, use "onkeydown"
. If you need to trap paste operations with the mouse, use "onpaste"
(IE, FF3) and "oninput"
(FF, Opera, Chrome, Safari1).
1Broken for <textarea>
on Safari. Use textInput
instead
The code below works fine for me with jQuery 1.8.3.
HTML:
<input type="text" id="myId" />
Javascript/jQuery:
$("#myId").on('change keydown paste input', function(){
doSomething();
});
Javascript is unpredictable and funny here.
onchange
occurs only when you blur the textboxonkeyup
&onkeypress
doesn't always occur on text changeonkeydown
occurs on text change (but cannot track cut & paste with mouse click)onpaste
&oncut
occurs with keypress and even with the mouse right click.
So, to track the change in textbox, we need onkeydown
, oncut
and onpaste
. In the callback of these event, if you check the value of the textbox then you don't get the updated value as the value is changed after the callback. So a solution for this is to set a timeout function with a timeout of 50 mili-seconds (or may be less) to track the change.
This is a dirty hack but this is the only way, as I researched.
Here is an example. http://jsfiddle.net/2BfGC/12/
I think in 2018 it's better to use the input
event.
-
As the WHATWG Spec describes (https://html.spec.whatwg.org/multipage/indices.html#event-input-input):
Fired at controls when the user changes the value (see also the change event)
-
Here's an example of how to use it:
<input type="text" oninput="handleValueChange()">
onkeyup
happens after you type for example I press t
when I lift the finger the action happens but on keydown
the action happens before I digit the character t
Hope this is helpful for someone.
So onkeyup
is better for when you want to send what you just typed now.
Use oninput
instead of onchange
.
index.html
<html>
<head>
<title>title here</title>
<script src="index.js"></script>
</head>
<body>
<input oninput="onclickhandler(this)"></input>
</body>
</html>
script.js
function onclickhandler(e) {
console.log(e.value);
}
I had a similar requirement (twitter style text field). Used onkeyup
and onchange
. onchange
actually takes care of mouse paste operations during lost focus from the field.
[Update] In HTML5 or later, use oninput
to get real time character modification updates, as explained in other answers above.
Method 1: Add an event listener for input
:
element.addEventListener("input", myFunction);
Method 2: Define the oninput
property with JavaScript:
element.oninput = function()
{
myFunction();
};
Method 3: Define the oninput
property with HTML:
<input type="text" oninput="myFunction();">
Please, judge next approach using JQuery:
HTML:
<input type="text" id="inputId" />
Javascript(JQuery):
$("#inputId").keyup(function() {
$(this).blur();
$(this).focus();
});
$("#inputId").change(function() {
// Do whatever you need to do on actual change of the value of the input field
});
If you use ONLY Internet Explorer, you can use this:
<input type="text" id="myID" onpropertychange="TextChange(this)" />
<script type="text/javascript">
function TextChange(tBox) {
if(event.propertyName=='value') {
//your code here
}
}
</script>
Hope that helps.
there is a quite near solution (do not fix all Paste ways) but most of them:
It works for inputs as well as for textareas:
<input type="text" ... >
<textarea ... >...</textarea>
Do like this:
<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>
As i said, not all ways to Paste fire an event on all browsers... worst some do not fire any event at all, but Timers are horrible to be used for such.
But most of Paste ways are done with keyboard and/or mouse, so normally an onkeyup or onmouseup are fired after a paste, also onkeyup is fired when typing on keyboard.
Ensure yor check code does not take much time... otherwise user get a poor impresion.
Yes, the trick is to fire on key and on mouse... but beware both can be fired, so take in mind such!!!
"input" worked for me.
var searchBar = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);
To track each try this example and before that completely reduce cursor blink rate to zero.
<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>
onblur : event generates on exit
onchange : event generates on exit if any changes made in inputtext
onkeydown: event generates on any key press (for key holding long times also)
onkeyup : event generates on any key release
onkeypress: same as onkeydown (or onkeyup) but won't react for ctrl,backsace,alt other
2018 here, this is what I do:
$(inputs).on('change keydown paste input propertychange click keyup blur',handler);
If you can point out flaws in this approach, I would be grateful.
You could use the keydown
, keyup
and keypress
events as well.
本文标签: javascriptHow to track onchange asyoutype in input typequottextquotStack Overflow
版权声明:本文标题:javascript - How to track onchange as-you-type in input type="text"? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736678493a1947305.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论