Das jQuery-Textfeldänderungsereignis wird erst ausgelöst, wenn das Textfeld den Fokus verliert.

133

Ich habe festgestellt, dass das jQuery-Änderungsereignis in einem Textfeld erst ausgelöst wird, wenn ich außerhalb des Textfelds klicke.

HTML:

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

JS:

$("#textbox").change(function() {alert("Change detected!");});

Siehe Demo zu JSFiddle

In meiner Anwendung muss das Ereignis bei jeder Zeichenänderung im Textfeld ausgelöst werden. Ich habe sogar versucht, stattdessen Keyup zu verwenden ...

$("#textbox").keyup(function() {alert("Keyup detected!");});

... aber es ist bekannt, dass das Keyup-Ereignis nicht beim Klicken mit der rechten Maustaste ausgelöst wird.

Irgendeine Problemumgehung? Wird es Probleme geben, wenn beide Hörer Probleme haben?

Haken
quelle
^^ Das hier. Sie können so viele Event-Handler haben, wie Sie möchten.
Stellen Sie Monica Cellio am

Antworten:

297

Die Bindung an beide Ereignisse ist der typische Weg, dies zu tun. Sie können auch an das Einfügeereignis binden.

Sie können an mehrere Ereignisse wie folgt binden:

$("#textbox").on('change keyup paste', function() {
    console.log('I am pretty sure the text box changed');
});

Wenn Sie pedantisch sein möchten, sollten Sie sich auch an mouseup binden, um das Ziehen von Text zu ermöglichen, und eine lastValueVariable hinzufügen , um sicherzustellen, dass sich der Text tatsächlich geändert hat:

var lastValue = '';
$("#textbox").on('change keyup paste mouseup', function() {
    if ($(this).val() != lastValue) {
        lastValue = $(this).val();
        console.log('The text box really changed this time');
    }
});

Und wenn Sie super duperpedantisch sein möchten, sollten Sie einen Intervall-Timer verwenden, um die automatische Füllung, Plugins usw. zu berücksichtigen:

var lastValue = '';
setInterval(function() {
    if ($("#textbox").val() != lastValue) {
        lastValue = $("#textbox").val();
        console.log('I am definitely sure the text box realy realy changed this time');
    }
}, 500);
Petah
quelle
9
Endlich hat jemand die Frage gelesen und das Ganze beantwortet!
Setzen Sie Monica Cellio am
4
.on('change keyup paste', function() {...}feuert tatsächlich mehrmals! Wenn ich ein Zeichen eingegeben und dann nach draußen geklickt habe, werden die Ereignisse 'change' und 'keyup' ausgelöst, was dazu führt, dass die Funktion mehrmals ausgeführt wird! Wenn ich mit der rechten Maustaste eingefügt und dann nach außen geklickt habe, werden sowohl "Ändern" als auch "Einfügen" ausgelöst. Teufel! Wenn Sie Strg + V zum Einfügen verwenden und dann nach außen klicken, wird es dreimal ausgelöst !!
SNag
1
@SNag ja, also sollten Sie ebenfalls eine Prüfung mit einer lastValueVariablen hinzufügen, um sicherzustellen, dass sie sich tatsächlich geändert hat.
Petah
1
+1. Ist hier jedoch überhaupt eine Bindung an "Veränderung" notwendig? Mir ist nicht klar, welcher Fall behandelt werden würde, der zum Zeitpunkt der Abgabe (Änderung) noch nicht behandelt worden wäre.
Madbreaks
1
Das Einfügeereignis wird ausgelöst, bevor der Text tatsächlich eingefügt wird
Developerbmw
85

In modernen Browsern können Sie das inputEreignis verwenden :

DEMO

$("#textbox").on('input',function() {alert("Change detected!");});
A. Wolff
quelle
1
Schön - das war mir nicht bewusst. Ist es eine HTML5-Sache?
Stellen Sie Monica Cellio am
4
Ich hätte diese Antwort gerne akzeptiert, aber wie Sie sagten, ist dies eine Lösung für moderne Browser. Meine Webanwendung richtet sich an Benutzer, die noch IE8 verwenden, und dies funktioniert unter IE8 nicht. :( Was kann ich sagen .. :(
SNag
Wird nicht
ausgelöst,
4
$(this).bind('input propertychange', function() {
        //your code here
    });

Dies funktioniert zum Tippen, Einfügen, Klicken mit der rechten Maustaste usw.

Tony Dong
quelle
1
Dies scheint die beste Lösung zu sein, da nicht mehrere Ereignisse ausgelöst werden, wenn Sie beispielsweise den Aufwärtspfeil in einem numerischen Feld drücken.
Justin
Einfache und effiziente Lösung
Abdulhameed
4
if you write anything in your textbox, the event gets fired.
code as follows :

HTML:

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

JS:

<script type="text/javascript">
  $(function () {
      $("#textbox").bind('input', function() {
      alert("letter entered");
      });
   });
</script>
Mailand
quelle
2

Versuche dies:

$("#textbox").bind('paste',function() {alert("Change detected!");});

Siehe Demo zu JSFiddle .

Dhaval Marthak
quelle
Da die Frage beim Einfügen ist, funktioniert es nicht. Das Ereignis wird nicht durch Klicken mit der rechten Maustaste ausgelöst.
Dhaval Marthak
Und was hat das mit der Verwendung von zu tun bind()?
Stellen Sie Monica Cellio am
er sagte , dass er das KeyUp - Ereignis nicht ausgelöst, wenn die rechte Maustaste + auf es einfügen, so keyupund change()hat ihr eigenes typisches Verhalten so id er will Ereignis auszuführen , dann pastekonnte die Option
Dhaval Marthak
Natürlich, aber das antwortet immer noch nicht, warum die Verwendung von bindstatt on.
Stellen Sie Monica Cellio am
0

Versuchen Sie den folgenden Code:

$("#textbox").on('change keypress paste', function() {
  console.log("Handler for .keypress() called.");
});
Venkat.R
quelle
Wie erfasst das Einfügen mit der Maus, wie in der Frage erwähnt?
Stellen Sie Monica Cellio am
Tastendruck ist geeignet, da er sagte, dassevent to be fired on every character change in the textbox
Venkat.R
Wenn Sie alle Fragen gelesen hätten, die Sie sehen würden, sagte er auch:"...but it's a known fact that the keyup event isn't fired on right-click-and-paste."
Stellen Sie Monica Cellio am
0

Das Lesen Ihrer Kommentare brachte mich zu einer schmutzigen Lösung. Ich weiß, dass dies kein richtiger Weg ist, aber eine Lösung sein kann.

$(function() {
    $( "#inputFieldId" ).autocomplete({
        source: function( event, ui ) {
            alert("do your functions here");
            return false;
        }
    });
});
Kevin Sebastian Fernandez
quelle