html <input type = “text” /> onchange-Ereignis funktioniert nicht


85

Ich versuche ein Experiment zu machen. Ich möchte, dass jedes Mal, wenn der Benutzer etwas in das Textfeld eingibt, es in einem Dialogfeld angezeigt wird. Ich habe die onchangeEreigniseigenschaft verwendet, um dies zu ermöglichen, aber es funktioniert nicht. Ich muss immer noch die Senden-Taste drücken, damit es funktioniert. Ich habe über AJAX gelesen und denke darüber nach. Benötige ich noch AJAX, damit es funktioniert, oder reicht einfaches JavaScript aus? Bitte helfen Sie.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
Sie können "dies" anstelle der ID senden, damit Sie getElementById
remi bourgarel am

Ja ... danke, dass ich getan habe, was Ash Burlaczenko mir gesagt hat ...
Newbie Coder

Mit JQuery, nette Lösung hier vorgeschlagen: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

Antworten:


125

onchangewird nur ausgelöst, wenn die Steuerung unscharf ist. Versuchen Sie es onkeypressstattdessen.


19
Funktioniert nicht zum Erkennen von Änderungen, nachdem Benutzer aus der Zwischenablage
eingefügt haben

18
Das hat mein Problem behoben. Ich bevorzuge es onkeyupjedoch, denn es bekommt den neuen Wert im input('element.value')
stealthjong

4
Ich stelle auch fest, dass "Tastendruck" nach dem Drücken der Rücktaste nicht ausgelöst wird, zumindest bei Verwendung von jquery. "keyup" wird ausgelöst, nachdem die Rücktaste gedrückt und losgelassen wurde. "input" löst dieses Problem und funktioniert auch beim Kopieren und Einfügen. Ich denke, dies ist hier die richtige Lösung (wie der Benutzer "99 Probleme - Syntax ist keine" unten ausführt).
Patrick Finnigan

3
'onkeypres', 'onkeyup' usw. ist keine Lösung, wenn man eine Funktion nur aufrufen möchte, wenn sich der Text geändert hat ! Schlüsselereignisse erzeugen in diesem Fall unnötigen Verkehr. (Sehr seltsam, dass diese Antwort als Lösung gewählt wurde, insbesondere mit so wenigen Stimmen !! Ich stimme nicht ab, weil ich nicht nur Antworten ablehnen möchte. Ich gebe lieber die Gründe an, warum dies der Fall ist nicht OK - Es ist hilfreicher!)
Apostolos

Für HTML ≥5 oder jQuery ≥1.7 gibt es unten andere Lösungen, die auch das Einfügen aus der Zwischenablage übernehmen.
user202729

40

