Das Javascript-Änderungsereignis für das Eingabeelement wird ausgelöst, wenn nur der Fokus verloren geht

83

Ich habe ein Eingabeelement und möchte die Länge des Inhalts weiter überprüfen. Wenn die Länge einer bestimmten Größe entspricht, möchte ich die Senden-Schaltfläche aktivieren, habe jedoch ein Problem mit dem Ereignis onchange von Javascript als Ereignis wird nur ausgelöst, wenn das Eingabeelement den Gültigkeitsbereich verlässt und nicht, wenn sich der Inhalt ändert.

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange wird nicht ausgelöst, wenn der Inhalt des Namens geändert wird, sondern nur, wenn der Name unscharf wird.

Kann ich etwas tun, damit diese Veranstaltung an Inhaltsänderungen arbeitet? oder ein anderes Ereignis, das ich dafür verwenden kann? Ich habe eine Problemumgehung mithilfe der Onkeyup-Funktion gefunden, die jedoch nicht ausgelöst wird, wenn wir Inhalte aus dem automatischen Vervollständiger des Browsers auswählen.

Ich möchte etwas, das funktionieren kann, wenn sich der Inhalt des Feldes per Tastatur oder Maus ändert ... irgendwelche Ideen?

Sachin Midha
quelle
Sie könnten onkeyupund verwenden onchange?
James Allardice
1
Das einzige Problem, das ich habe, ist, dass die Autocompleter-Auswahl des Browsers keines dieser Ereignisse verursachen würde.
Sachin Midha
Was für ein Eingabefeld ist das?
Powtac
oh ... ich habe vergessen, es in den Beispielcode einzufügen, es ist ein Textfeld.
Sachin Midha
1
Ich dachte, dies wäre ein sehr häufiges Problem gewesen und viele Leute hätten sich damit auseinandergesetzt, aber jetzt scheint es umgekehrt zu sein ... :)
Sachin Midha

Antworten:

120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

Dies wird fangen change, Tastenanschläge, paste, textInput, input(wenn verfügbar). Und nicht mehr als nötig schießen.

http://jsfiddle.net/katspaugh/xqeDj/


Verweise:

textInput- ein W3C DOM Level 3-Ereignistyp. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

Ein Benutzeragent muss dieses Ereignis auslösen, wenn ein oder mehrere Zeichen eingegeben wurden. Diese Zeichen können aus einer Vielzahl von Quellen stammen, z. B. Zeichen, die aus dem Drücken oder Loslassen einer Taste auf einem Tastaturgerät, aus der Verarbeitung eines Eingabemethoden-Editors oder aus einem Sprachbefehl resultieren. Wenn eine Einfügeoperation eine einfache Folge von Zeichen generiert, dh eine Textpassage ohne Struktur- oder Stilinformationen, sollte auch dieser Ereignistyp generiert werden.

input- ein HTML5- Ereignistyp.

Wird an Steuerelementen ausgelöst, wenn der Benutzer den Wert ändert

Firefox, Chrome, IE9 und andere moderne Browser unterstützen dies.

Dieses Ereignis tritt unmittelbar nach der Änderung auf, im Gegensatz zum Ereignis onchange, das auftritt, wenn das Element den Fokus verliert.

katspaugh
quelle
1
Es funktioniert nicht ... hast du deinen Code am Ende überprüft? funktionierte es an der Auswahl aus einem Autocompleter ...?
Sachin Midha
Ich habe textInputChrome 15 eingecheckt und es funktioniert. Ich habe das inputEreignis in IE9 überprüft und es funktioniert auch. Firefox sollte unterstützen DOMAttrModified, aber ich habe es nicht installiert. Diese beiden Ereignisse sind die besten, auf die Sie hoffen können, da sie bei jeder Art von Texteingabe ausgelöst werden.
Katspaugh
1
Tolle Lösung ... Eingabe hat bei mir wie ein Segen funktioniert ... nichts anderes als Eingabe wird benötigt, das selbst funktioniert genug. es funktioniert auf ff4, aber nicht auf 3.x, und ich hatte 3.6 auf meinem Desktop und es hat nie funktioniert ...
Sachin Midha
5
Um die Dinge auf dem neuesten Stand zu halten, wird diese Lösung derzeit mehrmals bei einer einzelnen Eingabeänderung in FF22 ausgelöst. Sie müssen weder die Tastendruck- noch die Texteingabeereignisse verwenden. Eingabe und Eigenschaftsänderung sollten ausreichen
Cyber-Guard
1
Ich fand , dass change, keyupund inputwar die beste Kombination zu decken IE9 und Firefox (36.0.4). Das keypressEreignis schien in IE9 nicht zu funktionieren, da Dinge wie Löschen und Rücktaste nicht erfasst wurden und das inputEinfügen über die Tastatur und das Kontextmenü behandelt wird.
TLS
9

Als Erweiterung der Antwort von katspaugh können Sie dies für mehrere Elemente mithilfe einer CSS-Klasse tun.

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });
SSZero
quelle
4

Ich habe 30 Minuten gebraucht, um es zu finden, aber das funktioniert im Juni 2019.

<input type="text" id="myInput" oninput="myFunction()">

und wenn Sie einen Ereignis-Listener programmgesteuert in js hinzufügen möchten

inputElement.addEventListener("input", event => {})
franmcod
quelle
3

Mach es wie bei jQuery:

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});
powtac
quelle
1
Dies wird auch nur ausgelöst, wenn das Feld Fokus verliert.
Felix Kling
@ Felix Kling, wahr, änderte es in keyup ();)
powtac
wieder das gleiche Problem mit Keyup ... Ich habe es benutzt und ich hatte ein Problem damit. Lesen Sie meine vollständige Frage.
Sachin Midha
0

Sie können onkeyup verwenden

<input id="name" onkeyup="checkLength(this.value)" />
Dogbert
quelle
Ich habe onkeyup verwendet ... aber mein Problem ist, wenn der Benutzer aus dem Autocompleter des Browsers auswählt, dann wird dieses Ereignis nicht ausgelöst ... Ich habe dies bereits in meiner Frage in der von mir verwendeten
Problemumgehung geschrieben
0

Sie müssten eine Kombination von onkeyupund onclick(oder onmouseup) verwenden, wenn Sie jede Möglichkeit nutzen möchten.

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />
DaveRandom
quelle
netter Versuch, aber das Problem hier ist, dass ich nicht die Maus auf das Eingabeelement
drücke,
Das einzige andere, woran ich denken kann und was böse ist, ist, setTimeoutden Wert des Feldes regelmäßig zu überprüfen ... Was genau möchten Sie tun?
Dave Random
Das ist sehr böse ...: D Es ist etwas Ähnliches wie eine Kennwortstärkeanzeige. Es zeigt Ihnen die Stärke des Kennworts an, wenn Sie es weiter eingeben. Ich möchte eine Schaltfläche nur aktivieren, wenn die eingegebene Zeichenfolge die Länge 10 hat. Andernfalls muss sie deaktiviert bleiben. Ich hoffe du hast es ...
Sachin Midha
0

Hier ist eine andere Lösung, die ich für das gleiche Problem entwickle. Ich verwende jedoch viele Eingabefelder, sodass ich den alten Wert als benutzerdefiniertes Attribut der Elemente selbst behalte: "Datenwert". Mit jQuery ist es so einfach zu verwalten.

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

Hier ist, ich habe 5-6 Eingabefelder mit der Klasse 'filterBox' verwendet. Ich lasse die filterBy-Methode nur laufen, wenn sich der Datenwert von seinem eigenen Wert unterscheidet.

efirat
quelle