IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

cache : vider le cacher sans rechargement


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut cache : vider le cacher sans rechargement
    Bonjour à tous !

    Ceci est mon premeir message dans ce forum et après beaucoup de recherches sans réponses, j'espere ne pas enfreindre de règles.

    Je developpe actuellement une application de galerie d'image en ajax (avec php comme langage serveur).

    tout marche bien, excepté, un problème lors de la suppression d'images. Lorsque je supprime l'image (en ajax) la page ne se recharge pas (c ce que je veux c pour ca que je le fais en ajax) mais si l'image est correctement supprimée, elle n'est pas supprimée de la mémoire cache. Je suis obligé de réactualiser la page, malgré les balise header() permettant de vider le cache pour que la suppression soit prise en compte à l'oeil de l'internaute.

    autrement, l'image supprimée semble toujorus présente pour l'internaute, ce qu iest problématique.

    autrement dit, le but serait de vider le cache dynamiquement, sans avoir a recharger toute la page. est-ce possible ? si oui, comment ?

    j'espere avoir été assez clair, et je vous remercie de vos réponses !

  2. #2
    Membre averti Avatar de magnus2005
    Profil pro
    Ingenieur SI
    Inscrit en
    Avril 2005
    Messages
    454
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingenieur SI

    Informations forums :
    Inscription : Avril 2005
    Messages : 454
    Points : 331
    Points
    331
    Par défaut
    Quel est ton probleme fonctionelle ?

    Au niveau technique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    but serait de vider le cache dynamiquement, sans avoir a recharger toute la page. est-ce possible ? si oui, comment ?
    Non pas explicitement et pas en javascript et/ou en HTML

    Au niveau technique pour contourner le probleme c est en generale d ajouter un timestamp a tes resources, mais la je vois pas quelle est le souci pour l'utilisateur ?

    Il revoit une ancienne image dans son browser ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    envoie ta requete avec un timestamp ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par magnus2005
    Au niveau technique pour contourner le probleme c est en generale d ajouter un timestamp a tes resources, mais la je vois pas quelle est le souci pour l'utilisateur ?

    Il revoit une ancienne dans son browser ?
    Exactement. En fait, lorsqu'un utilisateur supprime une de ses photos, je renomme la derniere photo de la base de données du même album avec omme nouveau nom le nom de la photo supprimée et je supprime la dernière entrée de la table dans ma base de données.

    Rien ne vaut un peu de code :

    Voici la requete ajax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    //On instancie l'objet Xhr
    var req_delete_photo = getHttpObject();
     
    // Suppression de la photo
    function delete_photo(photo, defaut)
    {
    	req_delete_photo.open('GET', 'modules/photos/delete_photo.php?photo=' + photo,true); //on passe la photo en parametre dans l'url
    	req_delete_photo.onreadystatechange = resp_delete_photo;
    	req_delete_photo.send(null);
    }
     
    function resp_delete_photo()
    {
    	$("photo_plus").style.display = "block"; //on rend le bloc "photo_plus" visible"
    	if (req_delete_photo.readyState == 4)
    	{
    		if (req_delete_photo.status == 200)
    		{	
    			$("photo_plus").innerHTML = req_delete_photo.responseText; //affichage de la reponse du serveur dans "photo_plus"
    			setTimeout("display_photo(0,-1)",100); //reafichage de la photo
    		}
    		else
    			$("photo_plus").innerHTML = "Suppression impossible en raison d'une erreur serveur";
    	}
    	else
    		$("message").innerHTML = "Suppression en cours...";
     
    }
    Et voici une petite partie du code php du fichier delete_photo.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
     
    $photo = $_GET['photo']; //photo correspond à l'url de la photo
    $last_photo = $photos[sizeof($photos)-1]->url; //last_photo est la derniere photo de l'album du même user
     
    unlink($photo); //on supprime la photo
    rename($last_photo,$photo); //on renomme la derniere photo
     
    $sql="DELETE FROM photos WHERE photos.id_user='$id' AND photos.url = '$last_photo'";
    $delete=db_query($sql);
     
    ?>
    Donc voila effectivement un timestamp peut être la solution mais comment l'intégrer ?

    Merci pour vos réponses !

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	req_delete_photo.open('GET', 'modules/photos/delete_photo.php?photo=' + photo+'& '+new Date(),true);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre averti Avatar de magnus2005
    Profil pro
    Ingenieur SI
    Inscrit en
    Avril 2005
    Messages
    454
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingenieur SI

    Informations forums :
    Inscription : Avril 2005
    Messages : 454
    Points : 331
    Points
    331
    Par défaut
    Pour le timestamp suffit de mettre du code bidon mais créeant une URL unique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var date = new Date();
    var myurl ="modules/photos/delete_photo.php?photo=" + photo +"&timestamp=" + date.getTime();
    xhr.open("GET",myurl,true);

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Je vous remercie, malheureusement ca ne marche toujours pas.

    J'ai rajouté le timestamp, mais malgré tout il ne vide pas le cache. aurais-je un problème avec mes header ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header('Pragma: no-cache');
    Ils sont présents dans la page php d'affichage de photo et dans la page php de suppression de photo delete_photo.php

    ou alors il y a une autre manipulation a faire avec le timestamp ?

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    en fait tu veux juste faire une mise à jour visuelle pour le client ...

    fais une petit fonction javascript qui supprimera l'element du visuel ....

    elle est l'image dasn le code de la page ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par SpaceFrog
    en fait tu veux juste faire une mise à jour visuelle pour le client ...
    Oui voila exactement, pour pas qu'il pense que son image n'a pas été supprimée

    fais une petit fonction javascript qui supprimera l'element du visuel ....
    oui je viens d'essayer avec un removeChild qui supprime le div dans lequel se trouve l'image malheureusement ca ne fonctionne pas...

    elle est l'image dasn le code de la page ?
    Comment ca ?

    en fait j'ai un div qui contient l'image et qui est généré par une requete ajax créée par la fonction javascript display_photo()

    Je sens qu'effectivement, tu as raison pour la fonction javascript. mais la mienne ne doit pas convenir. tu proposerais quoi ?

    merci encore !

  10. #10
    Membre averti Avatar de magnus2005
    Profil pro
    Ingenieur SI
    Inscrit en
    Avril 2005
    Messages
    454
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingenieur SI

    Informations forums :
    Inscription : Avril 2005
    Messages : 454
    Points : 331
    Points
    331
    Par défaut
    Montre voir ton code pour retirer le DIV contenant ton IMG ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    en fait, apres un peu de reflexion, je sais pas si c la solution car on peut charger plusieurs images dans le meme div que je supprime et ke je recreer dans la foulée avec un setTimeout().

    cela dit voici quand même le code javascript qui supprime l'element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function delete_element(conteneur, element)
    {
    	$(conteneur).removeChild($(element));
    }
    J'appelle cette fonction juste apres la reponse serveur de la requete ajax de suppression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $("photo_plus").innerHTML = req_delete_photo.responseText;
    delete_element("zone_photo","photo"); // suppression de l'element
    setTimeout("display_photo(0,-1)",100); // l'element est recréé grace a une nouvelle requete ajax qui est censé réaffiché une autre photo quelque secondes après

    Voici comment est placé mon image dans ma page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <div id="zone_photo">
        <div id="menu_photo">
        // menu photo qui permet de changer l'affichage de la photo pour afficher une autre photo, mais aussi de rajouter une photo et d'en supprimer une
        </div>
        <div id="photo"> // affichage de la photo
            <img src="<?= $photos[$i]->url ?>" width="200" alt="<?= $photos[$i]->titre; ?>" />
        </div>
    </div>
    Voila au final je crois que j'en reviens a mon problème de cache... non ??

  12. #12
    Membre averti Avatar de magnus2005
    Profil pro
    Ingenieur SI
    Inscrit en
    Avril 2005
    Messages
    454
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingenieur SI

    Informations forums :
    Inscription : Avril 2005
    Messages : 454
    Points : 331
    Points
    331
    Par défaut
    A mon avis c est ici que ça coince
    ton URL est reste la meme je suppose ?


  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par magnus2005
    A mon avis c est ici que ça coince
    ton URL est reste la meme je suppose ?
    Oui, en fait l'url de l'image supprimée existe toujours et est censée correspondre a une autre image (voir mon code php delete_photo.php) et j'aimerais que ce soit l'autre image qui s'affiche et pas celle qui a été supprimée...

  14. #14
    Membre averti Avatar de magnus2005
    Profil pro
    Ingenieur SI
    Inscrit en
    Avril 2005
    Messages
    454
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingenieur SI

    Informations forums :
    Inscription : Avril 2005
    Messages : 454
    Points : 331
    Points
    331
    Par défaut
    Ta fonction est trop ambigu pour moi
    Essai avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function delete_element(conteneur, element)
    {
    var par = document.getElementById(conteneur);
    var el = document.getElementById(element);
     par.removeChild(el);
    }
    Du coup ça va pas t avancer de supprimer l element dans la page

    Essaie d ajouter le timestamp a la fin de l URL de ton image.

    JE te le repete mais
    A priori il n ya aucun moyen de supprimer l element qui est dans la cache
    il faut lui faire comprendre que c est un nouveau.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Malheureusement ca revient exactement au même.

    Mais je pense que c'est normal étant donné que je recréer l'element quelques centiemes de secondes après sans avoir fait de rechargement de page entre temps.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par magnus2005
    Essaie d ajouter le timestamp a la fin de l URL de ton image.

    JE te le repete mais
    A priori il n ya aucun moyen de supprimer l element qui est dans la cache
    il faut lui faire comprendre que c est un nouveau.

    Oui je pense que c'est la seule solution, ou alors un nombre aléatoire...

    bon je vais essayer et je vous tiens au courant.

    en tout cas merci à toi !

  17. #17
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    le removeChild doit fonctionner

    et pour avoir la nouvelle image si tu veux faire une mise à jour d'une image sur la page, fait un timestamp dur le src aussi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.src="image.gif?"+new Date()
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    oui merci à tous les 2 !!

    effectivement c'était la solution ! le timestamp sur l'image.

    encore merci !!

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Images dans le cache
    Bonjour,

    J'ai pas tout pigé ci-dessus, mais j'ai aussi eu un problème avec les images supprimées qui s'affichaient quand même à cause du cache du navigateur, solutionné via les valeurs aléatoires utilisées dans le nom de fichier-photo...
    Voici donc mes pérégrinations : http://ziprof.free.fr/PHP-MYSQL/forc...e-de-cache.php

    (Avec l'Url-Rewritting)

    Peut être cela suffira-t-il pour d'autres pékins dans le même cas que moi...

    A+ et bon courage +

    Phil
    http://www.mistercard.net http://www.livreoccasion.comhttp://www.i-prof.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vider 1 fichier sans le supprimer
    Par wodel dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2006, 16h03
  2. [PHP-JS] Envoi de fichier sans recharger la page
    Par goldorax113 dans le forum Langage
    Réponses: 8
    Dernier message: 30/05/2006, 17h43
  3. [C#][JS] Sur clic : message sans recharger la page
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 8
    Dernier message: 24/01/2006, 17h20
  4. Déplacement dans une page sans recharge
    Par EpOnYmE187 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/08/2005, 16h17
  5. Changer la police avec un select, sans recharger la page
    Par Netoman dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/12/2004, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo