Plantage site après quelques minutes AJAX [Résolu]

Utilisateur anonyme - 15 oct. 2009 à 09:51 - Dernière réponse : Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention
- 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++
Afficher la suite 

Votre réponse

21 réponses

Meilleure réponse
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 10:28
3
Merci
>>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
}

Merci Bul3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bul3
Meilleure réponse
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 10:57
3
Merci
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);
}

Merci Bul3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bul3
Meilleure réponse
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 11:06
3
Merci
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 ?

Merci Bul3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bul3
Meilleure réponse
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 12:19
3
Merci
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"

Merci Bul3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bul3
Meilleure réponse
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 12:37
3
Merci
<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 !

Merci Bul3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Bul3
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 10:07
0
Merci
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
Commenter la réponse de Bul3
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
0
Merci
En fait, apparement le timeout ne marche plus dans le code juste au dessus car il ne rafraîchit plus mon titre :(

A++
Commenter la réponse de Utilisateur anonyme
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 10:59
0
Merci
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 !
Commenter la réponse de Bul3
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 11:27
0
Merci
nickel si ça baigne ( ou presque ;o)
reste des "détails" à fignoler quoi..
Commenter la réponse de Bul3
0
Merci
Yes !

merci beaucoup !

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

Bonne journée

A++
Commenter la réponse de Utilisateur anonyme
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 11:47
0
Merci
ça ne devrait plus,
enfin... à cause de cela ;o)
mais si d'autres choses trainaient...
Commenter la réponse de Bul3
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
0
Merci
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++
Commenter la réponse de Utilisateur anonyme
Bul3 4934 Messages postés samedi 1 juillet 2006Date d'inscription 2 février 2015 Dernière intervention - 15 oct. 2009 à 12:59
0
Merci
>>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)
Commenter la réponse de Bul3
0
Merci
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++
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.