2008-12-05 6 views
27

J'ai une zone de texte avec un événement onchange. Pourquoi cet événement ne se déclenche-t-il pas lorsque l'utilisateur utilise la fonctionnalité de saisie semi-automatique pour remplir la zone de texte?Pourquoi l'événement javascript onchange ne se déclenche-t-il pas si la saisie semi-automatique est activée?

Je travaille avec Internet Explorer. Existe-t-il une solution standard et relativement simple pour contourner ce problème, sans que je doive désactiver la fonctionnalité de saisie semi-automatique?

Répondre

17

La dernière fois que j'ai eu ce problème, j'ai fini par utiliser l'événement onpropertychange pour Internet Explorer à la place. J'ai lu à ce sujet here on MSDN: c'est la façon recommandée de contourner le problème.

+0

mais il semble se déclencher à chaque fois que l'utilisateur appuie sur une touche. Est-ce que je fais quelque chose de mal ici ? – Preets

+1

Non, malheureusement, comment cela fonctionne. Mais je viens de trouver cette ressource, qui semble résoudre le problème d'une manière agréable: http://jehiah.cz/archive/change-and-autocomplete –

+2

Note: onpropertychange ne semble plus fonctionner de manière fiable dans IE9, au moins dans mes tests. –

12

J'ai déjà rencontré cette fonctionnalité gênante et ma solution consistait alors à utiliser l'événement onfocus pour enregistrer la valeur actuelle de la zone de texte, puis à utiliser l'événement onblur pour vérifier si la valeur actuelle correspond à la valeur enregistré pendant onfocus. Par exemple

<input type="text" name="txtTest" value="" onfocus="this.originalvalue=this.value" onblur="if (this.value != this.originalvalue) alert('Test has changed')"/> 
+2

Cela m'était arrivé dans la dernière version de Chrome, donc clairement ce n'est pas une chose spécifique à IE. Le 'onblur' a résolu mon problème. – DanO

+0

onblur a également résolu mon problème, et a travaillé dans IE 7,8,9 et 9 comp. Merci –

+2

Cela a fonctionné très bien pour moi - voici ma traduction jquerified: '$ (" # my-field "). Focus (fonction() {this.originalvalue = this.value}) .blur (fonction() {if (this. value! = this.originalvalue) alert ('changed')}); ' –

1

Je viens juste de Autocomplete pour les zones de texte que je dois déclencher un événement de changement de texte

'Turn off Auto complete 
'(it needs to fire the text change event) 
txtYourTextBox.Attributes.Add("AutoComplete", "off") 

Il suffit de le mettre dans la charge de page.

Alternativement, vous pouvez ajouter l'attribut à votre balisage sur l'élément input ou l'ensemble form:

<input type=text autocomplete=off> 

ou

<form autocomplete=off> 
+1

Ce n'est pas vraiment une solution. La saisie semi-automatique est utile pour les utilisateurs. La question est sur la façon de travailler avec, pas de le désactiver. –

+1

Je l'aime! Forcer les fabricants de navigateurs à nous donner un meilleur support pour ces fonctionnalités qu'ils veulent ajouter, afin que nous puissions travailler avec eux ... sinon nous les désactivons! – eselk

+1

Ceci est une solution car elle désactive une fonctionnalité qui ne fonctionne pas. J'ai un formulaire qui valide chaque champ, et quand ils sont remplis automatiquement, ils montrent toujours par erreur. Je préfère ne pas utiliser le remplissage automatique, puis avoir une forme brisée. Ce serait bien que les fournisseurs de navigateurs déclenchent un événement lors du remplissage automatique. –

4

Je viens de découvrir que using jQuery 1.4 to set change event peut résoudre ce problème. Il semble que ce soit la solution la plus simple si vous connaissez déjà jQuery.

+1

J'utilise jquery 1.7.1 et le choix de l'entrée de saisie semi-automatique avec la touche de tabulation n'a pas déclenché l'événement change. J'ai utilisé la solution de Tim C. –

6

Miser sur la réponse de Tim C, ici est le simple jquery je suis venu avec pour gérer cela pour toutes les zones de texte sur une page:

$("input[type=text]").bind("focus change",function(){ 
    this.previousvalue = this.value; 
}).blur(function(){ 
    if (this.previousvalue != this.value){ 
     $(this).change(); 
    } 
}) 

Si vous ne se soucient pas onchange tirer plusieurs fois, vous peut le rendre plus simple:

$("input[type=text]").blur(function(){ 
    $(this).change(); 
}) 
1

Je trouve que le JavaScript jQuery (v1.10 +) suivant fonctionne dans le cas d'un texte en cours d'achèvement automatique des champs de saisie de texte HTML. Cela a été testé pour fonctionner de manière fiable au moins dans Safari 6.1.1 sous Mac OS X 10.8.5, mais devrait fonctionner dans d'autres navigateurs conformes aussi:

$("input:text[id=text_field_id]").bind("focus change keyup blur", function(event) { 
// handle text change here... 
}); 

Il semblait l'ajout du gestionnaire d'événements blur était la clé ce travail est effectué, bien que les autres gestionnaires d'événements aident à s'assurer que le gestionnaire d'événements est appelé chaque fois que le texte change, que ce soit en raison d'une modification ou d'une nouvelle entrée de la fonction d'auto-complétion du navigateur.

remplace simplement le code ci-dessus "input:text[id=text_field_id]" avec le sélecteur pertinent pour votre champ de saisie de texte souhaité, ou si vous utilisez l'attribut id pour faire référence à votre domaine, remplacez text_field_id avec id la valeur d'attribut de votre champ de texte.

Questions connexes