Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 13h09   #1
Membre éclairé
 
Homme
Développeur Sharepoint/Biztalk
Inscription : octobre 2008
Messages : 500
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur Sharepoint/Biztalk

Informations forums :
Inscription : octobre 2008
Messages : 500
Points : 398
Points : 398
Par défaut onLoad=setTimeout et ajax

Bonjour,

Je viens de créer un petit code sur une page HTML. J'aimerais que cette page appelle une fonction toutes les x secondes.

Voilà mon body :
Code :
<body onLoad="javascript:setTimeout('getNouveauxTotaux()',2000);">
J'ai également essayé avec :
Code :
<body onLoad="window.setTimeout('getNouveauxTotaux()',2000);">
Cette fonction getNouveauxTotaux fait appele a une fonction d'ajax comme ceci :
Code :
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
30
31
32
33
function getNouveauxTotaux()
{
	var requete = null;
    try 
	{
        requete = new XMLHttpRequest();
    } catch (essaimicrosoft) 
		{
        try {
			requete = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (autremicrosoft) 
			{
            try {
				requete = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (echec) 
				{
                    requete = null;
				}
			}
		}
 
	requete.onreadystatechange = function() 
	{ 
	if(requete.readyState == 4)
		{
			actualiserPage(requete);	
		}
	};
 
	requete.open("GET","GetVenteJSON.php",true); 
	requete.send(null);
 
}
Le code de la fonction actualiserPage() permet de récupérer 2 - 3 variables dans le fichier .php.

Mon problème est que la fonction du body fonctionne bien .. mais une seule fois ! Alors que c'est censer faire appeller toutes les 2 secondes ici en occurences, il y a un conflit avec l'ajax vous pensez ?

Je suis obligés de passer par cette fonction onload et settimeout ...

Merci !
bob633 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 13h15   #2
Membre éclairé
 
Homme
Développeur Sharepoint/Biztalk
Inscription : octobre 2008
Messages : 500
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur Sharepoint/Biztalk

Informations forums :
Inscription : octobre 2008
Messages : 500
Points : 398
Points : 398
J'ai honte .. en fait fallait juste que je relance me fonction setTimeOut à la fin de ma fonction actualiserPage()

Mais le setTimeOut ne suffit pas à lui seul normalement ?
bob633 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 13h20   #3
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Salut,

c'est setInterval qui fait des appels récurrents, setTimeout ne lance
qu'un appel.
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 16h34   #4
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Sinon, tu peux aussi faire:

Code :
1
2
3
4
5
6
if(requete.readyState == 4)
		{
			actualiserPage(requete);
			setTimeout(function(){getNouveauxTotaux()},2000);
		}
	};
A+
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 16h39   #5
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Attention au cas où une requête n'aboutit pas (coupure réseau temporaire).
la requete n'atteindra pas readyState 4 et il faudra rafraichir la page pour relancer le mécanisme.
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 16h46   #6
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Le readyState sera à 4 mais seulement le status ne sera pas à 200.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 14h54   #7
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Je ne pense pas non, le readystate est fixé à 4 quand une réponse
revient du serveur. Si le serveur réponds pas du tout je doute fort
que cela soit le cas.

EDIT: Voici une gestion de timeout ici
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 06h12   #8
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Citation:
Envoyé par marcha Voir le message
Je ne pense pas non, le readystate est fixé à 4 quand une réponse
revient du serveur. Si le serveur réponds pas du tout je doute fort
que cela soit le cas.
Je viens de faire un test, le readystate passe à 4 mais c'est le status qui n'est pas à 200.

EDIT: 200 mais pas 400
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 10h06   #9
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Peux tu détailler ton test que je reproduise stp ?
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 10h17   #10
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270


Premier test,

J'ai créé un fichier php avec quelque echo et un sleep pour faire un peu durée la requête, pendant l’exécution du fichier php suite à la requête Ajax, j'arrête apache au bon milieu. le readyState passe à 4 après quelque temps mais le status n'est pas à 200.

Deuxième test,
J'appelle tous simplement un hote qui n'existe pas, au bout de certains temps, le readyState passe à 4 mais le status n'est pas à 200.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 21h28   #11
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Merci, tu peux poster le code que je test chez moi ?
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 16h58   #12
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function testAjax()
{
   var xhr=createXHR();
   xhr.open("POST", "page.php",true);
   xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   xhr.onreadystatechange = function()
   {
      if(xhr.readyState == 4)
      {
         if(xhr.status == 200)
         {
            alert(xhr.responseText);
         }
         else
         {
            alert("Erreur: " + xhr.status);
         }
      }
   }
   var valeur = select.options[select.selectedIndex].value;
   var variable = 'variable=variable';
   xhr.send(variable);
}
Code php :
1
2
3
4
5
6
7
<?php
echo $_POST["variable"]."\n";
echo $_POST["variable"]."\n";
sleep(60);// en secondes
echo $_POST["variable"]."\n";
echo $_POST["variable"]."\n";
?>

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h45   #13
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
Salut,

Merci pour ton code je viens de m'amuser à tester ce que tu as fais
et j'observe en effet que lorsque je kill le process apache ou que je
stop apache normalement, la requête abouti à un ready state 4 et
le contenu partiel avant le sleep est affiché.

Cependant d'une point de vue TCP/IP (sans être un spécialiste) ce n'est
pas pareil à une coupure réseau. On a une connexion fermée ou qqch
comme ça.

Je te propose de faire le test suivant depuis chez toi:

1) tu lance ta requête ajax sur ton code php (toujours avec sleep 60)
2) tu attends 5 secondes environ
3) tu retire le câble réseau de ton PC
4) tu attends 2 minutes
5) tu le rebranche

