2010-12-14 22 views
2

J'utilise jQuery UI Autocomplete pour créer une interface de recherche. J'ai défini une fonction personnalisée qui renvoie les résultats de la recherche et les met automatiquement à jour en appuyant sur les touches. Cependant, cette fonction personnalisée ne se termine pas avant que la touche suivante soit enfoncée (c'est-à-dire le traitement "Laver" écrit "Washi" (sur le chemin de l'écriture "Washington")jQuery UI Autocomplete: comment démarrer un processus asynchrone et le quitter avant qu'il ne se termine

Je voudrais que chaque appel à l'événement "source" autocomplete pour annuler la fonction précédente (Wash) et commencer la nouvelle fonction (Washi). fonction d'annulation d'appel suivant (Washi) et fonction de démarrage (Washin) et ainsi de suite

Comment fonctionne ce genre de chose?

Répondre

3

Vous devriez être en mesure de faire quelque chose comme ceci:

var lastXhr; 
$("#myAutocomplete").autocomplete({ 
    source: function(request, response) { 
     if (lastXhr) lastXhr.abort(); 
     lastXhr = $.getJSON("search.php", request, function(data, status, xhr) { 
      if (xhr === lastXhr) { 
       response(data); 
      } 
     }); 
    } 
}); 

la demande la plus récente lastXhr stocke var XHR. S'il y a un ensemble et que la fonction source est appelée, elle annule la requête lastXhr et en crée une nouvelle. Lorsque la requête ajax retourne, assurez-vous qu'elle correspond à lastXhr, sinon elle n'appelle pas la fonction response().

+0

Y at-il un moyen d'envelopper une fonction arbitraire/objet de sorte qu'il a une méthode abort() et fonctionne d'une manière non bloquante? ou cette astuce ne fonctionnera qu'avec le wrapper $ .getJSON? – tjb

+0

@tjb abort est spécial pour les requêtes ajax. – PetersenDidIt

+0

Peterson, je pense que votre réponse est la bonne et je l'accepte. Mais, cela fonctionnerait-il? J'écris l'URL comme quelque chose que je sais qui réussira toujours, puis j'écris une fonction qui n'a rien à voir avec les données retournées mais qui fait quelque chose d'utile. Dans ce cas, serais-je capable d'abandonner (même si la fonction était bloquante), et ainsi gagner la fonctionnalité ci-dessus avec une fonction arbitraire? – tjb