2010-09-02 9 views
1

J'utilise la saisie semi-automatique Jquery UI sur un projet existant. Eh bien, la performance est le chien lent, en particulier lors de l'exécution de laCache Jquery UI autocomplete Combobox

input.autocomplete("search", ""); 

Ma solution était de mettre en cache les informations, de sorte que même si son chien lent, il se produit une seule fois. Je pense qu'il me manque un bug Javascript très simple et j'apprécierais vraiment de l'aider à le poursuivre.

Voici le code

input.autocomplete(
     { 
      delay: 0, 
      minLength: 0, 
      source: function (request, response) 
      { 
       if (request.term in cache) 
       { 
        response(cache[request.term]); 
        return; 
       } 
       // The source of the auto-complete is a function that returns all the select element's child option elements. 
       var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); 
       response(select.children("option").map(function() 
       { 
        var text = $(this).text(); 
        if (this.value && (!request.term || matcher.test(text))) 
        { 
         cache[request.term] = text; 
         return { label: text, value: text, option: this }; 
        } 
       })); 
      }, 

      select: function (event, ui) 
      { 
       // On the select event, trigger the "selected" event with the selected option. Also update the select element 
       // so it's selected option is the same. 
       ui.item.option.selected = true; 
       self._trigger("selected", event, 
       { 
        item: ui.item.option 
       }); 
      }, 

      change: function (event, ui) 
      { 
       // On the change event, reset to the last selection since it didn't match anything. 
       if (!ui.item) 
       { 
        $(this).val(select.children("option[selected]").text()); 
        return false; 
       } 
      } 
     }); 

     // Add a combo-box button on the right side of the input box. It is the same height as the adjacent input element. 
     var autocompleteButton = $("<button type='button' />"); 
     autocompleteButton.attr("tabIndex", -1) 
          .attr("title", "Show All Items") 
          .addClass("ComboboxButton") 
          .insertAfter(input) 
          .height(input.outerHeight()) 
          .append($("<span />")) 
     autocompleteButton.click(function() 
     { 
      // If the menu is already open, close it. 
      if (input.autocomplete("widget").is(":visible")) 
      { 
       input.autocomplete("close"); 
       return; 
      } 

      // Pass an empty string as value to search for -- this will display all results. 
      input.autocomplete("search", ""); 
      input.focus(); 
     }); 

Presque tous, il est un exemple de code par défaut jquery UI combobox à l'exception de ma faible tentative de mise en cache. Il retourne chaque personnage dans la liste déroulante.

Par exemple, si un ensemble de solution de retour est canaille, et la prochaine a été foobar les "données mises en cache" ressemblera à ceci f o o b un r chacun sur sa propre ligne

J'ai besoin qu'il soit canaille foobar

Ce serait vraiment bien si cela a également fonctionné pour une chaîne vide car c'est mon appel le plus taxant.

Merci pour votre aide

Répondre

0

Il serait beaucoup plus facile de mettre en cache les résultats du service Web en définissant les en-têtes HTTP appropriés. De cette façon, le navigateur prendra soin de tous les problèmes d'invalidation de cache méchant pour vous.

En C#, vous pouvez définir un en-tête Expires un an après l'avenir comme ceci:

Response.Cache.SetExpires(DateTime.Now.AddYears(1)); 

La meilleure référence pour la mise en cache HTTP est Mark Nottingham de Caching Tutorial for Web Authors and Webmasters. Tout ce que je n'ai pas répondu ici se trouve dans ce document.

Une autre ressource spécifique à C# est ASP.Net Cache Examples and Overview de dotnetperls.com.

0

des caches jQuery par défaut. Saisie semi-automatique ce que vous pouvez faire est de faire un peu de pagination ou de mise en cache côté serveur pour limiter les problèmes de performance. Quelle technologie côté serveur utilisez-vous?

+0

Nous sommes une boutique .net ici, donc côté serveur est C# – Aardvark

+0

Il y a plusieurs façons de gérer cela. Le meilleur moyen que j'ai trouvé est de simplement mettre en cache l'ensemble des résultats et de l'expirer après un certain temps. Chaque requête subséquente va à l'encontre du cache. –