Événement 'input' jQuery

207

Je n'ai jamais entendu parler d'un événement dans jQuery appelé input avant d'avoir vu ce jsfiddle .

Savez-vous pourquoi ça marche? Est-ce un alias keyupou quelque chose?

$(document).on('input', 'input:text', function() {});
feu de soie
la source
12
Sauf changeque ne tire que lorsque le champ a perdu le focus. inputtire immédiatement.
jcsanyi
3
Avez-vous essayé de le rechercher?
indéfini
2
@undefined Oui, sinon je n'aurais pas créé de question à ce sujet. La seule chose qui revient sur Google sont des articles sur l' input élément et comment y attacher des événements.
silkfire
3
Cette question répond magnifiquement à tous les concepts - stackoverflow.com/questions/15727324/…
GemK

Réponses:

197

Se produit lorsque le contenu textuel d'un élément est modifié via l'interface utilisateur.

Ce n'est pas tout à fait un alias car keyupcar keyupse déclenchera même si la touche ne fait rien (par exemple: appuyer puis relâcher la touche Ctrl déclenchera un keyupévénement).

Une bonne façon d'y penser est comme ceci: c'est un événement qui se déclenche chaque fois que l'entrée change. Cela inclut - sans s'y limiter - appuyer sur des touches qui modifient l'entrée (ainsi, par exemple, Ctrlne déclenchera pas l'événement en soi, mais Ctrl-Vpour coller du texte), sélectionner une option de complétion automatique, milieu de style Linux -cliquez sur coller, faites glisser et déposez, et plein d'autres choses.

Voir cette page et les commentaires sur cette réponse pour plus de détails.

J David Smith
la source
11
Savez-vous si jQuery constitue le support de navigateur manquant? (Incohérences IE8, IE9, etc.)
jcsanyi
4
Je viens de googler «événement d'entrée js». Il existe un talent pour savoir quels termes utiliser pour trouver ce que vous voulez sur Google; cela vient avec l'expérience. Et puis, bien sûr, Google enregistre tout et l'utilise pour savoir ce que vous voulez réellement. La plupart de mes recherches portent sur des documents API et des questions de programmation, donc on apprend au fil du temps que lorsque je recherche des choses, il devrait probablement me montrer des documents API et des réponses de programmation.
J David Smith
3
Eh bien, je cherchais "événement d'entrée jQuery", je ne savais pas que c'était un événement JS original. De même ici, les premiers résultats proviennent généralement de SO, que je considère principalement comme des réponses de facto / sources officielles d'information.
silkfire
18
inputest en fait plus qu'un simple filtre keyup, par exemple, il se déclenche également lorsque la valeur a été sélectionnée dans la liste des valeurs précédemment utilisées ... C'était quelque chose qui serait très difficile à gérer s'il n'y avait pas d' inputévénement.
szeryf
2
oninputse déclenche également lorsque le texte est modifié par la souris (soit par glisser-déposer, soit via un menu contextuel ou un clic milieu pour coller).
Denilson Sá Maia
157

oninput L'événement est très utile pour suivre les modifications des champs de saisie.

Cependant, il n'est pas pris en charge dans la version IE <9. Mais les anciennes versions IE ont leur propre événement propriétaire onpropertychangequi fait la même chose queoninput .

Vous pouvez donc l'utiliser de cette façon:

$(':input').on('input propertychange');

Pour avoir un support croisé complet.

Étant donné que le changement de propriété peut être déclenché pour TOUT changement de propriété, par exemple, la propriété désactivée est modifiée, vous devez inclure ceci:

$(':input').on('propertychange input', function (e) {
    var valueChanged = false;

    if (e.type=='propertychange') {
        valueChanged = e.originalEvent.propertyName=='value';
    } else {
        valueChanged = true;
    }
    if (valueChanged) {
        /* Code goes here */
    }
});
claustrofob
la source
10
Exactement ce dont j'avais besoin. Je vous remercie. (Je déteste devoir supporter <IE9.)
DaleyKD
Quelques informations supplémentaires: "Opera ne déclenche pas un événement d'entrée après avoir déposé du texte dans un champ de saisie. IE 9 ne déclenche pas un événement d'entrée lorsque l'utilisateur supprime des caractères de l'entrée remplie par les opérations de clavier, de coupe ou de glisser." developer.mozilla.org/en-US/docs/Web/Events/…
tkane2000
Il y a un problème avec ce code. Si maxlength est défini sur l'élément d'entrée, l'événement 'input' est déclenché même lorsque la longueur maximale est atteinte et que la valeur n'est pas modifiée
nivcaner
Mais pourquoi pas seulement deux fonctions distinctes? De cette façon, il n'est pas nécessaire de vérifier le type d'événement ou le nom de la propriété. Le code pourrait être dans une troisième fonction partagée.
ADTC
17

