2010-10-12 4 views
0

Je rencontre des problèmes avec un champ ajax autocomplete. J'ai fait la même chose avant, mais je n'ai jamais eu de problèmes car je n'avais jamais vraiment une connexion Internet lente.

J'ai une boîte de saisie qui agit comme un champ à remplissage automatique. J'ai lié un événement jQuery keyup() à ce champ et j'interroge un fichier php à chaque pression sur ce champ, renvoyant une liste de 20 éléments correspondants. Bien que les données de retour ne contiennent que 2 à 3 kb au maximum, si je commence à taper plus vite, les appels ne reviennent parfois pas dans l'ordre dans lequel ils ont été appelés.

Dites que je suis à la recherche de "stackoverflow". Il arrive parfois que la liste finale que je reçois quand j'ai déjà tapé "stack" est "st" qui apporterait plus de matches que nécessaire. Est-il possible de s'assurer que le dernier appel que je reçois est le dernier? Ce à quoi je pensais était de faire en sorte que les nouvelles données soient plus petites ou au moins égales aux données que j'ai auparavant, mais je pense que ce serait beaucoup. Les données que j'interroge proviennent du graphe Facebook ouvert, à savoir un objet json comme http://graph.facebook.com/100000530820249/friends (si vous avez un compte Facebook, vous pouvez essayer http://graph.facebook.com/me/friends si vous avez besoin d'authentification pour ma liste).

J'ai vraiment besoin de récupérer le côté serveur de données pour certains traitements, donc une méthode purement JS est hors de question. La solution devrait fonctionner pour s'assurer que les appels ajax ne se chevauchent pas ...

Merci d'avance à tous!

Répondre

1

Ma suggestion serait que l'autocomplétion exécute le $.get() basé sur un temporisateur. Lorsqu'un utilisateur exécute un keyup, démarrez un délai d'attente (disons 1sec pour des raisons d'arguments) qui, une fois terminé, déclenche la mise à jour. Sur l'événement keydown, annulez le délai d'expiration. Cela signifie que si l'utilisateur tape rapidement, il ne se déclenchera que s'il s'arrête/pause. Je vais admettre que ce n'est pas idéal, mais cela devrait vous mettre sur la bonne voie.

En outre, une autre option est d'utiliser le widget jQueryUI saisie semi-automatique: http://jqueryui.com/demos/autocomplete/

+0

Merci pour le conseil, sonne comme une bonne idée! Je vais essayer de l'implémenter et de revenir vers vous avec les résultats. Je ne voulais pas charger jQueryUI uniquement pour cela, et même si je le voulais, il y aurait beaucoup de personnalisations à faire si je voulais l'adapter à ce dont j'avais besoin. – Claudiu

+0

A travaillé comme un charme, une solution élégante. Merci pour le tuyau! – Claudiu

+0

@Claudiu: Génial! Je ne savais pas exactement comment cela fonctionnerait, mais cela semblait logique en théorie. –

1

L'approche la plus simple consiste à faire passer un script JavaScript à votre script côté serveur par le script JavaScript et à faire en sorte que le script transmette simplement la même valeur dans son résultat. Ensuite, JavaScript peut vérifier les résultats entrants pour voir si le compteur correspond à la valeur actuelle (c'est-à-dire la plus récente). Si ce n'est pas le cas, ne prenez aucune mesure. ce sont nécessairement des données anciennes.

+0

Altough c'est une bonne solution, vraiment ne correspondait pas à mes besoins, gardera à l'esprit difficile. Merci! – Claudiu