Pb AJAX sous IE [Résolu]

Signaler
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012
-
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012
-
bonjour,

j'ai créé un mini projet où j'ai 3 fichiers :
- 1 fichier html : pour affichier ma page
- 1 fichier javascript : script lié à ma page html
- 1 fichier cgi (mis à jour dynamiquement par le serveur en interne) : il contient des variables parsée en JSON

=> j'affiche ma page HTML et j'utilise en script (AJAX) qui se lance toutes les 5secondes et qui va chercher dans le fichier cgi mes variables pour les afficher

tout fonctionne bien sous FireFox mais je ne sais pas pourquoi, sous IE (6 et 7) la page met les variables a jour au demarrage une fois puis ne le fait plus
=> le probleme est que sous IE je rentre toutes les 5s dans la boucle


if
(http_request.status == 200)


même si mon cable reseau est debranché !!???!!

voici mon projet :
http://cjoint.com/?lqrVZsvbxE

voila le code si vous preferez ne pas telecharger le fichier :

fichier Index.html :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
        <script type="text/javascript" src="RecupereVariables.js"></script>
    </head>
   
   
    <!-- -->
        <noscript> La page ne peut pas être affichée correctement car Javascript n'est pas activé</noscript>
       
       
                Lancer la requete
       
       
        Etat Communication : ?

        Etat refresh1 : ?

        Etat refresh2 : ?

       
        SerialNumber : ?

        Temperature : ?°C

        Batterie : ?V

        UpTime : ?

        Tempo : ?

        Optic1 : ?

        Optic2 : ?

        Optic3 : ?

        PowerON1 : ?

        PowerON2 : ?

        PowerON3 : ?

        ReveilEnb1 : ?

        ReveilEnb2 : ?

        ReveilEnb3 : ?

       
   
</html>

fichier RecupereVariables.js :

var fichier_json = "./data.cgi";
var http_request = false;
var num_refresh1 = 0;
var num_refresh2 = 0;
var num_connection = 1;
var num_connectionbefore = 0;
var num_connectionOK = 0;

function fonction_start()
{
   
    num_connectionOK = 1;
    makeRequest();
    setInterval(function(){makeRequest();},5000); // boucle toutes les 5s   
}

function makeRequest()
{
    http_request = false;
    num_refresh1++;
   
    document.getElementById("refresh1").innerHTML = num_refresh1; // detection de connection
   
   
    /*if (num_connectionbefore == num_connection)
    {
        document.getElementById("ComStatus").innerHTML = "OFF";
    } else {
        document.getElementById("ComStatus").innerHTML = "ON";
    }
    num_connectionbefore = num_connection;*/
   
    if (num_connectionOK == 1)
    {
        document.getElementById("ComStatus").innerHTML = "ON";
    } else {
        document.getElementById("ComStatus").innerHTML = "OFF";
    }
    num_connectionOK = 0;
   
   
    http_request = getXhr();       
   
    http_request.onreadystatechange = request_execute;
    http_request.open("GET", fichier_json, true);
    http_request.send(null);
}

