Détection d'un changement d'entrée dans jQuery?

360

Lors de l'utilisation de jquery .changesur un inputévénement, l'événement ne sera déclenché que lorsque l'entrée perd le focus

Dans mon cas, je dois appeler le service (vérifier si la valeur est valide) dès que la valeur d'entrée est modifiée. Comment pourrais-je accomplir cela?

Banshee
la source
3
quel type d'entrée? zone de texte? case à cocher? radio? zone de texte? voyons ce que vous avez trouvé jusqu'à présent
Patricia
Désolé, c'est une entrée de type texte. Et comme je l'ai dit, j'ai essayé le changement mais cela ne se déclenche pas de la façon dont j'ai besoin (pour chaque changement sur le texte en entrée). J'ai également essayé le keydown mais pour que cela fonctionne, je devrai garder une trace si l'entrée est "sale" ou non.
Banshee
2
s'ils appuient sur une touche, cela va changer 99% du temps, vous pouvez toujours vérifier les touches qui ne le seraient pas dans le gestionnaire d'événements.
Patricia

Réponses:

546

MISE À JOUR pour clarification et exemple

exemples: http://jsfiddle.net/pxfunc/5kpeJ/

Méthode 1. inputévénement

Dans les navigateurs modernes, utilisez l' inputévénement. Cet événement se déclenche lorsque l'utilisateur tape dans un champ de texte, colle, annule, essentiellement à chaque fois que la valeur change d'une valeur à une autre.

Dans jQuery, faites ça comme ça

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

à partir de jQuery 1.7, remplacez bindpar on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Méthode 2. keyupévénement

Pour les navigateurs plus anciens, utilisez l' keyupévénement (cela se déclenche une fois qu'une touche du clavier a été relâchée, cet événement peut donner une sorte de faux positif car lorsque "w" est relâché, la valeur d'entrée est modifiée et l' keyupévénement se déclenche, mais aussi lorsque le la touche "shift" est relâchée, l' keyupévénement se déclenche mais aucune modification n'a été apportée à l'entrée.). De plus, cette méthode ne se déclenche pas si l'utilisateur clique avec le bouton droit et colle dans le menu contextuel:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Méthode 3. Minuterie ( setIntervalou setTimeout)

Pour contourner les limites de keyupvous pouvez définir une minuterie pour vérifier périodiquement la valeur de l'entrée afin de déterminer un changement de valeur. Vous pouvez utiliser setIntervalou setTimeoutpour effectuer cette vérification de la minuterie. Voir la réponse marquée à cette question SO: événement de changement de zone de texte jQuery ou voir le violon pour un exemple de travail utilisant focuset blurévénements pour démarrer et arrêter le chronomètre pour un champ de saisie spécifique

MikeM
la source
Pourriez-vous expliquer plus sur cette solution? Comment obtenir la valeur actuelle? Comment puis-je faire en sorte que cela ne s'exécute que lorsque des modifications sont apportées à la valeur actuelle?
Banshee
événement d'entrée? il n'y a pas d'événement d'entrée dans jQuery (encore) ... stackoverflow.com/q/11189136/104380
vsync
Pour la méthode 2, je lie généralement à la fois la saisie et le changement. De cette façon, dans les situations où l'entrée se produit sans pression sur une touche (comme le collage), il déclenchera au moins l'événement lorsque l'entrée perd le focus.
rspeed
1
@AdiDarachi MutationObserver suivra les modifications apportées aux éléments DOM. Cependant, un utilisateur qui modifie des données dans un champ de saisie ne déclenche pas de changement de MutationObserver ... J'ai configuré un cas de test, seul un changement de code JS vers l' attribut innerTextor value(simulant une entrée utilisateur) déclenchera un événement MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (voir le fichier console.log pour la journalisation des événements MutationObserver). Avez-vous un cas de test différent que je peux regarder?
MikeM
1
cela ne fonctionne pas lorsqu'un script modifie la valeur
FalcoGer
189

