Contourner la mise en cache sur jQuery.autocomplete (1.02)
-
09-09-2019 - |
Question
J'utilise jQuery.autocomplete (1.02) sur ma boîte de recherche et je veux exacte chaîne et la correspondance sous-chaîne. Je ne me soucie pas (encore!) À propos de la charge de base de données, je suis heureux pour à déclencher une requête chaque combinaison de touches et de contourner la mise en cache entièrement -. Je ne veux rien manquer
A cette fin, je l'ai essayé de placer cacheLength = 1 , le minimum autorisé, mais la fonction de saisie semi-automatique refuse de déclencher une requête GET pour chaque touche jusqu'à.
searchbox GET_request
'a' -> http://localhost/service_search_request?q=a
'ar' -> http://localhost/service_search_request?q=ar
'ars' -> http://localhost/service_search_request?q=ars
, il envoie lieu le premier et le troisième et le second manque, me donner les mauvais résultats pour « ar »: - / J'ai éclairci ma cache et les sessions, mais il ressemble à une sorte de mise en cache est toujours en cours. Autant que je sache, je n'ai pas mandatement passe et je suis changement rafraîchissant à chaque fois. Il semble donc probable que ce comportement est de jQuery.autocomplete lui-même.
Mes questions sont ...
A) Est-ce que semble probable? à savoir est une fonction, ou peut-être un bug?
B) Si oui est-il un moyen propre autour d'elle? ...
C) Dans le cas contraire, ce que autocomplete utiliseriez-vous à la place?
Naturellement D) Non, vous êtes juste à l'utiliser vous les douches vaginales mal est toujours une possibilité, et même celui que je préfère avoir passé du temps d'aller sur cette route - en supposant qu'il est livré avec un lien vers la documentation que j'ai pas réussi à trouver / lire!
Cheers,
Roger:)
La solution
Je me demande pourquoi cacheLength ne fonctionne pas, mais avait du mal avec autocomplete aussi. À mon humble avis, il y a des erreurs qu'il contient. Cependant, dans le d'options , il y a un matchSubset vous pouvez définir à false.
EDIT: quelque part autour de la ligne 335 est une fonction appelée « demande ». Vous pouvez ajouter des messages de débogage, pour voir ce qui se passe: (note: vous avez besoin Firebug installé ou « console » sera inconnu)
function request(term, success, failure) {
console.debug("ac request...");
if (!options.matchCase)
term = term.toLowerCase();
var data = cache.load(term);
console.debug("ac request 1, loaded data from cache: " + data + " term: " + term);
// recieve the cached data
if (data && data.length) {
success(term, data);
// if an AJAX url has been supplied, try loading the data now
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
console.debug("ac request 2, data is not in the cache, request it");
« flushCache » peut facilement être utilisé dans la fonction que vous pouvez attacher / set en option. J'ai utilisé ce, pour effacer le cache, s'il pourrait y avoir plus de données dans le back-end:
formatItem: function (data,i,n,value){
if(i === (this.max -1)){
console.debug("flushCache");
jQuery(this).flushCache();
}
return data[1] + " (" + data[0] + ")";
}
Autres conseils
Je suis le même problème. Mise en cache ne fonctionne pas bien que j'ai mis l'option cacheLength à 1.
Avec votre solution pour appeler la fonction flushCache après chaque terme imprimé cela fonctionne. Je ne pouvais pas utiliser le:
if(i === (this.max -1)){
puisque « i » est par exemple 1 mais après affinement « this.max » encore 25 que la requête d'arrière-plan initial a donné lieu à 25 retourné lignes.
Cependant , ce bug seulement apparaît en tapant les mots qui contiennent les caractères suédois å ', 'A' ou 'ö'. Alors peut-être l'encaissement fonctionne comme prévu, mais pas avec ces caractères spéciaux.
Quoi qu'il en soit. la solution pour moi était d'appeler toujours le contrôle flushCache dans la fonction formatItem ():
function formatItem(row, position, n, term) {
if($("#keywords-h").length > 0){
$("#keywords-h").flushCache();
}
// format Item
return "<span>" + row[0] + "</span>";
}
Espérons que cela aide quelqu'un et si quelqu'un a les mêmes problèmes avec des caractères spéciaux s'il vous plaît poster une réponse.
ont évidemment venir à ce 18 mois, mais
cacheLength: 0
dans les options a fonctionné pour moi. Donc, dernière version a peut-être résolu le bug?
Cela a fonctionné pour moi.
function requestData(q) {
if (!options.matchCase) q = q.toLowerCase();
//-- I turned off this line
// var data = options.cacheLength ? loadFromCache(q) : null;
//-- And added this line of code
var data = null;
Il existe une option pour désactiver sous-ensemble correspondant par exemple.
$("#query").autocomplete(
url,
{
matchSubset: false
}
)