function getXhr()
{
    var xhr = null;
   
    if(window.XMLHttpRequest) // Firefox et autres
       xhr = new XMLHttpRequest();
    else if(window.ActiveXObject){ // Internet Explorer
       try {
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
    }
    else { // XMLHttpRequest non supporté par le navigateur
       alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
       xhr = false;
    }
    return xhr;
}

function request_execute()
{
    //alert("execution de la fonction");
    //alert(http_request.status);
   
    if (http_request.readyState == 4)
    {
        if (http_request.status == 200) // page trouvée
        {
            eval(http_request.responseText);
           
            num_connectionOK = 1;
            document.getElementById("ComStatus").innerHTML = "ON";
           
            num_refresh2++;
            num_connection++;
                       
            document.getElementById("refresh2").innerHTML = num_refresh2;
           
            document.getElementById("SerialNumber").innerHTML = JSONvariables.SerialNumber;
            document.getElementById("Temperature").innerHTML = JSONvariables.Temperature;
            document.getElementById("Batterie").innerHTML = JSONvariables.Batterie;
            document.getElementById("UpTime").innerHTML = JSONvariables.UpTime;
            document.getElementById("Tempo").innerHTML = JSONvariables.Tempo;
            document.getElementById("Optic1").innerHTML = JSONvariables.Optic1;
            document.getElementById("Optic2").innerHTML = JSONvariables.Optic2;
            document.getElementById("Optic3").innerHTML = JSONvariables.Optic3;
            document.getElementById("PowerON1").innerHTML = JSONvariables.PowerON1;
            document.getElementById("PowerON2").innerHTML = JSONvariables.PowerON2;
            document.getElementById("PowerON3").innerHTML = JSONvariables.PowerON3;
            document.getElementById("ReveilEnb1").innerHTML = JSONvariables.ReveilEnb1;
            document.getElementById("ReveilEnb2").innerHTML = JSONvariables.ReveilEnb2;
            document.getElementById("ReveilEnb3").innerHTML = JSONvariables.ReveilEnb3;           
        } else if (http_request.status == 404){ // page non trouvée
            document.getElementById("ComStatus").innerHTML = "OFF";
        }
    }
}

fichier data.cgi :
var JSONvariables = {
    "SerialNumber": "%30",
    "Temperature": "%31",
    "Batterie": "%32",
    "UpTime": "%34",
    "Tempo": "%33",
    "Optic1": "%21",
    "Optic2": "%22",
    "Optic3": "%23",
    "PowerON1": "%24",
    "PowerON2": "%25",
    "PowerON3": "%26",
    "ReveilEnb1": "%27",
    "ReveilEnb2": "%28",
    "ReveilEnb3": "%29"
}

13 réponses

Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
2
Excuse moi .... je t'avais oublié

Bon ben je viens de reprendre ton code et moi ma méthode d'utiliser un hackTime marche parfaitement!!!!!! sans rien régler dans les navigateurs

voici la fin de la fonction qui envoie la requête :

........
........
http_request = getXhr();        

var hackTime = (new Date()).getTime();
http_request.onreadystatechange = request_execute;
http_request.open("GET", fichier_json+'?'+hackTime, true);
http_request.send(null);

après oui c'est sur ca dépend du type de serveur mais bon moi j'ai jamais eu de problème en utilisant ca et je l'utilise sous
apache avec php et même jsp

et l'url est sur d'être trouvée puisqu'en fait c'est comme si tu lui envoyais un paramètre en méthode GET :
fichier.cgi?0294087287
et ca fonctionne tout le temps car c'est le timestamp

voilà
bonne prog

@+

-- The Rubik's Man --
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
tu peux tester avec un 'delete http_request ' à la fin de ton request_execute ?

J'aime bien effacer des variables kan elles servent plus..

S.
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012

ça change rien

sous IE7, j'ai fait "outils" => "options internet" => "parametres
(hystorique de navigation)" => dans "vérifier s'il existe une
version plus recente...", j'ai coché le bouton "a chaque visite de
cette page web" (avant, c'etait sur automatique)


et la ça marche => c'est donc un probleme de mise en cache du fichier cgi ce qui empeche de le recharger a chaque appel

maintenant, comment faire pour le feinter ?
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

Bonjour,

vu que tu relances l'appel toutes les 5 secondes, n'y aurait-il pas un conflit entre l'appel x et l'appel x+1 ?
As tu essayé sans le timer ?

Nickadele
Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
2
Salut

En fait je ne comprends pas trop ton problème car moi sous firefox ou sur IE la requete ajax se lance bien toute les 5 secondes
et la variable refresh s'incrémente bien sur la page sur les 2 navigateurs.
Donc peux tu mieux expliquer ton problème stp??

Par contre j'ai voulu vérifier quelque chose en lancant la page et en modifiant moi meme les données dans la variables JSON et par contre sur aucun navigateur les données sont mise à jour quand je les modifie comme si c'était le serveur qui le faisait.

voila

-- The Rubik's Man --
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012

J'ai bien la variable refresh qui fonctionne : le probleme est que si je change une valeur de variable dans le fichier cgi pendant l'execution du script, elle n'est pas mise à jour => je suis sure que c'est un probleme que IE mets le fichier en cache (je n'ai pas le probleme sous Firefox : par defaut, il doit être configuré differemment)
=> j'ai trouvé sur le net des personne qui avaient le même type de probleme : il modifiaient l'URL de façon a avoir un nom unique a chaque envoie en rajoutant un nombre aléatoire mais ça ne marche pas avec serveur qui est en fait un micro-controlleur (il n'accepte pas ce genre d'ecriture à priori : j'ai plus rien qui s'affiche)


var toto = fichier_json+"?cpt="+num_refresh1;
Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
2
Oui effectivement moi aussi j'utilise cette méthode pour les images sous IE car sous firefox j'ai pas le problème

Mais avec ton code sous Firefox j'ai également le meme problème que sous IE.

Je vais essayer des hacks et je te tiens au courant

-- The Rubik's Man --
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012

alors, tu ne trouve pas ? :( ... moi, je patauge complet dans la semoule ....
Messages postés
3426
Date d'inscription
lundi 26 décembre 2005
Statut
Membre
Dernière intervention
14 janvier 2011
14
B

onjour...

as tu essayé avec les balises meta...
<META HTTP-EQUIV" PRAGMA " CONTENT"NO-CACHE"><META HTTP-EQUIV" REFRESH " CONTENT"5">
à la place de setInterval...

;0)
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012

cette solution ne va pas (il me semble) : c'est pas une page web que je charge mais un fichier texte
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012

c'est bon, j'ai reussi a faire fonctionner ta methode : j'ai du modifier le code source de mon serveur (j'aime pas trop ça) car il n'acceptait pas ce genre d'ecriture => monchemin.cgi?toto=0101211
Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
2
Comment ca il n'accepte pas ce genre d'écriture???????

Il doit accepter cet url obligatoirement et sans rien changer normalement!!!! car c'est un paramètre passé en GET c'est la base!!
Donc je ne vois pas pourquoi ton serveur ne l'acceptais pas... c'est qu'il devait y avoir un problème.

-- The Rubik's Man --
Messages postés
42
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
17 juillet 2012

mon serveur n'est pas un PC, c'est une petite carte avec un micro-controlleur qui tourne a 25MHz : le programme de base acceptait d'avoir un parametre s'il recevait un SET mais pas un GET => j'ai donc fait la modif pour qu'il tronque l'URL reçue après le "?"