Si vous avez HTML5:

  • oninput (se déclenche uniquement lorsqu'un changement se produit, mais le fait immédiatement)

Sinon, vous devez vérifier tous ces événements qui pourraient indiquer une modification de la valeur de l'élément d'entrée:

  • onchange
  • onkeyup( pas keydown oukeypress car la valeur de l'entrée n'aura pas encore la nouvelle touche)
  • onpaste (lorsque pris en charge)

et peut-être:

  • onmouseup (Je ne suis pas sûr de celui-ci)
Alnitak
la source
@naomik de mon test, cela fonctionne pour les entrées de case à cocher; sauf IE / Edge. D'autres exceptions peuvent apparaître, mais il est plus intelligent d'utiliser onchange pour ces types d'entrée (à mon humble avis).
HellBaby
82

Avec HTML5 et sans utiliser jQuery, vous pouvez utiliser l' inputévénement :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Cela se déclenchera chaque fois que le texte de l'entrée change.

Pris en charge dans IE9 + et autres navigateurs.

Essayez-le en direct dans un jsFiddle ici .

Drew Noakes
la source
1
'change' ne se déclenche que sur flou, pas lorsque le texte change. Utilisez l'événement «entrée» pour détecter les modifications de texte.
Dermot Doherty
14

Comme d'autres l'ont déjà suggéré, la solution dans votre cas est de renifler plusieurs événements .
Les plugins faisant ce travail écoutent souvent les événements suivants:

$ input . on ( 'change keydowndown keypress keyup mousedown click mouseup' , handler );

Si vous pensez que cela peut vous convenir, vous pouvez l'ajouter focus, blurainsi que d'autres événements.
Je suggère de ne pas dépasser dans les événements à écouter, car il charge dans la mémoire du navigateur d'autres procédures à exécuter en fonction du comportement de l'utilisateur.

Attention: notez que la modification de la valeur d'un élément d'entrée avec JavaScript (par exemple via la .val()méthode jQuery ) ne déclenchera aucun des événements ci-dessus.
(Référence: https://api.jquery.com/change/ ).

Emanuele Del Grande
la source
je recommande également d'ajouter la mise au point pour éviter les problèmes de saisie
semi
Je vois. J'ai cherché et la mise au point semble être prise en charge uniquement par IE et partiellement par Chrome, ai-je raison?
Emanuele Del Grande
5
Tout comme un ajout léger, pour déclencher l'événement à partir de jQuery, vous pouvez appeler l'action correspondante après, .val()par exemple, pour un événement de changement sur un champ de saisie, vous feriez quelque chose comme ça ... $('#element').val(whatever).change()
SourceVisor
2

Si vous souhaitez que l'événement soit déclenché chaque fois que quelque chose est modifié dans l'élément, vous pouvez utiliser l' événement keyup .

Jivings
la source
D'accord mais n'est-ce pas plus ou moins la même chose que le keydown? Je devrai vérifier moi-même si l'entrée est "sale"?
Banshee
@SnowJim si vous ne voulez faire des choses que lorsque l'entrée change réellement, vous devez soit utiliser onchange, soit suivre l'état vous-même. keydownne fonctionne pas car il se déclenche avant que l'état de l'entrée ne soit modifié.
Alnitak
@Alnitak exacly et c'est pourquoi je pose la question ici. Le onchange ne fonctionne pas, il est seulement jeté en quittant l'entrée.
Banshee
L'éléphant dans la pièce est bien sûr mobile. À peu près sûr, aucun événement de clavier ou de souris n'y sera très utile. : p
Askdesigners
Les événements @Askdesigners Keyup / down devraient toujours fonctionner de la même manière sur mobile.
Jivings
2

// .blur est déclenché lorsque l'élément perd le focus

$('#target').blur(function() {
  alert($(this).val());
});

// Pour déclencher manuellement, utilisez:

$('#target').blur();
Kszili
la source
1
.change est comme je l'ai dit uniquement jeté lorsque l'inout perd le focus et que la valeur est modifiée, j'ai besoin d'obtenir un même dès que l'entrée (texte) est modifiée (dès que le texte dans l'entrée est modifié). Le flou ne se déclenche que lorsque l'entrée perd le focus.
Banshee
1

Il existe des événements jQuery comme les touches et les touches que vous pouvez utiliser avec les éléments HTML d'entrée. Vous pouvez également utiliser l' événement blur () .

développeur de logiciels
la source
1
.change est comme je l'ai dit uniquement jeté lorsque l'inout perd le focus et que la valeur est modifiée, j'ai besoin d'obtenir un même dès que l'entrée (texte) est modifiée (dès que le texte dans l'entrée est modifié). Le flou ne se déclenche que lorsque l'entrée perd le focus.
Banshee
1
vous ne pouvez pas vérifier de manière fiable la valeur d'une entrée pendant un keypressévénement car la touche enfoncée n'aura pas encore changé cette valeur.
Alnitak
0

Cela couvre toutes les modifications apportées à une entrée à l'aide de jQuery 1.7 et versions ultérieures:

$(".inputElement").on("input", null, null, callbackFunction);
rybo111
la source