328 votes

Détecter la modification d'une zone de saisie de texte

J'ai examiné de nombreuses autres questions et trouvé des réponses très simples, notamment le code ci-dessous. Je veux simplement détecter lorsque quelqu'un modifie le contenu d'une zone de texte, mais pour une raison quelconque, cela ne fonctionne pas... Je n'obtiens aucune erreur de console. Lorsque je place un point d'arrêt dans le navigateur à l'emplacement change() fonction qu'il n'atteint jamais.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});

<input id="inputDatabaseName">

1 votes

Juste deux choses à essayer : donnez à l'entrée un type="text" et faites-en un élément singleton. <input id="inputDatabaseName" type="text"/>

608voto

Ouadie Points 2802

Vous pouvez utiliser le input Événement Javascript dans jQuery comme ceci :

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

En pur JavaScript :

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

Ou comme ça :

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1 votes

Je n'arrive pas à trouver de documentation sur cet événement, mais il fonctionne exactement comme je l'attends. Savez-vous où je peux trouver la page de documentation ?

3 votes

Vous pouvez le trouver sur la liste des événements HTML5 : w3schools.com/tags/ref_eventattributes.asp ou ici help.dottoro.com/ljhxklln.php

9 votes

Cette solution est en fait bien meilleure que l'utilisation de keyup. Par exemple, IE permet à l'utilisateur d'effacer le champ de saisie en cliquant sur un X, ce qui ne déclenche pas de keyup.

185voto

Scott Harwell Points 4937

Essayez keyup au lieu de change.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Voici la documentation officielle de jQuery pour .keyup() .

1 votes

soupir Je jure que j'ai essayé (après avoir regardé cette question : stackoverflow.com/questions/1443292/ )... mais apparemment pas car cela fonctionne maintenant !

30 votes

Change ne se déclenche que lorsque l'élément perd le focus et keyup se déclenche lorsqu'une touche du clavier est relâchée.

11 votes

Que faire si l'utilisateur colle du code en utilisant ctrl+v ou en faisant glisser un texte sélectionné avec la souris sur le #inputDatabaseName ? Comment le détecter ?

121voto

Bludream Points 300

Chaque réponse manque certains points, alors voici ma solution :

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Le site Input Event incendies sur Clavier l'entrée, Déplacement de la souris , Remplissage automatique et Copier-coller testé sur Chrome et Firefox. La vérification de la valeur précédente lui permet de détecter les changements réels, ce qui signifie qu'il ne se déclenche pas en collant la même chose ou en tapant le même caractère, etc.

Exemple de travail : http://jsfiddle.net/g6pcp/473/


mettre à jour :

Et si vous aimez diriger votre change function uniquement lorsque l'utilisateur a fini de taper et éviter de déclencher plusieurs fois l'action de modification, vous pouvez essayer ceci :

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

Si l'utilisateur commence à taper (par exemple "foobar") ce code empêche votre change action s'exécute pour chaque lettre tapée par l'utilisateur et ne s'exécute que lorsque l'utilisateur cesse de taper, ce qui est particulièrement utile lorsque vous envoyez l'entrée au serveur (par exemple, les entrées de recherche), de cette façon le serveur fait seulement un recherche de foobar et pas six recherches pour f et ensuite fo et ensuite foo et foob et ainsi de suite.

1 votes

C'est le premier qui a fonctionné parmi les six que j'ai essayés. C'est génial. Merci.

0 votes

Cela fonctionne presque sur IE9 : si vous supprimez un caractère, l'événement n'est pas déclenché. Mais c'est une très bonne solution de contournement

0 votes

@Soma, comme d'autres le disent, "casser IE n'est pas un défaut, c'est une fonctionnalité" ;) bien que IE ne soit plus maintenu, si vous avez une solution pour cela, faites-le nous savoir.

24voto

Matt Ball Points 165937

Les entrées de texte ne déclenchent pas la change jusqu'à ce qu'ils perdent le focus. Cliquez en dehors de l'entrée et l'alerte s'affichera.

Si la fonction de rappel doit se déclencher avant que l'entrée de texte ne perde le focus, utilisez l'attribut .keyup() événement.

0 votes

change travaille ici : jsfiddle.net/g6pcp ; keyup alerte après chaque touche, ce qui n'est pas une bonne façon de faire.

1 votes

@diEcho Je pense que l'alerte est juste un exemple pour faire fonctionner son code...pas ce qu'il a l'intention de faire au final.

0 votes

@diEcho Ce que Scott a dit, c'était juste à des fins de test. C'est comme ça que je débogue :D

14voto

Saumil Soni Points 592

onkeyup, onpaste, onchange, oninput semble échouer lorsque le navigateur effectue un remplissage automatique des zones de texte. Pour gérer un tel cas, il faut inclure " autocomplete='off' "dans votre champ de texte pour empêcher le navigateur de remplir automatiquement la zone de texte,

Eg,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X