Page 1 sur 1

Problème cache IE avec AJAX et tuto boites dynamiques

Posté : 28 juil. 2007, 16:17
par mike1155
Bonjour,

j'ai lu et appliqué le tuto de Cyrano http://www.phpfrance.com/forums/voir_sujet-4562.php

Sous Firefox, aucun problème, cela répond parfaitement à mes attentes mais j'ai un gros problème avec IE, le champ <span id="blocDepartements"></span> ne se met pas à jour et contient toujours les anciennes valeurs.

Pourtant, le javascript se déclenche correctement.

J'ai essayé ceci:

Code : Tout sélectionner

function actualiserannee() { var listeannee = requete.responseText; var blocListe = document.getElementById('blocannee'); alert(listeannee); blocListe.innerHTML = listeannee; }
Et l'affichage de listeannee n'est pas actualisé.

Avez-vous une piste pour m'aider à résoudre ce problème...sachant que sous Firefox, tout fonctionne parfaitement!

Merci

Posté : 28 juil. 2007, 19:34
par Invité
qelle methode utilises tu :
php javascript ou ajax?
:D

Posté : 28 juil. 2007, 19:39
par Invité
t' embets pas avec ce que je viens de dire ??? pfff... :oops:

Posté : 30 juil. 2007, 14:16
par mike1155
Méthode AJAX....bizarre mais j'avais placé un onclick sur <option> et il me semble que ce n'est pas reconnu par IE...

Je poursuis mes tests

Posté : 30 juil. 2007, 14:18
par Truc
Mj'avais placé un onclick sur <option> et il me semble que ce n'est pas reconnu par IE...
tout à fait... un "onchange" dans <select> est bien mieux

Posté : 30 juil. 2007, 15:56
par mike1155
Merci mais mon autre prolème demeure.... :(

Si je lance le premier script php qui génère la seconde liste déroulante directement depuis mon navigateur, tout est parfait (Firefox et Internet Explorer);

Si je l'applique à traver le script javascript, il y a un problème au niveau de la requete, les données ne semblent pas s'actualiser sous Internet Explorer....

Je sèche complètement là! Merci si vous aviez une piste...

Posté : 30 juil. 2007, 16:12
par Truc
A tout hasard essaie de remplacer :
document.getElementById('blocannee');
blocListe.innerHTML = listeannee; 
par
document.getElementById('blocannee').innerHTML = listeannee; 
Les données renvoyées par ajax sous IE sont correctes ou l'erreur est avant ?

Posté : 30 juil. 2007, 16:17
par Hubert Roksor
Au pire tu peux essayer de remplacer innerHTML par innerText. Si rien ne marche, poste un lien vers la page en question.

Posté : 30 juil. 2007, 18:03
par mike1155
Merci pour votre aide, mais cela ne change toujours rien :(

La page est une page réservée à des membres inscrits, je vais essayer d'isoler mes scripts dans un dossier séparé, je vous tiens au courant et si cela ne marche toujours pas, je posterai le lien vers ce dossier ici...

Merci beaucoup

Alors voilà, rien à voir avec le rafraîchissement, ou en tout cas un autre problème apapraît avant, c'est le passage du paramètre idj que je récupère avec un $_GET['idj']

Voici mes trois fichiers:
Le fichier de base form1.php, contient le formulaire initial:

Code : Tout sélectionner

<script type="text/javascript" src="annee_xhr.js" charset="iso_8859-1"></script> <?//début script page echo'<h2><b>Débugage AJAX - Choisis un joueur</b></h2>'; // on remplit le tableau avec les joueurs $visu_ok[]='joueur1'; $visu_ok[]='joueur2'; //on construit la boite echo '<select onchange="getannee(this.value);" name="visu_ok" size="1"> <option value="vide">choix du joueur</option>'; foreach($visu_ok as $value) {echo '<option >'.$value.'</option>';} echo '</select><span id="blocannee"></span><br /> '; ?>


Le fichier intermédiaire php appelé par le js

Code : Tout sélectionner

<?php include('../param_actuel.inc'); /** * Code qui sera aeeplé par un objet XHR et qui * retournera la liste déroulante des saisons disponibles * correspondant au joueur sélectionné. */ /* On récupère l'identifiant du joueur choisi. */ if (isset($_GET['idj'])) {$idj = $_GET['idj']; echo('Tu as clique '.$idj); } /* Sinon on retourne un message d'erreur */ else { echo("<p>Une erreur s'est produite. Le joueur sélectionné comporte une entrée invalide.</p>\n"); } ?>
et finalement mon fichier js

Code : Tout sélectionner

/** * Lister les année d'un joueur avec un objet * XMLHTTPRequest. */ /* Création de la variable globale qui contiendra l'objet XHR */ var requete = null; /** * Fonction privée qui va créer un objet XHR. * Cette fonction initialisera la valeur dans la variable globale définie * ci-dessus. */ function creerRequete() { try { /* On tente de créer un objet XmlHTTPRequest */ requete = new XMLHttpRequest(); } catch (microsoft) { /* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */ try { requete = new ActiveXObject('Msxml2.XMLHTTP'); } catch(autremicrosoft) { /* La première méthode a échoué, on en teste une seconde */ try { requete = new ActiveXObject('Microsoft.XMLHTTP'); } catch(echec) { /* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */ requete = null; } } } if(requete == null) { alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.'); } } /** * Fonction privée qui va mettre à jour l'affichage de la page. */ function actualiserannee() { var listeannee = requete.responseText; var blocListe = document.getElementById('blocannee'); blocListe.innerHTML = listeannee; } /** * Fonction publique appelée par la page affichée. * Cette fonction va initialiser la création de l'objet XHR puis appeler * le code serveur afin de récupérer les données à modifier dans la page. */ function getannee(idj) { /* Si il n'y a pas d'identifiant de région, on fait disparaître la seconde liste au cas où elle serait affichée */ if(idj == 'vide') { document.getElementById('blocannee').innerHTML = ''; } else { /* À cet endroit précis, on peut faire apparaître un message d'attente */ var blocannee = document.getElementById('blocannee'); blocannee.innerHTML = "Traitement en cours, veuillez patienter..."; /* On crée l'objet XHR */ creerRequete(); /* Définition du fichier de traitement */ var url = 'cherche_annee.php?idj='+ idj; /* Envoi de la requête à la page de traitement */ requete.open('GET', url, true); /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */ requete.onreadystatechange = function() { /* Lorsque l'état est à 4 */ if(requete.readyState == 4) { /* Si on a un statut à 200 */ if(requete.status == 200) { /* Mise à jour de l'affichage, on appelle la fonction apropriée */ actualiserannee(); } } }; requete.send(null); } }
Merci pour votre aide

PS: La démo ici

Posté : 11 août 2007, 11:21
par zefoots
Bonjour,

header("Cache-Control: no-cache");

au début du fichier php ...

Posté : 11 août 2007, 11:34
par zefoots
Rebonjour,

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');


fonctionne encore mieux ...