Et là, on passe pas en ready state 4, c'est "pending" depuis 15 minutes
chez moi, je vais voir si j'ai la patience d'attendre encore

C'est pour palier à ce cas de figure que je proposais d'utiliser setInterval
au lieu de setTimeout.

Cependant ma proposition risque d'induire un autre problème:

Le nombre de requêtes xhr simultanées vers un même serveur est limité
par le navigateur (par exemple pour FireFox voir la note en jaune)

Donc si le réseau a plusieurs coupures on risque d'arriver à cette limite
en rouvrant des requêtes avec setInterval.

Qu'en pensez-vous ?
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h52   #14
Rédacteur/Modérateur
 
Avatar de marcha
 
Homme Marc Chappuis
Développeur Web
Inscription : décembre 2003
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Marc Chappuis
Âge : 41
Localisation : Suisse

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2003
Messages : 1 535
Points : 2 206
Points : 2 206
J'ai eu un ready state 4 après env. 45 minutes sur FireFox avec un status = 0
prévois de faire ton test avant le souper :-)
__________________
Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !
marcha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 18h27   #15
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Citation:
Envoyé par marcha Voir le message
Donc si le réseau a plusieurs coupures on risque d'arriver à cette limite
en rouvrant des requêtes avec setInterval.

Qu'en pensez-vous ?
En déclarant des variables globales
ensuite
Code :
1
2
3
4
5
6
7
8
b = setTimeout(function(){requete.abord(); if(a!=null) clearInterval(a);getNouveauxTotaux() }, 120000);
if(requete.readyState == 4 ){
		if (requete.status==200){
			actualiserPage(requete);
		}
		if(a!=null) clearInterval(a);
		a = setTimeout(function(){getNouveauxTotaux(); clearInterval(b)},2000);
};
ou bien?
Je ferai le test quand j'aurai un peu de temps. Merci pour tes résultats.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 20h06   #16
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 126
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 126
Points : 7 270
Points : 7 270
Petite correction,
Code :
1
2
3
4
5
6
7
8
9
a=null;
b = setTimeout(function(){requete.abord(); if(a!=null) clearTimeout(a);getNouveauxTotaux() }, 120000);
if(requete.readyState == 4 ){
		if (requete.status==200){
			actualiserPage(requete);
		}
		if(a!=null) clearInterval(a);
		a = setTimeout(function(){getNouveauxTotaux(); clearTimeout(b)},2000);
};
clearTimeout au lieu de clearInterval et remettre a à null.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h58.


 
 
 
 
Partenaires

Hébergement Web