11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour
Quand un fichier "externe" (image, CSS ou JavaScript) se trouve dans le cache d'un navigateur alors que ce fichier a été modifié sur le site, il n'est pas évident de faire en sorte que ce fichier soit "oublié" par le cache.
Une des techniques consiste à faire des astuces du genre
<img src="monimage.jpg?20170103145235">
, c'est à dire que le nom du fichier ne soit pas le nom du fichier, mais quelque chose qui contienne une partie inutile et ignorée du serveur, simplement pour que le navigateur ne le retrouve pas dans son cache.
Je trouve cette astuce un peu lourde, et je ne suis du reste pas sûr qu'elle fonctionne correctement sur tous les navigateurs, même si je l’utilise faute de mieux depuis des années.

Je retombe sur ce problème à l'occasion d'un programme JavaScript que je suis en train d'écrire et qui a pour but de modifier le contenu d'un fichier du serveur.

An gros, pour être clair:
1) J'ai un fichier "description.js' qui contient essentiellement quelque chose du genre:
DESCRIPTION = {param1:valeur1, param2:valeur2, ...};

2) au chargement de certaines pages, ce fichier est pris en compte et cet objet "DESCRIPTION" est utilisé pour la mise en page
3) le propriétaire du site n'est pas un technicien, et donc modifier manuellement les paramètre d'un objet JavaScript en tenant compte des protections de guillemets par des antislashes et autres joyeusetés techniques n'est pas sa tasse de thé (et j'avoue que moi même je trouve cela particulièrement pénible à faire).
4) j'ai donc développé un programme qui affiche le contenu des paramètres dans un formulaire; il suffit demodifier les paramètre et d'appuyer sur "Mise à jour" pour que le fichier soit mis à jour sur le serveur.

Tout cela marche bien, sauf que la première chose qu'on a envie de faire dans ces cas là, c'est de regarder le résultat des modifications qu'on vient de faire. Et là, on a l'impression qu'il ne s'est rien passé, parce que le navigateur trouve le fichier "description.js" dans son cache et ne le recharge pas.

Question: connaîtriez vous un moyen par JavaScript de dire au navigateur de supprimer ce fichier de son cache? Ou toute autre technique permettant d'arriver au même résultat?

Merci de votre aide
Modifié par PapyJP (03 Jan 2017 - 15:13)
J'ai continué mes recherches.

Ce problème est maintes fois évoqué et tout le monde finit par conclure que la seule solution pratique est d'ajouter un ?bidule (ou peut-être #bidule) à la fin de l'url. le "bidule en question étant le plus souvent une date sous une forme quelconque.

J'ai donc adopté cette solution en attendant mieux, mais je crains qu'il n'y ait pas mieux
Bonsoir.

Sur cette page, les méthodes utilisées ne sont pas fondamentalement différentes mais la dernière a l'air plus sophistiquée...

Smiley smile
PapyJP a écrit :
... le "bidule en question étant le plus souvent une date sous une forme quelconque. J'ai donc adopté cette solution en attendant mieux, mais je crains qu'il n'y ait pas mieux

En fait cette solution peut être la meilleure comme la pire :

- Solution la pire, celle que je t'avais donnée sur un autre topic : un point d'interrogation APRES l’extension du fichier, lié à une date ou un numéro de version. Cette méthode annule potentiellement le cache sur les anciens navigateurs et prend de toute façon le pas sur les informations de cache déclarées dans le .htaccess ou dans l'entête du document html (si je configure une date d'expiration pour 30 jours mais que ma date en fin de fichier change tous les jours...).

- Le top du top : une date ou un numéro de version DANS le nom du fichier si change SEULEMENT au moment des modifications. Plus lourd à mettre en oeuvre que la solution précédente mais que du bonheur : aucun des inconvénients énoncés précédemment. Il faut un script modifiant à la fois le nom du fichier et le nom du chemin dans la page, une task configurée sous Grunt ou Gulp par exemple se lançant automatiquement si changement dans un dossier surveillé. Ça se fait très bien en javascript (puisqu'à priori on parle de sites statiques, les CMS n'ayant pas ce problème étant donné qu'ils gérent par défaut les fichiers dans des dossiers classés par date).
Encore grillé par Zelena !

Du coup je suis allé voir la page rapidement : ma piste javascript se rapproche de la solution 4 en php énoncée dans l'article susnommé.