11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour tout le monde.

J'ai un petit soucis avec une galerie Flash associée à un système d'upload.
J'utilise SimpleViewer pour la galerie et une version modifiée de SWFUpload pour l'envoi des images.

Pour fonctionner la galerie lit un fichier XML qui contient le nom des images et l'ordre dans lequel les afficher. Jusque là rien de bien tordu.

Seulement lorsque j'envois une image je souhaiterai faire en sorte que la galerie s'actualise. Seulement un simple F5 voir même un Ctrl+F5 n'est pas suffisant. Apparemment seul le Flash se recharger à fond, le XML qui est déjà en cache ne bouge pas. Pour que tout se mette à jour il faut que j'ouvre directement le fichier gallery.xml dans le navigateur, que je fasse F5, et que je revienne à la galerie. Bon pour moi c'est juste 5 secondes de plus à dépenser mais normalement ce système d'upload sera utilisé par des utilisateurs divers (je me vois mal mettre un texte "veuillez aller sur ce lien et actualiser la page, puis revenir"...

J'ai cherché un peu sur le web et pour le moment j'ai trouvé deux fonctions qui pourraient avoir une certaine utilité :
window.location.reload()

et
window.location.replace()


Seulement le premier, même en mettant "true" en paramètre, ne recharge pas le XML, et le second ouvre donc simplement le XML dans le navigateur.

Y'aurait-il une alternative ou bien une option cachée dans l'une de ces deux fonction qui pourrait m'être utile ?

Un grand merci d'avance.
Modifié par Walien (23 Jun 2009 - 11:03)
Pour éviter tout problème de cache au chargement de ton flash si tu utilises comme sur l'exemple de SimpleViewer, SWFObject, il te suffit de modifier la ligne qui spécifie le chemin vers ton XML :

fo.addVariable("xmlDataPath", "gallery.xml?" + new Date().getMilliseconds());

Ainsi le chemin vers ton XML sera virtuellement différent pour ton browser, du coup il le rechargera à chaque fois.
Bonjour,

Ça ne se gère pas en JavaScript, mais du côté de la configuration serveur.

Si le fichier XML ne doit pas du tout être mis en cache, utiliser un Cache-Control: no-store (en-tête HTTP).

Si le fichier XML doit être rechargé lorsqu'il est mis à jour, deux solutions:

1. Gérer le cache pour que le navigateur fasse systématiquement une requête conditionnelle («si le fichier machin a été mis à jour depuis tel jour à tel heure -- le moment où j'ai récupéré ce fichier pour le placer en cache --, envoie moi le contenu, sinon envoie moi http://www.google.fr/support/webmasters/bin/answer.py?answer=40132une réponse 304 (fichier non modifié) Smiley url »). Ça fait une requête HTTP systématique, mais pas de téléchargement (ce qui n'a un intérêt fort que si le fichier est un tout petit peu volumineux, genre au moins quelques Ko).

2. Gérer le cache avec une date d'expiration loin dans le futur, et gruger le navigateur en rajoutant un faux paramètre (inoffensif) dans l'URL pour le forcer à charger une nouvelle version. Donc pour une version donnée tu as dans ta page HTML:
blabla="machin.xml?v=158"
et lors de la mise à jour du XML tu incrémentes le numéro, ce qui te donne
blabla="machin.xml?v=159"

Le fichier demandé au serveur par le navigateur reste le même. Ce paramètre (s'il n'est pas utilisé explicitement pour générer ton fichier de manière dynamique) n'a aucune conséquence, à part le fait de modifier l'URL... et donc de forcer le navigateur à récupérer ce nouveau document et à créer une nouvelle entrée en cache.
Alpher a écrit :
Ainsi le chemin vers ton XML sera virtuellement différent pour ton browser, du coup il le rechargera à chaque fois.

Un Cache-Session:no-store fait la même chose, et c'est du HTTP natif. Smiley smile
Merci beaucoup pour les indices mais je ne vais même pas pouvoir tester toutes ces idées intéressantes parce que j'ai réussi avec une autre méthode.

En fait de manière plus simple il fallait juste que je reprenne les deux lignes d'appel de la galerie flash

var fo = new SWFObject("viewer.swf", "viewer", "1200", "600", "8", "#181818");

fo.write("flashcontent");


directement intégré dans la fonction de fin du SWFUpload... En gros à la fin j'ai ça :


.bind('uploadComplete', function(event, file){
			//$('#log').append('<li>Upload complete - '+file.name+'</li>');
			// upload has completed, lets try the next one in the queue
			var fo = new SWFObject("viewer.swf", "viewer", "1200", "600", "8", "#181818");
			fo.write("flashcontent");	
		})


Et là quand le flash est recréé ben il trouve direct le XML modifié (étrange Smiley ohwell ).

L'avantage de cette technique est que je n'ai même pas à faire F5 pour recharger. La galerie se recharge toute seule à la fin de l'upload.

Désolé de vous avoir dérangé ^^.

Merci beaucoup quand même pour les infos, ça pourra toujours servir si je retombe sur un problème du genre.
Florent V. a écrit :

Un Cache-Session:no-store fait la même chose, et c'est du HTTP natif. Smiley smile

Ouep, je proposais juste une solution plus simple !

Et oui, effectivement, tu peux tout simplement relancer SWFObject, c'est bourrin mais ça a le mérite de fonctionner.