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 :

[AJAX] Rafraichissement div avec IE


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Points : 17
    Points
    17
    Par défaut [AJAX] Rafraichissement div avec IE
    Bonjour,

    je m'amuse actuellement a coder un chat en AJAX.

    Sous firefox, tout fonctionne parfaitement.

    Voilà comment j'ai procédé pour coder ce chat :

    Un fichier chat.txt qui contient l'historique de la conversation, dont le contenu est demandé par le navigateur client toutes les 3 secondes via une requête AJAX.

    Les utilisateurs ajoutent à ce fichier leurs messages.

    Cependant, sous IE, lorsque l'utilisateur envoi un message, il modifie bien le fichier chat.txt, mais le problème vient de l'affichage.

    En effet, il semblerait qu'IE ne tienne pas compte des modifications du fichier (je veux dire par la qu'il affiche toujours le contenu du fichier au moment du chargement de ma page de chat).

    Un peu de code pour y voir plus clair :

    Le fichier php qui gère l'historique (pas encore gérer l'effacement des messages trop ancien )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
     
    if (isset($_GET['msg'])){
            $msg = $_GET['msg'];
            $file=fopen("chat.txt","a");
            fwrite($file, $msg."<br />\n");
            fclose($file);
    }
    ?>
    La fonction qui est censé actualiser la fenêtre des messages (appelé toutes les 3 secondes, un alert() me prouve que la fonction est bien appelé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	function readFile(){
    		var messages = "chat.txt";
    		var xhr = getXHR();
    		xhr.onreadystatechange = function(){
    			if(xhr.readyState==4 && xhr.status==200) 
    				document.getElementById("messages").innerHTML=xhr.responseText;
    		}
    	xhr.open("GET", messages, true);
    	xhr.send(null);
    	}
    J'appel cette fonction même si c'est pas très propre de redéfinir a chaques fois la fonction onreadystatechange :s. Modification à venir .

    Et enfin l'appel à la fonction toutes les 3 secondes (dans les balises <head> de ma page principale de chat) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		<script type="text/javascript">
    			setInterval("readFile()", 3000);
    		</script>
    Les messages envoyé via IE modifient bien de manière correct le fichier chat.txt (les modifs apparaissent bien toutes les 3 secondes sous Firefox), je sais plus quoi faire là :/.

    Petite particularité : lorsque je ferme IE et le réouvre, là il prend en compte les modifs !

    Un coup de main serait le bienvenue si jamais quelqu'un a déjà eu ce problème...

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de d-Rek
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2007
    Messages : 438
    Points : 455
    Points
    455
    Par défaut
    Deux choses très importantes à savoir sur IE :
    IE ne dispose que de 2 threads/sockets pour XMLHttpRequest
    IE gère très mal son cache

    Ajoute du bruit à ta requête qui la rendrait unique..
    genre :
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    xhr.open('get', 'http://www.domaine.com/page.html?param=1&BreakIEcache='+Math.round(Math.random()*10000), true);

  3. #3
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par d-Rek Voir le message
    Ajoute du bruit à ta requête qui la rendrait unique..
    Autre possiblité, paramètre correctement la réponse de ton serveur, à l'aide de headers HTTP (Expire, Pragma et autres).

    Mais effectivement, le problème vient du cache de IE....

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Merci de vos réponses.

    J'ai vu sur un post assez récent que le problème venait du cache d'IE, j'ai donc essayer de modifier le header en ajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    header("Cache-Control: no-cache, must-revalidate");
    ?>
    Mais toujours le même problème (je m'y suis mal pris ?).

    Je vais essayer d'ajouter du bruit à la requête même si je trouve pas cela "très propre".

  5. #5
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par Minority Voir le message
    Mais toujours le même problème (je m'y suis mal pris ?).
    Pour IE, je crois qu'il prends surtout en compte la balise Expire.


    Voilà ce que ça donne en ASP :
    Code asp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <% Response.CacheControl = "no-cache" %>
    <% Response.AddHeader "Pragma", "no-cache" %>
    <% Response.Expires = -1 %>
    http://support.microsoft.com/kb/234067

    Ca devrait pas être trop dur à traduire en PHP

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Bon, je crois que je vais laissez tomber la solution "propre" avec IE... .

    Voilà le début de mon fichier de ma page principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    header("Cache-Control: no-cache, must-revalidate");
      header("Pragma: no-cache" );
      header("Expires: -1" ); /*J'ai aussi essayer en mettant une date comme <a href="http://fr.php.net/header" target="_blank">ici</a>*/
    ?>
    Toujours le même problème, à savoir que le fichier d'historique de conversation est bien modifier, mais pas mis à jour sous IE.

    Merci pour votre aide les gens .

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Petite précision : la méthode de d-Rek d'ajouter du bruit fonctionne très bien

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

Discussions similaires

  1. [AJAX] - Rafraichissement d'un DIV avec setTimeOut
    Par Seb06 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/03/2011, 00h07
  2. [AJAX] AJAX affichage DIV avec nom dynamique
    Par Orelz dans le forum AJAX
    Réponses: 2
    Dernier message: 30/07/2009, 10h02
  3. [AJAX] Remplissage d'un div avec Firefox
    Par arouze dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/01/2007, 12h28
  4. [AJAX] rafraichissement d'un Div en Ajax
    Par Azanael dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/05/2006, 15h06
  5. ajax,rafraichissement avec une liste deroulante
    Par klimero dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/04/2006, 09h41

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