html <input type = "text" /> événement onchange ne fonctionne pas

88

J'essaye de faire une expérience. Ce que je veux, c'est que chaque fois que l'utilisateur tape quelque chose dans la zone de texte, il sera affiché dans une boîte de dialogue. J'ai utilisé la onchangepropriété event pour y arriver, mais cela ne fonctionne pas. Je dois toujours appuyer sur le bouton Soumettre pour que cela fonctionne. J'ai lu sur AJAX et je pense en savoir plus. Ai-je encore besoin d'AJAX pour le faire fonctionner ou est-ce qu'un simple JavaScript suffit? Veuillez aider.

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); 
}
Codeur débutant
la source
4
vous pouvez envoyer "this" au lieu de l'identifiant, vous n'avez donc pas à appeler getElementById
remi bourgarel
Ouais ... merci d'avoir fait ce que Ash Burlaczenko m'a dit ...
Newbie Coder
Avec JQuery, belle solution proposée ici: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

Réponses:

127

onchangene se déclenche que lorsque le contrôle est flou. Essayez à la onkeypressplace.

Ignacio Vazquez-Abrams
la source
19
Ne fonctionne pas pour détecter le changement après que l'utilisateur ait collé du presse
Juozas Kontvainis
19
Cela a réglé mon problème. Je préfère onkeyupcependant, car il obtient la nouvelle valeur dans le input('
element.value
4
Je remarque également que "keypress" ne se soulève pas après avoir appuyé sur retour arrière, du moins lors de l'utilisation de jquery. "keyup" est soulevé après avoir appuyé sur et relâché le retour arrière. "input" résout ce problème et fonctionne également pour le copier-coller, et je pense que c'est la bonne solution ici (comme l'utilisateur "99 Problems - La syntaxe n'en est pas un" le souligne ci-dessous).
Patrick Finnigan
4
'onkeypres', 'onkeyup', etc. n'est pas une solution quand on veut appeler une fonction uniquement si le texte a changé ! Les événements clés produisent un trafic inutile dans ce cas. (Très étrange que cette réponse ait été choisie comme solution, surtout avec autant de votes !! Je ne la contreviens pas, parce que je n'aime pas simplement voter contre les réponses. Je préfère donner la ou les raisons pour lesquelles c'est pas OK - C'est plus utile!)
Apostolos
Pour HTML ≥5 ou jQuery ≥1.7, il existe d'autres solutions ci-dessous, qui gèrent également le collage à partir du presse-papiers.
user202729
41

Utilisez .on('input'...pour surveiller chaque modification d'une entrée (coller, incruster, etc.) à partir de jQuery 1.7 et supérieur.

Pour les entrées statiques et dynamiques:

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

Pour les entrées statiques uniquement:

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

JSFiddle avec exemple statique / dynamique: https://jsfiddle.net/op0zqrgy/7/

rybo111
la source
Cela a parfaitement fonctionné pour moi - merci. Remarque pour les autres - n'oubliez pas d'exécuter le code ci-dessus dans votre onLoad ou quelque chose pour qu'il «commence» la surveillance.
Robert Penridge
Trop tard pour un commentaire mais ... Pourquoi suggérez-vous d'utiliser jQuery si l'utilisateur qui répond affiche du JavaScript brut?
Andrés Morales le
@ AndrésMorales C'est une bibliothèque commune à laquelle de nombreuses applications ont un accès immédiat, et est simple à ajouter à celles qui ne le font pas. Évidemment, cette réponse ne s'applique pas aux applications qui ne peuvent pas (ou choisissent de ne pas) utiliser jQuery.
rybo111 le
@ rybo111 Exactement! jQuery est une bibliothèque courante et largement utilisée, mais elle renvoie directement dans mon cerveau à la question meme sur "additionner deux nombres en utilisant JavaScript" et à la réponse la plus votée sur l'utilisation de jQuery pour le faire. Ce n'est pas le cas mais de nombreuses personnes ne peuvent pas séparer JavaScript et jQuery.
Andrés Morales le
@ AndrésMorales Notez que ma réponse couvre "coller, keyup, etc". Je me souviens que la solution jQuery était pratique lorsque j'ai répondu à cette question (il y a 7 ans!).
rybo111 le
30

La vérification des frappes n'est qu'une solution partielle, car il est possible de modifier le contenu d'un champ de saisie en utilisant des clics de souris. Si vous cliquez avec le bouton droit dans un champ de texte, vous aurez des options de copier-coller que vous pouvez utiliser pour modifier la valeur sans appuyer sur une touche. De même, si la saisie semi-automatique est activée, vous pouvez cliquer avec le bouton gauche dans un champ et obtenir une liste déroulante du texte précédemment entré, et vous pouvez sélectionner parmi vos choix en utilisant un clic de souris. L'interception de frappe ne détecte aucun de ces types de modifications.

Malheureusement, il n'y a pas d'événement "onchange" qui signale les changements immédiatement, du moins pour autant que je sache. Mais il existe une solution qui fonctionne dans tous les cas: configurer un événement de minutage à l'aide de setInterval ().

Disons que votre champ de saisie a un identifiant et un nom de "ville":

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

Avoir une variable globale nommée "ville":

var city = "";

Ajoutez ceci à l'initialisation de votre page:

setInterval(lookForCityChange, 100);

Définissez ensuite une fonction lookForCityChange ():

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

Dans cet exemple, la valeur de "ville" est vérifiée toutes les 100 millisecondes, que vous pouvez ajuster en fonction de vos besoins. Si vous le souhaitez, utilisez une fonction anonyme au lieu de définir lookForCityChange (). Sachez que votre code ou même le navigateur peut fournir une valeur initiale pour le champ de saisie afin que vous puissiez être informé d'un «changement» avant que l'utilisateur ne fasse quoi que ce soit; ajustez votre code si nécessaire.

Si l'idée d'un événement de minutage qui se déclenche tous les dixièmes de seconde semble disgracieuse, vous pouvez lancer le minuteur lorsque le champ d'entrée reçoit le focus et le terminer (avec clearInterval ()) sur un flou. Je ne pense pas qu'il soit possible de changer la valeur d'un champ d'entrée sans qu'il reçoive le focus, donc activer et désactiver la minuterie de cette manière devrait être sûr.

Libellule
la source
1
S'il n'est pas possible de modifier la valeur d'un champ de saisie sans qu'il ne soit mis au point et qu'un flou se produit lorsqu'un élément perd le focus, pourquoi ne pas simplement rechercher les changements dans onblur?
Pakman
Voulez-vous agir lorsque le champ de saisie change, ou lorsqu'il perd le focus après une modification? Si vous voulez agir immédiatement, vous ne pouvez pas attendre le onblur.
Dragonfly
@Pakman C'est une solution décente dans certains cas. Mais si vous voulez faire une recherche au fur et à mesure - une fonctionnalité très intéressante IMO (pourquoi l'utilisateur devrait-il chercher des choses alors que l'ordinateur peut le faire beaucoup plus vite et sans s'ennuyer?) - ou quoi que ce soit d'autre vraiment que doit se produire lorsque le texte change, pourquoi ne pourriez-vous pas le faire?
The Dag
Tellement triste qu'il en arrive là.
Chuck Batson
1
@ChuckBatson Cette réponse date de 2012. J'ai remarqué que vous avez posté votre commentaire en 2016. Voir ma réponse si vous utilisez jQuery, c'est incroyablement facile maintenant.
rybo111
26

HTML5 définit un oninputévénement pour capturer toutes les modifications directes. ça marche pour moi.

Soufiane ELH
la source
1
fonctionne également avec le contrôle du spinner type = "number" (avec lequel onkeypress ne fonctionne pas).
Bob
13

onchange se produit uniquement lorsque la modification de l'élément d'entrée est validée par l'utilisateur, la plupart du temps, c'est lorsque l'élément perd le focus.

si vous voulez que votre fonction se déclenche à chaque fois que la valeur de l'élément change, vous devez utiliser l' oninputévénement - c'est mieux que les événements de touche haut / bas car la valeur peut être modifiée avec la souris de l'utilisateur, c'est-à-dire collée, ou remplissage automatique, etc.

En savoir plus sur l' événement de changement ici

En savoir plus sur l' événement d' entrée ici

99 problèmes - La syntaxe n'en est pas une
la source
11

utiliser les événements suivants au lieu de "onchange"

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
metaforce
la source
6

Premièrement, qu'est-ce qui «ne fonctionne pas»? Vous ne voyez pas l'alerte?

En outre, votre code pourrait être simplifié à ceci

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

function checkInput(obj) {
    alert(obj.value); 
}
Ash Burlaczenko
la source
2

J'ai rencontré des problèmes où Safari ne déclenche pas d'événements "onchange" sur un champ de saisie de texte. J'ai utilisé un événement "change" jQuery 1.7.2 et cela n'a pas fonctionné non plus. J'ai fini par utiliser l'événement textchange de ZURB. Il fonctionne avec mouseevents et peut tirer sans quitter le terrain:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});
James Moberg
la source
2

