Es gibt viele Möglichkeiten, wie sich der Wert einer <input type="text">
Dose ändern kann, einschließlich:
- Tastendruck
- Kopieren Einfügen
- mit JavaScript geändert
- automatisch durch Browser oder eine Symbolleiste vervollständigt
Ich möchte, dass meine JavaScript-Funktion bei jeder Änderung (mit dem aktuellen Eingabewert) aufgerufen wird. Und ich möchte, dass es sofort aufgerufen wird, nicht nur, wenn die Eingabe den Fokus verliert.
Ich suche nach der saubersten und robustesten Möglichkeit, dies in allen Browsern zu tun (vorzugsweise mit jQuery).
javascript
jquery
html
Dustin Boswell
quelle
quelle
Antworten:
Dieser jQuery-Code erfasst sofortige Änderungen an jedem Element und sollte in allen Browsern funktionieren:
quelle
input
ist das HTML5-Ereignis, von dem ich glaube, dass es alle modernen Browser abdecken sollte ( MDN-Referenz ).keyup
sollte den Rest fangen, allerdings mit einer leichten Verzögerung (input
wird bei gedrückter Taste ausgelöst).propertychange
ist ein proprietäres MS-Ereignis, und ich bin mir nicht sicher, obpaste
es tatsächlich notwendig ist.document.getElementById('txtInput').value = 'some text';
input
Ereignis hier besagt, dass es nicht ausgelöst wird, wenn der Inhalt über JavaScript geändert wird. Dasonpropertychange
Ereignis wird jedoch bei Änderung über JS ausgelöst (siehe hier ). Dieser Code funktioniert also, wenn der Inhalt über JS im IE geändert wird, aber nicht in anderen Browsern.Eine ausgefallene Echtzeitlösung für jQuery> = 1.9
Wenn Sie auch ein "Klick" -Ereignis erkennen möchten, gehen Sie einfach wie folgt vor:
Wenn Sie jQuery <= 1.4 verwenden, verwenden Sie einfach
live
anstelle vonon
.quelle
Leider denke ich
setInterval
gewinnt den Preis:Es ist die sauberste Lösung mit nur 1 Codezeile. Es ist auch das robusteste, da Sie sich nicht um all die verschiedenen Ereignisse / Wege kümmern müssen
input
um einen Wert zu erhalten.Die Nachteile der Verwendung von 'setInterval' scheinen in diesem Fall nicht zuzutreffen:
quelle
Die Bindung an das
oninput
Ereignis scheint in den meisten vernünftigen Browsern gut zu funktionieren. IE9 unterstützt es auch, aber die Implementierung ist fehlerhaft (das Ereignis wird beim Löschen von Zeichen nicht ausgelöst).Ab jQuery Version 1.7+ ist die
on
Methode nützlich, um wie folgt an das Ereignis zu binden:quelle
oninput
Ereignis funktioniert nicht mitinput[type=reset]
oder Javascript-Bearbeitung, wie Sie in diesem Test sehen können: codepen.io/yukulele/pen/xtEpbAntwort 2017 : Das Eingabeereignis macht genau dies für alles, was aktueller als IE8 ist.
quelle
input
Fall erkennt das Ereignis keine JS-Änderungen.Leider gibt es kein Ereignis oder eine Reihe von Ereignissen, die Ihren Kriterien entsprechen. Tastendrücke und Kopieren / Einfügen können beide mit dem
keyup
Ereignis behandelt werden. Änderungen durch JS sind schwieriger. Wenn Sie die Kontrolle über den Code haben, mit dem das Textfeld festgelegt wird, ändern Sie ihn am besten, um entweder Ihre Funktion direkt aufzurufen oder ein Benutzerereignis im Textfeld auszulösen:Wenn Sie keine Kontrolle über diesen Code haben, können Sie
setInterval()
das Textfeld auf Änderungen überprüfen:Diese Art der aktiven Überwachung wird Aktualisierungen nicht sofort erfassen, scheint jedoch schnell genug zu sein, dass keine Verzögerung erkennbar ist. Wie DrLouie in den Kommentaren hervorhob, lässt sich diese Lösung wahrscheinlich nicht gut skalieren, wenn Sie viele Eingaben beobachten müssen. Sie können den 2. Parameter jederzeit so einstellen, dass
setInterval()
er mehr oder weniger häufig überprüft wird.quelle
myTextBox.value = 'foo';
. B. Keine JavaScript-Ereignisse behandeln diese Situation.input.onpropertychange
, und FF2 +, Opera 9.5, Safari 3 und Chrome 1 können damit umgeheninput.__defineSetter__('value', ...)
(was ich überprüfen kann, obwohl es auf DOM-Knoten als nicht funktionsfähig dokumentiert ist Es klappt). Die einzige Abweichung von der IE-Implementierung besteht darin, dass der IE den Handler nicht nur bei programmgesteuerten Einstellungen, sondern auch bei Schlüsselereignissen auslöst.Hier ist eine etwas andere Lösung, wenn Sie keine der anderen Antworten wollten:
Beachten Sie, dass Sie sich beim Einfügen des Kontextmenüs nicht auf Klicken und Eingeben verlassen können.
quelle
$("input[id^=Units_]").each(function() {
Fügen Sie diesen Code irgendwo hinzu, dies wird den Trick tun.
Gefunden, dass diese Lösung bei val () change () in jQuery nicht auslöst
quelle
Ich habe ein Beispiel erstellt. Möge es für Sie funktionieren.
http://jsfiddle.net/utbh575s/
quelle
Wir müssen eigentlich keine Schleifen einrichten, um JavaScript-Änderungen zu erkennen. Wir haben bereits viele Ereignis-Listener für das Element eingerichtet, das wir erkennen möchten. Nur das Auslösen eines unschädlichen Ereignisses macht den Job.
und natürlich ist dies nur verfügbar, wenn Sie die volle Kontrolle über Javascript-Änderungen in Ihrem Projekt haben.
quelle
Nun, der beste Weg ist, die drei Basen abzudecken, die Sie selbst aufgelistet haben. Ein einfaches: onblur ,: onkeyup usw. funktioniert nicht für das, was Sie wollen, also kombinieren Sie sie einfach.
KeyUp sollte die ersten beiden abdecken, und wenn Javascript das Eingabefeld ändert, hoffe ich, dass es Ihr eigenes Javascript ist. Fügen Sie also einfach einen Rückruf in die Funktion ein, die es ändert.
quelle
Hier ist ein Arbeitsbeispiel, das ich zum Implementieren einer Autocomplete-Variante verwende, die einen jqueryui-Selektor (Liste) ausfüllt, aber ich möchte nicht, dass es genau wie die jqueryui-Autocomplete funktioniert, die ein Dropdown-Menü ausführt.
quelle
KEINE JQUERY! (Es ist heutzutage sowieso irgendwie veraltet)
Bearbeiten: Ich habe die HTML-Ereignisse entfernt. Verwenden Sie KEINE HTML-Ereignisse. Verwenden Sie stattdessen Javascript-Ereignis-Listener.
quelle
Kannst du nicht einfach ein
<span contenteditable="true" spellcheck="false">
Element anstelle von verwenden<input type="text">
?<span>
(mitcontenteditable="true" spellcheck="false"
als Attribute) unterscheidet sich<input>
hauptsächlich durch:<input>
.value
Eigenschaft, aber der Text wird als gerendertinnerText
und ist Teil seines inneren Körpers.<input>
obwohl dies nicht der Fall ist, obwohl Sie das Attribut festgelegt habenmultiline="true"
.Um das Erscheinungsbild zu erreichen, können Sie es natürlich in CSS formatieren, während Sie den Wert als schreiben
innerText
Sie dafür ein Ereignis erhalten können:Hier ist eine Geige .
Leider gibt es etwas, das in IE und Edge nicht funktioniert, was ich nicht finden kann.
quelle
Obwohl diese Frage vor 10 Jahren gestellt wurde, glaube ich, dass sie noch verbessert werden muss. Hier ist meine Lösung.
Das einzige Problem bei dieser Lösung ist, dass sie nicht ausgelöst wird, wenn sich der Wert von Javascript wie ändert
$('selector').val('some value')
. Sie können jedes Ereignis in Ihrem Selektor auslösen, wenn Sie den Wert von Javascript ändern.quelle
Sie können dieses Beispiel sehen und auswählen, welche Ereignisse Sie interessieren:
quelle
Ich bin vielleicht zu spät zur Party hier, aber können Sie nicht einfach das von jQuery bereitgestellte .change () -Ereignis verwenden?
Sie sollten in der Lage sein, so etwas wie ...
Sie können es jederzeit an eine Liste von Steuerelementen mit ...
Der Live-Ordner stellt sicher, dass alle Elemente, die jetzt und in Zukunft auf der Seite vorhanden sind, behandelt werden.
quelle
Dies ist der schnellste und sauberste Weg, dies zu tun:
Ich benutze Jquery ->
Es funktioniert ziemlich gut für mich.
quelle