En utilisant jQuery, les éléments suivants sont identiques en effet:

$('a').click(function(){ doSomething(); });
$('a').on('click', function(){ doSomething(); });

Avec l' inputévénement, cependant, seul le deuxième modèle semble fonctionner dans les navigateurs que j'ai testés.

Ainsi, vous vous attendez à ce que cela fonctionne, mais cela NE FONCTIONNE PAS (au moins actuellement):

$(':text').input(function(){ doSomething(); });

Encore une fois, si vous vouliez tirer parti de la délégation d'événements (par exemple pour configurer l'événement #containeravant que votre ne input.textsoit ajouté au DOM), cela devrait vous venir à l'esprit:

$('#container').on('input', ':text', function(){ doSomething(); });

Malheureusement, encore une fois, cela ne fonctionne PAS actuellement!

Seul ce modèle fonctionne:

$(':text').on('input', function(){ doSomething(); });

MODIFIÉ AVEC PLUS D'INFORMATIONS ACTUELLES

Je peux certainement confirmer que ce modèle:

$('#container').on('input', ':text', function(){ doSomething(); });

FONCTIONNE MAINTENANT également, dans tous les navigateurs «standard».

Ifedi Okonkwo
la source
2

Comme l'a dit claustrofob, oninput est pris en charge pour IE9 +.

Toutefois , «L'événement oninput est bogué dans Internet Explorer 9. Il n'est pas déclenché lorsque les caractères sont supprimés d'un champ de texte via l'interface utilisateur uniquement lorsque des caractères sont insérés. Bien que l'événement onpropertychange soit pris en charge dans Internet Explorer 9, mais de manière similaire à la événement oninput, il est également buggé, il n'est pas déclenché lors de la suppression.

Étant donné que les caractères peuvent être supprimés de plusieurs façons (touches Retour arrière et Supprimer, CTRL + X, commande Couper et Supprimer dans le menu contextuel), il n'y a pas de bonne solution pour détecter toutes les modifications. Si des caractères sont supprimés par la commande Supprimer du menu contextuel, la modification ne peut pas être détectée dans JavaScript dans Internet Explorer 9. "

J'ai de bons résultats qui se lient à la fois à l'entrée et à la touche (et à la touche, si vous voulez qu'il se déclenche dans IE tout en maintenant la touche Retour arrière).

Zook
la source
1

Je pense que «entrée» fonctionne simplement ici de la même manière que «oninput» dans le modèle d'événement DOM niveau O.

Incidemment:

Tout comme Silkfire l'a commenté, moi aussi, j'ai recherché «l'événement d'entrée jQuery» sur Google. J'ai donc été amené ici et étonné d'apprendre que «entrée» est un paramètre acceptable pour la commande bind () de jquery . Dans jQuery in Action (p. 102, 2008 ed.), 'Input' n'est pas mentionné comme un événement possible (contre 20 autres, de 'blur' à 'unload'). Il est vrai qu'à la p. 92, le contraire pourrait être supposé à partir d'une relecture (c'est-à-dire d'une référence à différents identifiants de chaîne entre les modèles de niveau 0 et de niveau 2). C'est assez trompeur.

Brice Coustillas
la source
Merci pour la contribution (sans jeu de mots), cela semble être un fil officiel maintenant! :)
silkfire
0

jQuery a la signature suivante pour la .on()méthode:.on( events [, selector ] [, data ], handler )

Les événements peuvent être n'importe lequel de ceux répertoriés sur cette référence:

https://developer.mozilla.org/en-US/docs/Web/Events

Cependant, ils ne sont pas tous pris en charge par tous les navigateurs.

Mozilla déclare ce qui suit à propos de l'événement d'entrée:

L'événement d'entrée DOM est déclenché de manière synchrone lorsque la valeur d'un élément ou est modifiée. En outre, il se déclenche sur les éditeurs modifiables lorsque son contenu est modifié.

Robert Rocha
la source
-8
$("input#myId").bind('keyup', function (e) {    
    // Do Stuff
});

travaillant à la fois dans IE et dans le chrome

Raj
la source
bindest obsolète, utilisezon
Tushar