Quelques commentaires importants pour l'OMI:

  • les éléments d'entrée n'émettant pas d'événement de «changement» jusqu'à ce que l'action de l'utilisateur ENTREE ou que le flou attende EST le comportement correct .

  • L'événement que vous souhaitez utiliser est "input"(" oninput "). Voici bien démontré la différence entre les deux: https://javascript.info/events-change-input

  • Les deux événements signalent deux gestes / moments différents de l'utilisateur (l'événement "entrée" signifie que l'utilisateur écrit ou navigue dans une des options de la liste de sélection, mais n'a toujours pas confirmé le changement. "Changer" signifie que l'utilisateur a changé la valeur (avec une entrée ou un flou notre)

  • Dans ce cas, écouter les événements clés comme de nombreux autres est recommandé ici. (comme les personnes modifiant le comportement par défaut de ENTER sur les entrées) ...

  • jQuery n'a rien à voir avec cela. Tout cela est au standard HTML.

  • Si vous avez du mal à comprendre POURQUOI c'est le bon comportement, peut-être est-il utile, comme expérience, utilisez votre éditeur de texte ou navigateur sans souris / tapis, juste un clavier.

Mes deux centimes.

cancerbero
la source
1

onkeyup a fonctionné pour moi. onkeypress ne se déclenche pas en appuyant sur l'espace arrière.

Bishnu Paudel
la source
que faire quand une valeur est collée? J'utilise aussi "onpaste" pour déclencher l'événement
Louis
1

Il vaut mieux utiliser onchange(event)avec <select>. Avec <input>vous pouvez utiliser l'événement ci-dessous:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
Bhavin Patel
la source
-3

essayez onpropertychange. cela ne fonctionne que pour IE.

jack jiao
la source
6
Pourquoi quelqu'un voudrait-il envisager une propriété qui ne fonctionne que dans un NAVIGATEUR OBSOLETE qui a été abandonné par son développeur? Voter contre.
Sod Almighty