2009-10-10 5 views
1

Supposons que j'attache un gestionnaire d'événements javascript "change" à un élément select, quelque chose qui envoie une requête ajax pour charger des éléments du serveur.comment gérer IE select onchange et les requêtes ajax

C'est très bien dans Firefox. Cependant, dans IE, l'événement change se déclenche à chaque fois que vous faites défiler rapidement les options de la liste déroulante à l'aide d'une molette de la souris. Ceci est gênant car il spams le serveur avec des demandes, et il n'y a aucune garantie que les demandes reviennent dans le bon ordre, par conséquent l'état côté client peut devenir incohérent. Maintenant, notre solution de contournement précédente était que nous introduirions un délai d'attente au gestionnaire de changement, de sorte qu'il attendrait une fraction de seconde avant d'envoyer réellement la demande. Si, dans ce court laps de temps, un autre événement de modification intervient, nous annulons le délai précédent et en démarrons un nouveau, empêchant ainsi le spam de plusieurs demandes.

Maintenant, même si cela semble fonctionner, c'est un peu hack et je me demande s'il y a une meilleure approche. Y a-t-il un événement différent auquel nous pouvons nous accrocher afin qu'il ne se déclenche pas à plusieurs reprises lors du défilement avec la souris? Ou devrions-nous simplement désactiver complètement la souris (onmousewheel = "return false;")? Firefox ne semble pas prendre en charge les boîtes combo de souris à roulettes, mais je ne suis pas sûr que la désactivation de la souris soit une utilisation sérieuse non-non ou quelque chose comme ça.

Quelqu'un peut-il recommander d'autres solutions?

Répondre

1

C'est un peu hack, bien sûr, mais c'est la meilleure solution que j'ai trouvée. J'utilise le modèle pour résoudre plusieurs problèmes différents, y compris les demandes du serveur, l'enregistrement automatique des entrées de texte utilisateur, les entrées de texte auto-complétées, la vérification orthographique, etc. C'est un bon moyen de déterminer une pause dans les interactions utilisateur. Résumé de la logique à une fonction "onPause" et il apparaîtra moins hacky: D

0

vous devez envoyer la valeur d'option actuelle dans la requête ajax, maintenant si vous renvoyez cette valeur dans la réponse ajax, vous pouvez vérifier si l'option sélectionnée est la même que celle retournée par la réponse sinon utilisez-la attendre une autre réponse!

+0

bonne idée ... ne résout pas le problème du serveur spammé inutilement bien –

1

Je ne l'ai pas vraiment essayé (sauf quelques tests pour répondre à cette question), mais vous pourriez peut-être le faire fonctionner en utilisant l'événement onblur. Et peut-être conserver l'événement onchange afin de savoir si le gestionnaire d'événements onblur doit déclencher la requête Ajax ou non.

Questions connexes