Il existe de nombreuses façons dont la valeur d'un <input type="text">
peut changer, notamment:
- touches
- copier coller
- modifié avec JavaScript
- renseigné automatiquement par un navigateur ou une barre d'outils
Je veux que ma fonction JavaScript soit appelée (avec la valeur d'entrée actuelle) chaque fois qu'elle change. Et je veux qu'il soit appelé immédiatement, pas seulement lorsque l'entrée perd le focus.
Je recherche le moyen le plus propre et le plus robuste de le faire sur tous les navigateurs (en utilisant jQuery de préférence).
javascript
jquery
html
Dustin Boswell
la source
la source
Réponses:
Ce code jQuery intercepte les modifications immédiates de n'importe quel élément et devrait fonctionner sur tous les navigateurs:
la source
input
c'est l'événement HTML5 qui, je pense, devrait couvrir tous les navigateurs modernes ( référence MDN ).keyup
devrait attraper le reste, mais avec un léger retard (input
est déclenché sur la touche enfoncée).propertychange
est un événement MS propriétaire, et je ne sais pas sipaste
c'est réellement nécessaire.document.getElementById('txtInput').value = 'some text';
input
événement indique ici qu'il ne se déclenche pas lorsque le contenu est modifié via JavaScript. Cependant, l'onpropertychange
événement fait feu sur la modification via JS (voir ici ). Ce code fonctionnera donc lorsque le contenu sera modifié via JS sur IE, mais ne fonctionnera pas sur les autres navigateurs.Une solution fantaisie en temps réel pour jQuery> = 1.9
si vous souhaitez également détecter l'événement "clic", il suffit de:
si vous utilisez jQuery <= 1.4, utilisez simplement
live
au lieu deon
.la source
Malheureusement, je pense que
setInterval
remporte le prix:C'est la solution la plus propre, avec seulement 1 ligne de code. C'est aussi le plus robuste, car vous n'avez pas à vous soucier de tous les différents événements / façons dont un
input
peut obtenir une valeur.Les inconvénients de l'utilisation de «setInterval» ne semblent pas s'appliquer dans ce cas:
la source
La liaison à l'
oninput
événement semble fonctionner correctement dans la plupart des navigateurs sensés. IE9 le prend également en charge, mais l'implémentation est boguée (l'événement n'est pas déclenché lors de la suppression de caractères).Avec jQuery version 1.7+, la
on
méthode est utile pour se lier à l'événement comme ceci:la source
oninput
l'événement ne fonctionne pas avecinput[type=reset]
ou l'édition javascript comme vous pouvez le voir dans ce test: codepen.io/yukulele/pen/xtEpbRéponse de 2017 : l' événement d'entrée fait exactement cela pour tout ce qui est plus récent que IE8.
la source
input
événement ne parvient pas à détecter les modifications JS.Malheureusement, aucun événement ou ensemble d'événements ne correspond à vos critères. Les frappes au clavier et le copier / coller peuvent tous deux être gérés avec l'
keyup
événement. Les modifications via JS sont plus délicates. Si vous contrôlez le code qui définit la zone de texte, le mieux est de le modifier pour appeler directement votre fonction ou déclencher un événement utilisateur sur la zone de texte:Si vous n'avez aucun contrôle sur ce code, vous pouvez utiliser
setInterval()
pour «surveiller» la zone de texte pour les modifications:Ce type de surveillance active n'attrapera pas les mises à jour «immédiatement», mais il semble être assez rapide pour qu'il n'y ait pas de décalage perceptible. Comme l'a souligné DrLouie dans les commentaires, cette solution n'est probablement pas très évolutive si vous devez surveiller de nombreuses entrées. Vous pouvez toujours régler le 2e paramètre
setInterval()
pour vérifier plus ou moins fréquemment.la source
myTextBox.value = 'foo';
aucun événement JavaScript ne gère cette situation.input.onpropertychange
, et FF2 +, Opera 9.5, Safari 3 et Chrome 1 peuvent le gérer avecinput.__defineSetter__('value', ...)
(qui, bien qu'il soit documenté comme non fonctionnel sur les nœuds DOM, je peux vérifier Ça marche). La seule divergence par rapport à l'implémentation d'IE est qu'IE déclenche le gestionnaire non seulement sur le paramétrage programmatique mais également pendant les événements clés.Voici une solution légèrement différente si vous n'avez pas aimé les autres réponses:
Considérez que vous ne pouvez pas vous fier aux clics et aux touches pour capturer le collage du menu contextuel.
la source
$("input[id^=Units_]").each(function() {
Ajoutez ce code quelque part, cela fera l'affaire.
Trouvé cette solution à val () ne déclenche pas change () dans jQuery
la source
J'ai créé un échantillon. Que cela fonctionne pour vous.
http://jsfiddle.net/utbh575s/
la source
En fait, nous n'avons pas besoin de configurer de boucles pour détecter les modifications javaScript. Nous configurons déjà de nombreux écouteurs d'événements pour l'élément que nous voulons détecter. il suffit de déclencher un événement non nocif pour faire le travail.
et ofc cela n'est disponible que si vous avez le contrôle total sur les modifications javascript sur votre projet.
la source
Eh bien, la meilleure façon est de couvrir vous-même ces trois bases que vous avez énumérées. Un simple: onblur,: onkeyup, etc. ne fonctionnera pas pour ce que vous voulez, alors combinez-les simplement.
KeyUp devrait couvrir les deux premiers, et si Javascript modifie la zone de saisie, eh bien j'espère que c'est votre propre javascript, alors ajoutez simplement un rappel dans la fonction qui le modifie.
la source
Voici un exemple de travail que j'utilise pour implémenter une variante de saisie semi-automatique qui remplit un sélecteur jqueryui (liste), mais je ne veux pas qu'il fonctionne exactement comme la saisie semi-automatique jqueryui qui fait un menu déroulant.
la source
PAS DE JQUERY! (Son genre obsolète de nos jours de toute façon)
Edit: j'ai supprimé les événements HTML. N'utilisez PAS d'événements HTML ... utilisez plutôt des écouteurs d'événement Javascript.
la source
Ne pouvez-vous pas simplement utiliser l'
<span contenteditable="true" spellcheck="false">
élément à la place de<input type="text">
?<span>
(aveccontenteditable="true" spellcheck="false"
comme attributs) se distingue<input>
principalement par:<input>
.value
propriété, mais le texte est rendu commeinnerText
et fait partie de son corps intérieur.<input>
que vous définissez l'attributmultiline="true"
.Pour accomplir l'apparence, vous pouvez, bien sûr, le styliser en CSS, tout en écrivant la valeur que
innerText
vous pouvez obtenir pour lui un événement:Voici un violon .
Malheureusement, il y a quelque chose qui ne fonctionne pas réellement dans IE et Edge, que je ne trouve pas.
la source
Bien que cette question ait été publiée il y a 10 ans, je pense qu'elle doit encore être améliorée. Voici donc ma solution.
Le seul problème avec cette solution est qu'elle ne se déclenchera pas si la valeur change de javascript comme
$('selector').val('some value')
. Vous pouvez déclencher n'importe quel événement sur votre sélecteur lorsque vous modifiez la valeur à partir de javascript.la source
vous pouvez voir cet exemple et choisir quels sont les événements qui vous intéressent:
la source
Je suis peut-être en retard à la fête ici, mais ne pouvez-vous pas simplement utiliser l'événement .change () fourni par jQuery.
Vous devriez pouvoir faire quelque chose comme ...
Vous pouvez toujours le lier à une liste de contrôles avec quelque chose comme ...
Le classeur en direct garantit que tous les éléments qui existent sur la page maintenant et à l'avenir sont traités.
la source
C'est le moyen le plus rapide et le plus propre de le faire:
J'utilise Jquery ->
Cela fonctionne très bien pour moi.
la source