Verwenden Sie .on('input'...diese Option, um jede Änderung an einer Eingabe (Einfügen, Keyup usw.) ab jQuery 1.7 und höher zu überwachen.

Für statische und dynamische Eingaben:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

Nur für statische Eingaben:

$('.my-class').on('input', function(){
    alert('Input changed');
});

JSFiddle mit statischem / dynamischem Beispiel: https://jsfiddle.net/op0zqrgy/7/


Das hat bei mir perfekt funktioniert - danke. Hinweis für andere - Vergessen Sie nicht, den obigen Code in Ihrem onLoad oder etwas anderem auszuführen, damit die Überwachung beginnt.
Robert Penridge

Für einen Kommentar zu spät, aber ... Warum schlagen Sie die Verwendung von jQuery vor, wenn der antwortende Benutzer einfaches JavaScript anzeigt?
Andrés Morales

@ AndrésMorales Es ist eine gängige Bibliothek, auf die viele Anwendungen sofort zugreifen können, und die einfach zu denen hinzugefügt werden kann, die dies nicht tun. Offensichtlich gilt diese Antwort nicht für Anwendungen, die jQuery nicht verwenden können (oder nicht verwenden möchten).
Rybo111

@ rybo111 Genau! jQuery ist eine weit verbreitete und weit verbreitete Bibliothek, die jedoch in meinem Gehirn direkt mit der Meme-Frage "Summe zweier Zahlen mit JavaScript" und der am besten bewerteten Antwort über die Verwendung von jQuery verknüpft ist. Dies ist nicht der Fall, aber viele Menschen können JavaScript und jQuery nicht trennen.
Andrés Morales

@ AndrésMorales Beachten Sie, dass meine Antwort "Einfügen, Keyup usw." umfasst. Ich erinnere mich, dass die jQuery-Lösung praktisch war, als ich diese Frage beantwortete (vor 7 Jahren!).
Rybo111

30

Das Überprüfen auf Tastenanschläge ist nur eine Teillösung, da der Inhalt eines Eingabefelds mit Mausklicks geändert werden kann. Wenn Sie mit der rechten Maustaste in ein Textfeld klicken, stehen Ihnen Optionen zum Ausschneiden und Einfügen zur Verfügung, mit denen Sie den Wert ändern können, ohne einen Tastendruck auszuführen. Wenn die automatische Vervollständigung aktiviert ist, können Sie mit der linken Maustaste in ein Feld klicken und eine Dropdown-Liste mit zuvor eingegebenem Text abrufen. Mit einem Mausklick können Sie aus einer Auswahl auswählen. Das Überfüllen von Tastenanschlägen erkennt keine dieser Arten von Änderungen.

Leider gibt es kein "Onchange" -Ereignis, das Änderungen sofort meldet, zumindest soweit ich weiß. Es gibt jedoch eine Lösung, die in allen Fällen funktioniert: Richten Sie mit setInterval () ein Timing-Ereignis ein.

Angenommen, Ihr Eingabefeld hat die ID und den Namen "Stadt":

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

Haben Sie eine globale Variable namens "Stadt":

var city = "";

Fügen Sie dies Ihrer Seiteninitialisierung hinzu:

setInterval(lookForCityChange, 100);

Definieren Sie dann eine lookForCityChange () -Funktion:

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

In diesem Beispiel wird der Wert von "Stadt" alle 100 Millisekunden überprüft, den Sie an Ihre Bedürfnisse anpassen können. Wenn Sie möchten, verwenden Sie eine anonyme Funktion, anstatt lookForCityChange () zu definieren. Beachten Sie, dass Ihr Code oder sogar der Browser möglicherweise einen Anfangswert für das Eingabefeld bereitstellt, sodass Sie möglicherweise über eine "Änderung" informiert werden, bevor der Benutzer etwas unternimmt. Passen Sie Ihren Code nach Bedarf an.

Wenn die Idee, dass ein Timing-Ereignis jede Zehntelsekunde ausgelöst wird, unangemessen erscheint, können Sie den Timer starten, wenn das Eingabefeld den Fokus erhält, und ihn (mit clearInterval ()) bei einer Unschärfe beenden. Ich denke nicht, dass es möglich ist, den Wert eines Eingabefelds zu ändern, ohne dass es den Fokus erhält. Daher sollte das Ein- und Ausschalten des Timers auf diese Weise sicher sein.


1
Wenn es nicht möglich ist, den Wert eines Eingabefelds zu ändern, ohne dass es den Fokus erhält und eine Unschärfe auftritt, wenn ein Element den Fokus verliert, warum nicht einfach nach Änderungen in der Unschärfe suchen?
Pakman

Möchten Sie Maßnahmen ergreifen, wenn sich das Eingabefeld ändert oder wenn es nach einer Änderung den Fokus verliert? Wenn Sie sofort handeln möchten, können Sie nicht auf die Unschärfe warten.
Libelle

@Pakman Das ist in einigen Fällen eine anständige Lösung. Aber wenn Sie während des Tippens suchen möchten - eine sehr nette Funktion, IMO (warum sollte der Benutzer nach Dingen suchen müssen, wenn der Computer dies so viel schneller und ohne Langeweile tun kann?) - oder irgendetwas anderes wirklich muss passieren, wenn sich der Text ändert, warum sollten Sie nicht dazu in der Lage sein?
Der

So traurig, dass es dazu kommt.
Chuck Batson

1
@ChuckBatson Diese Antwort stammt aus dem Jahr 2012. Ich habe festgestellt, dass Sie Ihren Kommentar im Jahr 2016 veröffentlicht haben. Siehe meine Antwort, wenn Sie jQuery verwenden, ist es jetzt unglaublich einfach.
Rybo111

24

HTML5 definiert ein oninputEreignis, um alle direkten Änderungen zu erfassen. Für mich geht das.


1
funktioniert auch mit der Spinner-Steuerung type = "number" (mit der onkeypress nicht funktioniert).
Bob

13

onchange tritt nur auf, wenn die Änderung am Eingabeelement vom Benutzer festgeschrieben wird. Meistens verliert das Element den Fokus.

Wenn Sie möchten, dass Ihre Funktion jedes Mal ausgelöst wird, wenn sich der Elementwert ändert, sollten Sie das oninputEreignis verwenden. Dies ist besser als die Ereignisse für das Auf / Ab der Taste, da der Wert mit der Maus des Benutzers geändert, dh eingefügt oder automatisch ausgefüllt werden kann

Lesen Sie mehr über die Änderung Event hier

Lesen Sie mehr über das Eingabeereignis hier


11

Verwenden Sie folgende Ereignisse anstelle von "onchange".

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

6

Erstens, was funktioniert nicht? Sehen Sie die Warnung nicht?

Außerdem könnte Ihr Code dadurch vereinfacht werden

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

Ich bin auf Probleme gestoßen, bei denen Safari keine "onchange" -Ereignisse in einem Texteingabefeld ausgelöst hat. Ich habe ein jQuery 1.7.2 "change" -Ereignis verwendet und es hat auch nicht funktioniert. Am Ende habe ich das Textwechselereignis von ZURB verwendet. Es funktioniert mit Mausereignissen und kann ausgelöst werden, ohne das Feld zu verlassen:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

Ein paar Kommentare, die IMO wichtig sind:

  • Eingabeelemente, die kein 'Änderungs'-Ereignis ausgeben, bis die USER-Aktion ENTER oder Unschärfe auf das richtige Verhalten wartet .

  • Das Ereignis, das Sie verwenden möchten, ist "input"(" oninput "). Hier wird der Unterschied zwischen den beiden gut demonstriert: https://javascript.info/events-change-input

  • Die beiden Ereignisse signalisieren zwei unterschiedliche Benutzergesten / -momente ("Eingabe" -Ereignis bedeutet, dass der Benutzer eine Auswahllistenoption schreibt oder navigiert, die Änderung jedoch noch nicht bestätigt hat. "Änderung" bedeutet, dass der Benutzer den Wert geändert hat (mit einer Eingabe oder Unschärfe) unsere)

  • In diesem Fall ist es eine schlechte Praxis, auf wichtige Ereignisse zu hören, wie viele hier empfohlen. (wie Leute, die das Standardverhalten von ENTER bei Eingaben ändern) ...

  • jQuery hat damit nichts zu tun. Dies ist alles im HTML-Standard.

  • Wenn Sie Probleme haben zu verstehen, WARUM dies das richtige Verhalten ist, ist dies möglicherweise hilfreich. Verwenden Sie als Experiment Ihren Texteditor oder Browser ohne Maus / Pad, nur eine Tastatur.

Meine zwei Cent.


1

onkeyup hat für mich gearbeitet. Ein Tastendruck wird nicht ausgelöst, wenn die Leertaste gedrückt wird.


Was ist, wenn ein Wert eingefügt wird? Ich benutze "onpaste", um das Ereignis auch auszulösen
Louis

1

Es ist besser , zu verwenden onchange(event)mit <select>. Mit können <input>Sie unten Ereignis verwenden:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

-3

versuche es onpropertychange. es funktioniert nur für IE.


6
Warum sollte jemand eine Eigenschaft in Betracht ziehen wollen, die nur in einem OBSOLETE BROWSER funktioniert, der von seinem Entwickler aufgegeben wurde? Downvote.
Sod Allmächtiger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.