Plantage site après quelques minutes AJAX

Résolu
Utilisateur anonyme - Modifié le 15 oct. 2009 à 15:40
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 - 15 oct. 2009 à 15:40
Bonjour,

Me voilà confronter à un soucis plutôt emmerdant : j'utilise de l'AJAX sur une page de mon site qui va chercher toutes les 20 secondes sur une autre page le titre et une petit image (50x50) de ce qui passe sur une webradio dans une base de données mysql.

Tout se passe bien, seulement quelques personnes se sont plaintes par rapport à un problème qui arrive que très rarement sur ma machine (plutôt performante).
En effet, sur les PC un peu moins récent visiblement : après quelques minutes resté sur la page qui va chercher le titre en AJAX, même si cette page est en background, après quelques minutes, c'est TOUT Internet Explorer qui plante. Obligé de terminer le processus. Il est complètement planté.

Comment pourrais-je arranger ce soucis ?
Avez-vous déjà eu le cas ?

Merci à vous,

A++

21 réponses

Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 10:28
>>Bul3 pour faire vivre cette commaunautée
bof... il y en a d'autres et bien plus compétents !
>>notre sujet :
donc, ça me semble normal !
tu fais des appels sans attendre le retour !
( setInterval : la fonction peut-être
relancée même si la précédente n'a pas
répondu, et ça ne plait pas toujours )

perso, je ferais cela en asynchrone
et ne relancerais que lorsque
la réponse est revenue

du style :
function ajax()
{
...
xml.onreadystatechange = function()
{ if(xml.readyState == 4)
  { traitement de la réponse
    setTimeout(ajax,40000);
  }
}
xml.open(....,true)
xml.send
}
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 10:57
pas tout à fait
_ le test de readyState==4 doit être fait
dans une fonction activée lors du onreadystatechange
_ 3ème paramètre open = true pour asynchrone
_ setTimeout(ajax,40000);
pas testé, il reste peut-être des erreurs
function ajax()
{	if(window.XMLHttpRequest) // FIREFOX ou IE>=7
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE ( les vieilles version et pas toutes )
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.onreadystatechange = function()
{ 	if(xml.readyState == 4)
{	document.getElementById("onair").innerHTML = xhr_object.responseText;
setTimeout(ajax,40000);
}
}
xhr_object.open("GET", racine_site +'ajax/titre_onair.php', true);
xhr_object.send(null);
}
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 11:06
on se croise...
>>timeout ne marche plus
oui, oui

° setTimeout(ajax,40000);
s'il y a des paramètres :
° setTimeout( function() { fonctions(paramètres); }, délai );

setTimeout("ajax();",40000); à éviter dit-on et
setTimeout(ajax(),40000); pas la bonne syntaxe
ça doit donner une erreur même.... non ?
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 12:19
je dirais "aucune raison"
un <script src=....> c'est ni plus ni moins
qu'un copié/collé du contenu du .js là où on l'appelle.
donc si c'est au même endroit ça "doit" fonctionner.
"l'erreur est ailleurs"
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 12:37
<humour>allons, allons....
quand on programme, on ne fait pas
2 fois les mêmes choses !</humour>
on fait 1 seule fonction qu'on
appelle avec des paramètres

