La vérification des frappes n'est qu'une solution partielle, car il est possible de modifier le contenu d'un champ de saisie en utilisant des clics de souris. Si vous cliquez avec le bouton droit dans un champ de texte, vous aurez des options de copier-coller que vous pouvez utiliser pour modifier la valeur sans appuyer sur une touche. De même, si la saisie semi-automatique est activée, vous pouvez cliquer avec le bouton gauche dans un champ et obtenir une liste déroulante du texte précédemment entré, et vous pouvez sélectionner parmi vos choix en utilisant un clic de souris. L'interception de frappe ne détecte aucun de ces types de modifications.
Malheureusement, il n'y a pas d'événement "onchange" qui signale les changements immédiatement, du moins pour autant que je sache. Mais il existe une solution qui fonctionne dans tous les cas: configurer un événement de minutage à l'aide de setInterval ().
Disons que votre champ de saisie a un identifiant et un nom de "ville":
<input type="text" name="city" id="city" />
Avoir une variable globale nommée "ville":
var city = "";
Ajoutez ceci à l'initialisation de votre page:
setInterval(lookForCityChange, 100);
Définissez ensuite une fonction lookForCityChange ():
function lookForCityChange()
{
var newCity = document.getElementById("city").value;
if (newCity != city) {
city = newCity;
doSomething(city);
}
}
Dans cet exemple, la valeur de "ville" est vérifiée toutes les 100 millisecondes, que vous pouvez ajuster en fonction de vos besoins. Si vous le souhaitez, utilisez une fonction anonyme au lieu de définir lookForCityChange (). Sachez que votre code ou même le navigateur peut fournir une valeur initiale pour le champ de saisie afin que vous puissiez être informé d'un «changement» avant que l'utilisateur ne fasse quoi que ce soit; ajustez votre code si nécessaire.
Si l'idée d'un événement de minutage qui se déclenche tous les dixièmes de seconde semble disgracieuse, vous pouvez lancer le minuteur lorsque le champ d'entrée reçoit le focus et le terminer (avec clearInterval ()) sur un flou. Je ne pense pas qu'il soit possible de changer la valeur d'un champ d'entrée sans qu'il reçoive le focus, donc activer et désactiver la minuterie de cette manière devrait être sûr.