Erreur sous safari

Signaler
Messages postés
186
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
-
Bonjour

j'essai de monter un script de compte a rebourg avec de l'ajax
le principe un compte a rebourg de 2mn, qui peut être relancé à 2mn en cliquant sur un bouton (et mise à jour d'une donnée dans la bdd) verification a chaque seconde qu'une donnée précise n'est pas été mise à jour, si nouvelle donnée alors on repard à 2mn...
mes premiers tests fonctionnent sous FF et opéra (sous MAC) mais sous safari, ça me génère une erreur au bout de quelques secondes (non régulier, 5scd ou 15scd...), puis une autre et ça bloque safari, enfin ça le ralentit grave avec cumul d'erreurs

Code de la page 1 :


<html>



<script>

function writediv(texte, oldbid)
{
document.getElementById('test').innerHTML = texte;
document.getElementById('test').style.backgroundColor = "#fff";
document.getElementById('time').style.backgroundColor = "#fff";

if(texte > oldbid)
{
document.getElementById('test').style.backgroundColor = "#ff0";
document.getElementById('time').style.backgroundColor = "#ff0";


var newcible = new Date();
var newtime = parseInt((newcible.getTime() / 1000)+120, 10);

document.getElementById('debut').value = newtime;

}

document.getElementById('oldbid').value = texte;


}


function fnInterval()
{

var oldbid = document.getElementById('oldbid').value;

if(texte = file('requete.php?id=1&oldbid='+oldbid))
{
writediv(texte, oldbid);
}
else
{
var texte = "rien";
document.getElementById('test').innerHTML = texte;
}

}


function post(texte)
{
document.getElementById('bestbid').value = texte;
}



function addpost(user, bestbid)
{
if(texte = file('requete.php?post='+user+"&bestbid="+bestbid))
{
post(texte);
}

}



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);
}

setInterval(fnInterval, 1000);
</script>



--,--

<form method="post" action="">
Old bid :

Best bid :

User :

</form>



//------------------------





<script>

var cible = new Date();
var time = parseInt((cible.getTime() / 1000)+120, 10);

function debut()
{
document.getElementById('debut').value = time;
}

debut();


function decompte()
{



var aujourdhui = new Date();

time_tmp = parseInt(aujourdhui.getTime() / 1000, 10);
time_debut = document.getElementById('debut').value;
restant = time_debut - time_tmp;

jour = parseInt((restant / (60 * 60 * 24)), 10);
heure = parseInt((restant / (60 * 60) - jour * 24), 10);
minute = parseInt((restant / 60 - jour * 24 * 60 - heure * 60), 10);
seconde = parseInt((restant - jour * 24 * 60 * 60 - heure * 60 * 60 - minute * 60), 10);
if(seconde<10) { var seconde = '0'+seconde; }
if(minute <1 && seconde <= 15)
{

document.getElementById('time').style.color = "#FF0000";

}

document.getElementById('time').innerHTML = '0'+minute+' m '+seconde+' s ';


if (time_tmp < time_debut)
{
setTimeout('decompte();', 1000);
}
else
{
// Temps fini, on fait ce qu'on veux
document.getElementById('time').innerHTML = "Enchere terminee";

}
}

setTimeout('decompte();', 1000);


</script>


--:--



</html>