handicapé nasal ( ou néanmoins ) : si les 2 fonctions
se lancent "en même temps", c'est probablement du à
l'utilisation de variables globales ( ce
qui n'est pas bien ;o), avec des variables
locales ça devrait aller mieux
function Titre_Onair()
{	if(window.XMLHttpRequest) // FIREFOX ou IE>=7
xhr_object = new XMLHttpRequest(); ...
xhr_objet est globale puisque sans var ( ! )
et dans Titre_2 aussi , c'est donc la même variable
function Titre_Onair()
{	var xhr_object;
if(window.XMLHttpRequest) // FIREFOX ou IE>=7
xhr_object = new XMLHttpRequest(); ...
et la même chose dans Titre_2 bien sûr,
ça devrait le faire
mais "il faut" ne faire qu'une fonction !
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 10:07
Bonjour,
oui j'ai déjà eu au moins cas probablement semblable,
ça faisait planter tous les navigateurs d'ailleurs,
je ne me souviens plus quelle erreur je commettais.
sans plus d'infos, difficile de donner ( surtout
de penser à ) toutes les pistes envisageables
( ajax asynchrone et on n'attend pas correctement
le retour par exemple ! )
on peut voir un extrait ( l'appel ajax devrait
suffire ) ou avoir une adresse pour tester ?

enfin... pour moi si des bibliothèques de
fonctions ne sont pas utilisées, sinon :

Cordialement [mon Site] [M'écrire] Bul
0
Heureusement qu'il est la Bul3 pour faire vivre cette commaunautée

Voici mon code JS :

function changeTitre()
{
  intervalID = setInterval(ShowTitle, 400000);
}

function ShowTitle()
{
texte = file(racine_site +'ajax/titre_onair.php');
document.getElementById("onair").innerHTML = texte;
changeTitre();
}

function file(fichier)
{
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.open("GET", fichier, false);
xhr_object.send(null);
if(xhr_object.readyState == 4) return(xhr_object.responseText);
else return(false);
}




Merci à toi,

A++
0
Ok je vois mieux le pourquoi du comment...

function ajax()
{
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.open("GET", racine_site +'ajax/titre_onair.php', false);
xhr_object.send(null);
if(xhr_object.readyState == 4){
   document.getElementById("onair").innerHTML = xhr_object.responseText;
   setTimeout(ajax(),40000);

  }
else return(false);
}



Comme ceci ca te parait bien ?

A++
0
En fait, apparement le timeout ne marche plus dans le code juste au dessus car il ne rafraîchit plus mon titre :(

A++
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 10:59
il fallait "bien entendu" lire :
xhr_object.onreadystatechange = function()
{ if(xhr_object.readyState == 4)
mais c'est parti trop vite,
sans préjuger du reste !
0
Il charge bien la première fois au démarrage du script mais après il ne refraîchit plus > Le TimeOut n'a pas l'air de contionner... Pourtant il a du se lancer vu qu'il y a bien eu un innerHTML au premier lancement du script...

A++
0
Arghhh, j'ai mis le script sur une nouvelle page html avec rien que ca et ca marche nickel...
Seulement sur mon site il ne rafraîchit pas... surement un autre script qui fait foirer le truc...

Je vais voir ou ca coince...

A++
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 11:27
nickel si ça baigne ( ou presque ;o)
reste des "détails" à fignoler quoi..
0
Yes !

merci beaucoup !

j'espère que il ne fera plus planter les naviguateurs maintanant

Bonne journée

A++
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 11:47
ça ne devrait plus,
enfin... à cause de cela ;o)
mais si d'autres choses trainaient...
0
Tant que j'y suis,

As-tu quand même une idée : quand je met mon script directement dans ma page avec les balises <script language="JavaScript"></script> ca fonctionne nickel.

Parr contre, quand j'appel mon script (qui est le seule script dans mon fichier JS) avec <script src="ajax.js" type="text/javascript"></script> ca ne fonctionne pas...

Enfin si, ca fonctionne au chargement du script, mais après plus rien ne se rafraîchit...


A++
0
Effectivement, le soucis c'est quand il y a deux fois le même script ajax pour une page différente, il plante !

Donc si j'ai dans ma page :

function Titre_Onair()
{ if(window.XMLHttpRequest) // FIREFOX ou IE>=7
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE ( les vieilles version et pas toutes )
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.onreadystatechange = function()
  { if(xhr_object.readyState == 4)
 
{ document.getElementById("onair").innerHTML = xhr_object.responseText;
setTimeout("Titre_Onair();",20000);
}
}
xhr_object.open("GET", 'ajax/titre_onair.php', true);
xhr_object.send(null);
}
Titre_Onair();

function Titre_2()
{ if(window.XMLHttpRequest) // FIREFOX ou IE>=7
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE ( les vieilles version et pas toutes )
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.onreadystatechange = function()
  { if(xhr_object.readyState == 4)
 
{ document.getElementById("onair").innerHTML = xhr_object.responseText;
setTimeout("Titre_2();",80000);
}
}
xhr_object.open("GET", 'ajax/titre_onair2.php', true);
xhr_object.send(null);
}
Titre_2();


Il ne veut pas, et plante : cad qu'au chargement ca marche, mais plus après

A++
0
J'aime bien t'a façon de déclarer tes parties d'humour

Il y a tant de dev qui le prennent au premier degré ?

Pour en revenir à ce fameux code, oki ca l'air de fonctionner !

Merci pour ta patience et ton aide

A++
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
15 oct. 2009 à 12:59
>>Il y a tant de dev qui le prennent au premier degré ?
t'imagine même pas !
si sur 2 phrases je ne dis pas 3 conneries,
c'est que ça ne va pas bien moi...
on peut être un peu lourd parfois, mon foie, tant pis.
comme a dit Dave ( pas sûr que ce fût le 1er ) ,
je tuerais père et mère pour faire un mot.

>>ca l'air de fonctionner !
certes, certes, mais j'espère que tu en viendras
aux choses raisonnables ( 1 seule fonction ;o)
0
Comme tu m'as conseillé d'optimiser mon code en faisant qu'une et une seule fonction, j'ai tout refait, mais en jQuery cette fois-ci, avec même un petit effet sympas.

Voici mon code :

function ajax(div,url,temps) {
  $(document).ready(function() {
$.ajax({
  url: url,
  cache: false,
  success: function(html){
Affiche(div,html);
setTimeout('ajax("' + div + '","' + url + '","' + temps + '");',temps);
  },
  error:function(XMLHttpRequest, textStatus, errorThrown){
alert(textStatus);
  }
  })
  return false;
  });
  }
  
  function Affiche(div,data) {
    $(div).fadeOut(500,function(){
$(div).empty();
$(div).append(data);
$(div).fadeIn(800);
});
  }
  
  $(document).ready(function(){
  ajax('#onair','ajax/titre_onair.php',4500);
  ajax('#webradios','ajax/onair_webradios.php',6000);
  });



Ca fonctionne à merveille. Par contre je ne sais pas si c'est de l'asynchrone...

A++
0
Rejoignez-nous