Je veux détecter chaque fois que le contenu d'une zone de texte a changé. Je peux utiliser la méthode des touches, mais cela détectera également les frappes qui ne génèrent pas de lettres, comme les touches fléchées. J'ai pensé à deux méthodes pour ce faire en utilisant l'événement keyup:
- Vérifiez explicitement si le code ascii de la touche enfoncée est une lettre \ backspace \ delete
- Utilisez les fermetures pour vous rappeler quel était le texte dans la zone de texte avant le coup de clé et vérifiez si cela a changé.
Les deux semblent un peu encombrants.
javascript
jquery
textbox
keypress
olamundo
la source
la source
.keyup()
événement ... plus d'informations ici: stackoverflow.com/questions/3003879/….change()
si elle a changé.Réponses:
Commencez à observer l'événement «entrée» au lieu de «changer».
... qui est agréable et propre, mais peut être étendu à:
la source
Utilisez l'événement onchange en HTML / JavaScript standard.
Dans jQuery, c'est l' événement change () . Par exemple:
$('element').change(function() { // do something } );
ÉDITER
Après avoir lu quelques commentaires, qu'en est-il:
la source
L'événement «change» ne fonctionne pas correctement, mais l '«entrée» est parfaite.
la source
.on
soit recommandée à partir de 1.7 (plutôt que.bind
).Que dis-tu de ça:
<jQuery 1.7
> jQuery 1.7
Cela fonctionne dans IE8 / IE9, FF, Chrome
la source
console.log
la valeur du champ qu'il enregistre deux fois chaque fois que vous entrez un caractère.Oui. Vous n'avez pas besoin d'utiliser nécessairement des fermetures, mais vous devrez vous souvenir de l'ancienne valeur et la comparer à la nouvelle.
Toutefois! Cela n'attrapera toujours pas tous les changements, car il existe des moyens de modifier le contenu de la zone de texte qui n'impliquent aucune pression sur une touche. Par exemple, sélectionner une plage de texte, puis cliquer avec le bouton droit de la souris. Ou en le faisant glisser. Ou déposez du texte d'une autre application dans la zone de texte. Ou changer un mot via la vérification orthographique du navigateur. Ou...
Donc, si vous devez détecter chaque changement, vous devez l'interroger. Vous pouvez
window.setInterval
vérifier le champ par rapport à sa valeur précédente toutes les (disons) secondes. Vous pouvez également câbleronkeyup
à la même fonction afin que les changements qui sont causés par des frappes de touches se reflètent plus rapidement.Lourd? Oui. Mais c'est ça ou faites-le simplement de la manière habituelle de changement HTML et n'essayez pas de mettre à jour instantanément.
la source
input
événement HTML5 est viable et fonctionne dans les versions actuelles de tous les principaux navigateurs.Vous pouvez utiliser l'événement 'input' pour détecter le changement de contenu dans la zone de texte. N'utilisez pas «live» pour lier l'événement car il est obsolète dans Jquery-1.7, alors utilisez «on».
la source
Je suppose que vous cherchez à faire quelque chose d'interactif lorsque la zone de texte change (c'est-à-dire récupérer des données via ajax). Je cherchais cette même fonctionnalité. Je sais que l'utilisation d'une solution globale n'est pas la solution la plus robuste ou élégante, mais c'est ce que j'ai choisi. Voici un exemple:
Une chose clé à noter ici est que j'utilise setTimeout et non setInterval car je ne veux pas envoyer plusieurs demandes en même temps. Cela garantit que la minuterie "s'arrête" lorsque le formulaire est soumis et "démarre" lorsque la demande est terminée. Je le fais en appelant checkSearchChanged à la fin de mon appel ajax. Évidemment, vous pouvez l'étendre pour vérifier la longueur minimale, etc.
Dans mon cas, j'utilise ASP.Net MVC afin que vous puissiez voir comment lier cela à MVC Ajax également dans l'article suivant:
http://geekswithblogs.net/DougLampe/archive/2010/12/21/simple-interactive-search-with-jquery-and-asp.net-mvc.aspx
la source
Je recommanderais de jeter un œil au widget de saisie semi-automatique de jQuery UI. Ils ont traité la plupart des cas là-bas, car leur base de code est plus mature que la plupart des autres.
Vous trouverez ci-dessous un lien vers une page de démonstration afin que vous puissiez vérifier que cela fonctionne. http://jqueryui.com/demos/autocomplete/#default
Vous obtiendrez le plus d'avantages en lisant la source et en voyant comment ils l'ont résolu. Vous pouvez le trouver ici: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Fondamentalement, ils font tout, ils se lient à
input, keydown, keyup, keypress, focus and blur
. Ensuite, ils ont un traitement spécial pour toutes sortes de clés commepage up, page down, up arrow key and down arrow key
. Une minuterie est utilisée avant d'obtenir le contenu de la zone de texte. Lorsqu'un utilisateur tape une clé qui ne correspond pas à une commande (touche haut, touche bas, etc.), un temporisateur explore le contenu après environ 300 millisecondes. Cela ressemble à ceci dans le code:La raison d'utiliser un minuteur est pour que l'interface utilisateur ait une chance d'être mise à jour. Lorsque Javascript est en cours d'exécution, l'interface utilisateur ne peut pas être mise à jour, donc l'appel à la fonction de retard. Cela fonctionne bien pour d'autres situations telles que garder le focus sur la zone de texte (utilisée par ce code).
Vous pouvez donc utiliser le widget ou copier le code dans votre propre widget si vous n'utilisez pas jQuery UI (ou dans mon cas, développer un widget personnalisé).
la source
Je voudrais vous demander pourquoi vous essayez de détecter quand le contenu de la zone de texte a changé en temps réel ?
Une alternative serait de définir une minuterie (via setIntval?) Et de comparer la dernière valeur enregistrée à la valeur actuelle, puis de réinitialiser une minuterie. Cela garantirait la capture de N'IMPORTE QUEL changement, qu'il soit causé par les touches, la souris, un autre périphérique d'entrée que vous n'avez pas considéré, ou même que JavaScript change la valeur (une autre possibilité que personne n'a mentionnée) à partir d'une autre partie de l'application.
la source
envisagez-vous d'utiliser l' événement de changement ?
la source
Utilisez l'
textchange
événement via un module d'interface jQuery personnalisé pour lainput
compatibilité entre les navigateurs . http://benalpert.com/2013/06/18/a-near-perfect-oninput-shim-for-ie-8-and-9.html (dernier github bifurqué: https://github.com/pandell /jquery-splendid-textchange/blob/master/jquery.splendid.textchange.js )Ce gère toutes les balises d'entrée , y compris
<textarea>content</textarea>
, ce qui ne fonctionne pas toujours ,change
keyup
etc. (!) Seulement jQueryon("input propertychange")
poignées<textarea>
balises de manière cohérente, et ce qui précède est une cale pour tous les navigateurs qui ne comprennent pas l'input
événement.Test JS Bin
Cela gère également le collage, la suppression et ne fait pas double emploi avec les touches.
Si vous n'utilisez pas de shim, utilisez les
on("input propertychange")
événements jQuery .la source
Il y a un exemple de travail complet ici .
la source
Quelque chose comme ça devrait fonctionner, principalement parce que
focus
etfocusout
se retrouverait avec deux valeurs distinctes. J'utilisedata
ici car il stocke des valeurs dans l'élément mais ne touche pas le DOM. C'est aussi un moyen simple de stocker la valeur connectée à son élément. Vous pouvez tout aussi facilement utiliser une variable de portée supérieure.la source
Ce code détecte chaque fois que le contenu d'une zone de texte a changé par l'utilisateur et modifié par le code Javascript.
la source