Forum Clubic

Ajax (xmlhttprequest) + Safari + Autorefresh DIV

Bonjour,

je vous écris car j’ai présentement un gros probleme cela fait 3 jour que je cherche et essaie des truc et
je n’arrive a rien. donc je vous expose le probleme sur mon site web ( en passant je suis amateur en php et
encore plus en ajax lol )… j’ai dans ma section HEADER qui s’actualise toute les secondes pour verifier s’il
y a des nouveaux messages ou des nouvelles demandes d’amis. Donc, j’utilise une fonction javascript pour
le refresh au secondes et une fonction ajax (xmlhttprequest ) le principe c’est que chargement du site. mes fonctions
se charge ( ne s’exécute pas mais se charge je dit bien). donc une fois que le DIV en question à été créer.
j’envoi une demende pour exécuter mon javascript. Comme sa j’ai mon actualisation d’un DIV, dans lequel est
inclu 2 recherche dans une base de donné MYSQL.

LE PROBLEME: seulement sur SAFARI, lorsque je laisse le site ouvert pendans environ 30 minutes jusqu’à 12heures.
hé oui! j’ai laissé le site rouler toute la nuit pour vérifier, j’étais un peu désesperer. Donc, lorsque après tout se temps
je clique sur quelconques liens dans mon site, la page ne change pas, et FREEZE dans le chargement en haut.
(dans la barre d’adresse)

je vous donne les scripts que j’utilise.
(j’ai modifier un peu mon envoie xmphttprequest pour tenter de contré se bug, mais rien n’y fait)
aucun probleme sur: Google Chrome, IE6, IE7, Firefox.

SCRIPT JAVASCRIPT ET AJAX:

<script type='text/javascript'> 
function getHTTPObject()
{
  var xmlhttp = false;


/* Compilation conditionnelle d'IE */ 
/*@cc_on 
@if (@_jscript_version >= 5) 
try 
{ 
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP'); 
} 
catch (e) 
{ 
try 
{ 
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 
} 
catch (E) 
{ 
xmlhttp = false; 
} 
} 
@else 
xmlhttp = false; 
@end @*/ 

  /* on essaie de créer l'objet si ce n'est pas déjà fait */
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
     try
     {
        xmlhttp = new XMLHttpRequest();
        if (xmlhttp.overrideMimeType) 
{ 
//xmlhttp.overrideMimeType('text/xml'); 
xmlhttp.overrideMimeType('text/xml; charset=UTF-8'); 
} 
     }
     catch (e)
     {
        xmlhttp = false;
     }
  }

  if (xmlhttp)
  {
     /* on définit ce qui doit se passer quand la page répondra */
     xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState == 4) /* 4 : état 'complete' */
            {
                if (xmlhttp.status == 200) /* 200 : code HTTP pour OK */
                {
                if(xmlhttp.responseText != '')
                    document.getElementById('top_new').innerHTML=xmlhttp.responseText;
           
          // alert(xmlhttp.responseText) // This returns null
                    }
            }
        }
    }
    return xmlhttp;
}

function rafraichir() {
        var xmlhttp = getHTTPObject();
        if(BrowserDetect.browser == 'safari'){
           xmlhttp.open('GET','include/cheking_new_mess.php',false);
        }else{
           xmlhttp.open('GET','include/cheking_new_mess.php',true);
        }
     
        xmlhttp.send(null);
        setTimeout('rafraichir()', 1000);
    }
    
    
</script> 

LANCEMENT DE MA FONCTION JAVASCRIPT RAFRAICHIR:

<script language='javascript'>
rafraichir();
</script>

PAGE PHP QUI EST RECHARGER:

<?php
session_start();
include('connect.php');
$mypseudo = $_SESSION['login'];
$message_count = mysql_query("SELECT mess_in.read FROM mess_in WHERE mess_in.to='".$mypseudo."' AND mess_in.read='0'")  or die(mysql_error()); 
$mess_count = 0;
 while ($donnees_message = mysql_fetch_array($message_count)) // On boucle pour afficher toutes les donn?es
 {
 $mess_count++;
 }
