2010-08-06 9 views
0

Je rencontre un comportement plutôt bizarre dans JQuery.JQuery et la mise en cache des scripts

Je suis charger dynamiquement une série de scripts en utilisant ce code:

for (var i=0; i<requiredScripts.length; i++) 
    { 
    $.ajax({ 
     url: baseURL+"js/"+requiredScripts[i], 
     async: false, 
     dataType: 'script', 
     success: checkLoaded 
     }); 
    } 

La fonction checkLoaded incréments juste un compteur, de sorte que lorsque tous les scripts ont été chargés, il exécute certaines fonctions.

Tout fonctionnait bien jusqu'à ce que j'ai téléchargé une version plus récente de l'un des scripts chargés. JQuery semble continuer à charger l'ancien. J'ai essayé d'actualiser (et forcer l'actualisation) la page en vain ...

J'ai donc désactivé le cache (à partir de la barre d'outils WebDeveloper) et maintenant le script se charge magiquement. Mais quand j'ai réactivé le cache l'ancien script est revenu ...

Je suis allé jusqu'à supprimer le fichier du serveur, et cela n'a rien fait! (sauf si je désactive le cache, c'est-à-dire). Je suis sûr qu'il me manque quelque chose de vraiment simple, mais je ne pouvais pas comprendre.

Merci d'avance à tous ceux qui peuvent vous aider.

EDIT: juste pour clarifier, je veux que le fichier soit mis en cache. Ce que je ne comprends pas, c'est pourquoi un rafraichissement forcé de la page n'aboutit pas à l'obtention du nouveau script.

Notez également que cela se produit uniquement si je charge les fichiers avec JQuery, si je les ajoute manuellement dans le code HTML, une actualisation forcée charge la nouvelle page.

EDIT # 2: résolu en supprimant le cache de FF. Pourtant, ne comprennent pas pourquoi CTRL + MAJ + R n'a pas fait l'affaire ...

+0

ce que le script ne voyez-vous lorsque vous affichez le src à Firebug? – matpol

+0

@matpol: Je vois toujours le vieux chargé. – nico

+0

... sauf si je désactive la mise en cache bien sûr ... mais quand je réactive le cache je vois l'ancien – nico

Répondre

0

qu'Apache à envoyer des en-têtes no-cache pour vos fichiers JS:

<Directory "/path/to/baseURL/js"> 
    Header Set Cache-Control "max-age=0, no-store" 
</Directory> 
+2

On dirait du mauvais karma pour moi. La mise en cache est une bonne chose en général. OP devrait vraiment aller avec l'ajout d'un timestamp ou même mieux, une version de version à ses 'fichiers de script querystring'. – jAndy

1

Vous pouvez simplement utiliser la méthode de désactivation de la mise en cache classique. De cette façon, l'url du script est toujours différente et vous êtes sûr que son contenu n'est pas mis en cache.

+0

apparemment ce n'est pas une bonne idée: http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html – matpol

+2

@matpol: ce n'est pas une bonne idée d'utiliser des chaînes de requête lorsque vous voulez que le fichier soit mis en cache. Ce qui est désiré ici est le contraire, donc ce n'est pas une mauvaise idée. –

+0

cela ne fonctionne pas toujours et c'est un travail de contourner pas une solution - car il ne sera pas réellement résoudre le problème. – matpol

2

$ .ajax a une option de cache qui fait la même chose que la réponse de mck89 mais est un peu plus propre:

$.ajax({ 
    url : 'example.com', 
    cache : false, 
    .... 
}); 
+0

Cela fonctionne évidemment, mais ce n'est pas ce dont j'ai besoin. J'ai mis à jour ma question pour qu'elle soit plus claire: pourquoi je ne peux pas "écraser" le fichier en cache avec un rafraîchissement forcé de la page? – nico

Questions connexes