Code de la page php (pour info et c'est des tests...)

<?php

if(isset($_GET['id'])) $id=$_GET['id'];
else $id="";

if(isset($_GET['post'])) $post=$_GET['post'];
else $post="";

if(isset($_GET['bestbid'])) $bestbid=$_GET['bestbid'];
else $bestbid="";

if(isset($_GET['oldbid'])) $oldbid=$_GET['oldbid'];
else $oldbid="";

$link = mysql_connect ($serveur,$user,$password) or die ('Erreur : '.mysql_error() );
mysql_select_db($base) or die ('Erreur :'.mysql_error());

//********************
if($post)
{
$bid = 0.01;

$sql = "UPDATE post SET montant=montant+'$bid', user='$post' where id='1'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
$sql = "SELECT * FROM post where id='1'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

while($data = mysql_fetch_assoc($req))
{
echo $data['montant'];
}


}

//********************


$sql = "SELECT * FROM post where id='$id'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

while($data = mysql_fetch_assoc($req))
{

echo $data['montant'];

}

?>

Voilà, quelqu'un voit il un truc qui pourrait déplaire à safari ...???

Laubro

6 réponses

Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
Bonjour,
ça me semble tout à fait normal,
ça devrait, à termes, "dans d'autres conditions",
planter aussi avec les autres navigateurs
vous relancez l'appel d'ajax sans
attendre le retour de l'appel précédent !

vous lancez la fonction fnInterval
toutes les secondes, et si la
réponse d'ajax prend plus d'une seconde ?
( et dans les conditions où vous tester
si arrive avec safari )
remarque :
_ vous lancez ajax en asynchrone,
inutile de tester si c'est fini donc .
if(xhr_object.readyState == 4) est
inutile voire nuisible
_ un script de compte a rebours
si ce n'est qu'un compte à rebours
pourquoi appeler un script sur le serveur ?
( sauf s'il y a d'autres infos du serveur
rester sur le client c'est nettement
moins gourmand )
Cordialement [mon Site] [M'écrire] Bul
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
il fallait lire "ajax en synchrone :
xhr_object.open("GET", fichier, false); "

à mon avsi, il faut faire l'appel en asynchrone
et ne relancer le setTimeout que lorsque ajax
a répondu.
Messages postés
186
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 juillet 2013

Bonjour

en fait c'est un "début" de scrip pour systeme d'enchere au centime et timé à 2mn

- Le compte a rebourg est lancé a la première enchere postée
- Le compte a rebourg doit être visible sur tout les poste des encherisseurs en même temps
- Les autres encherisseurs doivent postée une enchère avant le terme des 2 mn, ce qui repositionne le chrono à 2mn et relance le compte a rebourg
- En fait, d'enchere, chaque post, replace le chrono à 2mn donc et ajoute 0.01 ctms au prix.

La difficulté est la suivante (d'où appel chaque seconde):

- que tous les visiteur aient le même timing au compte a rebourg affiché
- Le compte a rebourg defile tant qu'il n'y a pas de nouvelle enchere postée
- Si enchere postée, alors tous les postes clients doivent être mis à jour au niveau de la remise à 2mn du chrono et dumontant de l'enchere

donc là le chrono pour le moment est défini en local sur le poste client (new date()) mais par la suite, il me faudra définir cette heure limite (des 2mn) via la bdd et remonter l'info pour redefinir la date de fon de chrono (car ça devra être la même pour tous)

voilà, j'espere avoir été clair dans le but du code. Je ne vois pas trop comment permettre à tous les users d'avoir la même info et le même suivant en même temps sans passer l'ordre toutes les seconde (rythme du compte a rebourg)




Laubro
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
ok, à priori l'appel au serveur semble nécessaire
mais rien à faire, pour un utilisateur, vous ne devez
rappeler ce serveur que lorsqu'il a répondu, sinon
ça queutera.
Messages postés
186
Date d'inscription
jeudi 23 décembre 2004
Statut
Membre
Dernière intervention
9 juillet 2013

c'est sur que c'est "judicieux" comme remarque !!! ce qui est marant (si je puis dire) c'est que seul safari (enfin pas testé sous IE encore) plante ou dison ralentit "enormement" et génère des erreurs...

je vais me pencher sur le problème, merci de ce détail "important"

Laubro
Messages postés
4933
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
2 février 2015
11
tout dépend du contexte.
si ça baigne avec certains navigateurs
ce n'est qu'un "hasard", ce n'est que
"ponctuellement". ça queutera un jour
ou l'autre.