ChatGPT解决这个技术问题 Extra ChatGPT

Detect changed input text box

I've looked at numerous other questions and found very simple answers, including the code below. I simply want to detect when someone changes the content of a text box but for some reason it's not working... I get no console errors. When I set a breakpoint in the browser at the change() function it never hits it.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">
just a couple of things to try: give the input a type="text" and make it a singleton element.

c
clami219

You can use the input Javascript event in jQuery like this:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

In pure JavaScript:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

Or like this:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

Can't seem to find documentation for this event, but it works exactly the way I expect it to. Any idea where I can find the doc page?
You can find it on the list of HTML5 events : w3schools.com/tags/ref_eventattributes.asp or here help.dottoro.com/ljhxklln.php
This solution is actually far better than using keyup. E.g. IE lets the user clear input field by clicking an X which does not trigger keyup.
Closest solution so far, but still doesn't work when browser performs autofill on the textboxes.
This is far better than the first answer. Ctrl, Shift keys all count as keyup. And the worst part is, if you type fast, several input would register as only one keyup event.
b
bryanbraun

try keyup instead of change.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Here's the official jQuery documentation for .keyup().


sigh I swear I tried that (after looking at this question: stackoverflow.com/questions/1443292/…)... but apparently not because it works now!
change only fires when the element looses focus and keyup is fired when a key on the keyboard is released.
what if the user pastes code using ctrl+v or by dragging a selected text with the mouse onto the #inputDatabaseName? How do you detect that?
The main problem with this is it still does not take into account if the content actually changes. Only that a button was pressed
@Metropolis, you've seen my answer?? stackoverflow.com/a/23266812/3160597
a
azerafati

Each answer is missing some points, so here is my solution:

$("#input").on("input", function(e) { var input = $(this); var val = input.val(); if (input.data("lastval") != val) { input.data("lastval", val); //your change action goes here console.log(val); } });

Try to drag the letters and copy paste

The Input Event fires on Keyboard input, Mouse Drag, Autofill and Copy-Paste tested on Chrome and Firefox. Checking for previous value makes it detect real changes, which means not firing when pasting the same thing or typing the same character or etc.

Working example: http://jsfiddle.net/g6pcp/473/

update:

And if you like to run your change function only when user finishes typing and prevent firing the change action several times, you could try this:

var timerid; $("#input").on("input", function(e) { var value = $(this).val(); if ($(this).data("lastval") != value) { $(this).data("lastval", value); clearTimeout(timerid); timerid = setTimeout(function() { //your change action goes here console.log(value); }, 500); }; });

If user starts typing (e.g. "foobar") this code prevents your change action to run for every letter user types and and only runs when user stops typing, This is good specially for when you send the input to the server (e.g. search inputs), that way server does only one search for foobar and not six searches for f and then fo and then foo and foob and so on.


This was the first to work from about 6 I tried. Awesome. Thanks.
Almost works on IE9: if you delete a character, it doesn't fire the event. Very good workaround though
@Soma, as others say "breaking IE is not a flaw it's a feature" ;) although IE is not continued anymore but if you have a fix for that let us know
I know, but I had to do it for work :( As a matter of fact, I do : use $("#input").focusout(function () {}). When you click outside your input, the event is fired. Works on current version of Chrome and Firefox, and IE9
@Soma, if that's the only way for IE to work you could use it my way with only changing this line $("#input").on("input focusout",function(e){
M
Matt Ball

Text inputs do not fire the change event until they lose focus. Click outside of the input and the alert will show.

If the callback should fire before the text input loses focus, use the .keyup() event.


change is working here : jsfiddle.net/g6pcp ; keyup alert after each key which is not a good way
@diEcho I think the alert is just an example to get his code working...not what he intends to do in the end.
@diEcho What Scott said, it was just for testing purposes. That's how I debug :D
@Scott please please please use a proper debugger rather than alert(). It will make debugging so much easier.
S
Saumil

onkeyup, onpaste, onchange, oninput seems to be failing when the browser performs autofill on the textboxes. To handle such a case include "autocomplete='off'" in your textfield to prevent browser from autofilling the textbox,

Eg,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

k
kmxr

In my case, I had a textbox that was attached to a datepicker. The only solution that worked for me was to handle it inside the onSelect event of the datepicker.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

Using the same datepicker and needed the same thing, thanks! But it's still weird that input change cannot be detected as a change on