/*
 if($_GET['updatels_m'] == 1){
if($mess_count != 0){
$mess_count=($mess_count-1);
}
}
*/
if($mess_count ==  0 OR $mess_count < 0 OR $mess_count == ''){
$mess_count1="<font color='white'>Aucun nouveau message</font>";
}else{
if($mess_count == 1){
$mess_count1="<font color='red'><u>$mess_count nouveau message</u></font>";
}elseif($mess_count > 1){
$mess_count1="<font color='red'><u>$mess_count nouveaux messages</u></font>";
}
}

$friends_demand_count = mysql_query("SELECT friends.ami_confirm FROM friends WHERE ami_2='".$mypseudo."' AND ami_confirm='0'"); 
$turn_friendsdemand_count = 0;
 while ($donnees_friendsdemand_count = mysql_fetch_array($friends_demand_count)) // On boucle pour afficher toutes les données
 {
 $turn_friendsdemand_count++;
 }
/*
if($_GET['updatels'] == 1){
if($turn_friendsdemand_count != 0){
$turn_friendsdemand_count=($turn_friendsdemand_count-1);
}
}
*/

if($turn_friendsdemand_count ==  "0"){
$turn_friendsdemand_count1="<a href='index.php?go=friends_control' class='nodeco'><font color='white'>Aucune nouvelle demande</font></a>";
}else{
if($turn_friendsdemand_count == "1"){
$turn_friendsdemand_count1="<a href='index.php?go=friends_control' class='nodeco'><font color='red'><u>$turn_friendsdemand_count nouvelle demande</u></font></a>";
}else{
$turn_friendsdemand_count1="<a href='index.php?go=friends_control' class='nodeco'><font color='red'><u>$turn_friendsdemand_count nouvelles demandes</u></font></a>";
}
}
?>
<a class='nodeco' href="http://macellule.com/inc_out/messagerie.php?folder=recus" onclick="return GB_showSendPrivateMess('Messagerie Interne...', this.href)">
<?php
echo"$mess_count1</a><br/>$turn_friendsdemand_count1";	


?>

Merci grandement pour votre aide.
jonathan.
Configuration: Mac OS X
Safari 525.18
Edité le 26/12/2008 à 18:06

Déjà, pourquoi tu fais du synchrone avec Safari et de l’asynchrone avec les autres navigateurs ?

En synchrone, le navigateur se fige jusqu’à qu’il reçoive la réponse. Ca peut être un début d’explication à ton problème.

justement non, car je fesait de l’asynchrone avec safari aussi avant de mettre cette ajout, et maintenant safari me semble beaucoup
plus rapide, mais le probleme ne vien pas de la… donc je revien a l’asynchrone pour safari ossi.

ps: mon test pour le cache, a l’air finalement positif, je n’ai plus aucun freeze depuis que j’ai ajouté mon petit script.

ca se pourrait ??.. avez vous deja vecu cela ?

merci

héhé je vien de trouver quelques chose…

Eviter le blocage du à une bande passante faible

Il suffit de bloquer la requette sur un setTimout:

timerAntiblocage=setTimeout(function () { xhr_object.abort();},5000);
if ( xhr_object.readyState == 4 ){
clearTimeout(timerAntiblocage);
} 

Exemple complexe avec PHP

Voici un script fonctionnel utilisé afin de lire un flux et l’afficher dans un div

function lire_ce_lien_dans_id(action,type,flux,id,racineid){
var xhr_object = null;
var position = racineid+id;
document.getElementById(position).innerHTML='<div align="center">en cours...</div>';
if(window.XMLHttpRequest) 
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject)
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { 
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;}
var sauvurl="module.php?action="+action+"&type="+type+"&flux="+flux;
timer=setTimeout(function () { xhr_object.abort();},10000);
xhr_object.open("GET", sauvurl, true);
xhr_object.setRequestHeader("Content-type", "charset=ISO-8859-15");
if(!document.all) xhr_object.overrideMimeType('text/html; charset=ISO-8859-15'); 
xhr_object.onreadystatechange = function(){
if ( xhr_object.readyState == 4 )
{
clearTimeout(timer);
document.getElementById(position).innerHTML = xhr_object.responseText; 
}
} 
xhr_object.send(null);
}

Peut-etre un lien avec mon probleme la ? mais si oui comment je l’incorpore ds mon script ? :slight_smile:

Joyeux Noël :o !

toi ossi :wink: mais moi c po noel encore lol… il nest ke 19h30 ;)… mais jatend toujours des reponse :D…

RESOLU,

Probleme de cache ajout de:

echo"<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>";

Merci de votre aide :pfff: