HELP plz ! Ajax javascript httprequest

zek -  
zek27 Messages postés 7 Statut Membre -
Bonjour, Voila j'ai un petit soucie... Je debute en codage javascript, ajax... J'aimerais creer une page que quand je la demarre,
il y a une requete qui regarde si le site internet est accessible ( url bonne)
si oui
sa m'envoi sur le site
sinon
sa m'envoi sur une page que j'ai en local.
Il faut obligatoirement que sa fonctionne sous mozilla.
j'arrive a faire en sorte d'aller sur le site internet mais pas sur la page local ...
Mon soucie viens au niveau du readyState.. faudrais qu e je fasse en sorte que si readyState se bloque avant 4 sa m'envoi sur la page local... en esperant que vous pourrez m'aider ! merci d'avance.
voici le code:
<html> <head> <title>TEST</title> 
<script> 
function Initialize() 
{ 
   try{
          req=new ActiveXObject("Msxml2.XMLHTTP"); 
       } 
       catch(e) { 
                      try{ 
                          req=new ActiveXObject("Microsoft.XMLHTTP"); 
                          } 
                         catch(oc){ 
                                  req=null;
                           }
                      } 
         if(!req&&typeof XMLHttpRequest!="undefined") 
         { 
                  req=new XMLHttpRequest(); 
         } 
} 

function Eror() 
{ 
           location.href='page_interne.html'; 
           sleep(1000); 
} 

function Process() 
{ 
         if (req.status == 0) 
         { 
                  if(req.responseText!="") 
                  { 
                                    var data = req.responseText; 
                                    location.href='http://www.google.fr'; 
                                    sleep(1000); 
                  } 
          } 
          else{ 
                    alert('Erreur de status'); 
          } 
} 

function SendQuery() 
{ 
        Initialize(); 
        var url="https://www.google.fr/?gws_rd=ssl"; 
     
        if(req!=null) 
        { 
                req.onreadystatechange = function() 
               { 
                        if(req.readyState == 4) 
                        { 
                                  Process(); 
                        } 
                } 
               req.open("GET", url, true); 
               req.send(null); 
          } 
} 

function BodyLoad() 
{ 
             SendQuery(); 
} 

</script></head>
<body onload="BodyLoad();"> 
</body> 
</html>
Configuration: Linux
Firefox 3.0

7 réponses

  1. Mimiste Messages postés 1159 Statut Membre 206
     
    if(req.readyState == 4 && req.status == 200)
    {
    Process();
    }
    else
    {
    Eror();
    }

    le status prend les valeurs

    200 si la page est dispo

    404 si non trouvé

    503 si indisponible

    etc....
    0
  2. zek
     
    cela ne fonctionne pas.... car en faite si je met cela.
    le else se lancera bien avant qu'il arrive à 4 et donc si la page est disponible il enverras sur le local quand meme car il passe à 1 2 3 avant 4... faudrais que j'arrive a faire que si readyState reste bloquer avan 4 j'envoi sur le local...mais je sais pas si c'est possible.
    mais merci quand meme ^^
    0
    1. Mimiste Messages postés 1159 Statut Membre 206
       
      Ouai mais toute façon il arrivera forcement a 4 a un moment donné
      0
  3. zek
     
    bah non justement.... en faite si je met une url fausse au depart a la place de google... et bien readyState s'arrete à 2...
    0
  4. PhP Messages postés 1774 Statut Membre 606
     
    Bjr

    ben oui c'est normal ! si pour une raison ou pour une autre ta requête AJAX ne peut être exécutée, readyState ne prendra jamais la valeur 4 ... 4 c'est lorsque tout s'est déroulé correctement

    Pour palier à ce problème j'associe systèmetiquement un timer avec setTimeout à chacune de mes requêtes avec un délai paramètrable (60 secondes en général). J'initialise le timer lors du req.send() et je l'annule lorsque readyState passe à la valeur 4 : dans ce cas la fonction associée à mon timer n'est jamais exécutée. Par contre si au bout de 60 secondes ,par ex, readyState n'est pas passé à 4 alors je déclenche une erreur de Timeout et j'annule la requête AJAX
    et bien sûr j'avertis l'utilisateur et/ou j'appelle une procédure Javascript.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zek
     
    oki Php donc moi faudrais que je fasse un timer qui s'annule au bout d'un moment si readyState est pas passer a 4 et ensuite au lieu d'avertir l'utilisateur, je renvoi sur la page local ... pour stop un timer c'est killtimer aussi ?
    0
  7. PhP Messages postés 1774 Statut Membre 606
     
    hum autant pour moi Mimiste a vu juste on passe quand même en readyState 4 dans certains cas même si la réquête échoue. Par ex normalement on ne peut pas appeller une page via AJAX hors de son domaine : https://www.google.fr/?gws_rd=ssl n'est pas autorisé sauf depuis le serveur de Google Mais dans ce cas le status retourné n'est pas égal à 200

    J'ai adpaté un peu ton code

    <html> <head> <title>TEST</title> 
    <script> 
    var timerID=null;
    var timeOutError = false;
    var req=null;
    
    function Initialize() 
    { 
       try{
              req=new ActiveXObject("Msxml2.XMLHTTP"); 
           } 
           catch(e) { 
                          try{ 
                              req=new ActiveXObject("Microsoft.XMLHTTP"); 
                              } 
                             catch(oc){ 
                                      req=null;
                               }
                          } 
             if(!req&&typeof XMLHttpRequest!="undefined") 
             { 
                      req=new XMLHttpRequest(); 
             } 
    } 
    
    function Eror() 
    { 
               location.href='page_interne.html'; 
               sleep(1000); 
    } 
    
    function Process() 
    { 
    
    		
    		if (timerID != null) 
    		{
    			window.clearTimeout(timerID);
    			timerID = null;
    		}
    			
    		if (timeOutError)	
    		{
    			return;
    		}	
    		
             if (req.status == 200) 
             { 
                      if(req.responseText!="") 
                      { 
                                        var data = req.responseText; 
                                        location.href='http://www.google.fr'; 
                                        sleep(1000); 
                      } 
              } 
              else{ 
                        alert('Erreur de status'); 
              } 
    } 
    
    function SendQuery() 
    { 
            Initialize(); 
            var url="https://www.google.fr/?gws_rd=ssl"; 
         
            if(req!=null) 
            { 
                    req.onreadystatechange = function() 
                   { 	
    		   
                            if(req.readyState == 4) 
                            { 
                                      Process(); 
                            } 
                    } 
                   req.open("GET", url, true); 
                   req.send(null);
    			   
    			   // Appel de la fct TimeOut() au bout de 60"
    			   timeOutError = false;
    			   timerID = window.setTimeout("TimeOut()",60000);	
              } 
    } 
    
    function BodyLoad() 
    { 
                 SendQuery(); 
    } 
    
    function TimeOut()
    {
    	timeOutError = true;
    	// Interromp la requête
    	if (req && req.readyState != 4)
    	{
    		req.abort();
    	}
    
    
    	alert('Echec de la requête AJAX');
    	timerID = null;
    	
    }
    
    </script></head>
    <body onload="BodyLoad();"> 
    </body> 
    </html>

    note que j'ai remplacé if (req.status == 0) par if (req.status == 200)

    maintenant lorsque tu remplaces http://www.google.fr par http://www.google.ff
    et bien le TimeOut se déclenche

    Pour tester remplacer 60000 par 5000 par ex dans .setTimeout()
    0
  8. zek27 Messages postés 7 Statut Membre
     
    oua
    merci Php fais 2 jours que je suis dessus xD
    encore merci tu gere !!
    0