forcer l'ascenseur à rester calé sur le dernier message
Le
docanski

Bonjour,
Désolé si cette question n'a pas sa place ici mais s'agissant de
l'utilisation de 2 langages différents, je tente ma chance ici. Si un FU
paraît utile
Description de l'évènement : une fenêtre de chat dont les messages sont
actualisés toutes les 5 secondes avec un affichage de bas en haut.
Les messages sont appelés d'une base MySQL sous la variable "$msg"
Problème : si lors de l'actualisation (5 sec) un nouveau message a été
écrit et donc renvoyé dans la fenêtre du chat, l'ascenseur remonte au
lieu de suivre le flux des messages.
Je cherche à forcer l'ascenseur à suivre le flux des messages et donc à
rester systématiquement collé au bas de la fenêtre. Avec la possibilité,
bien entendu, de l'utiliser pour pouvoir lire des messages précédents
situés en dehors de la fenêtre.
Voici le code PHP permettant d'aller chercher les messages dans la BdD
et de les formater :
<code>
$ide= MYSQL_CONNECT($host_mysql,$user_mysql,$pass_mysql);
mysql_select_db("$bd_mysql");
$tm=microtime();$tm2=explode(" ",$tm);$tm3=$tm2[1];
$query = "DELETE FROM $table WHERE (temp+7777)<$tm3";
mysql_query($query,$ide);
$query = "SELECT * FROM $table ORDER BY id DESC";
$result = mysql_query($query,$ide);
$cpt=0;
while($row = mysql_fetch_row($result))
{
$cpt++;
$coul=substr($row[4],0,1);
$tail=substr($row[4],1,1);
$appa=substr($row[4],2,1);
$msg=$row[2];
if ($appa==1){$msg.=$row2;}
if ($appa==2){$msg2="<B>";$msg2.=$msg;$msg2.="</B>";$msg=$msg2;}
if ($appa==3){$msg2="<I>";$msg2.=$msg;$msg2.="</I>";$msg=$msg2;}
if ($appa==4){$msg2="<U>";$msg2.=$msg;$msg2.="</U>";$msg=$msg2;}
if ($appa==5){$msg2="<STRIKE>";$msg2.=$msg;$msg2.="</STRIKE>";$msg=$msg2;}
if ($coul==1){$msg2='<FONT
COLOR="#000000">';$msg2.=$msg;$msg2.="</FONT>";$msg=$msg2;}
if (snip la suite de la série des couleurs utilisables pour chaque
message)
echo"- <u>$row[1]</u> <font color="999999">[$row[3]]</font> : $msg<br>";
if ($cpt= ) {break;}
}
MYSQL_CLOSE();
?>
</code>
Si je ne me trompe, je ne vois que JavaScript pour forcer l'ascenseur.
J'envisage ceci :
<script type="text-javascript">
var i = setInterval('$msg()', 5);
function $msg()
{
document.documentElement.scrollTop =
document.documentElement.scrollHeight;
}
</script>
Est-ce que le nom de la variable ne risque pas de poser problème et où
puis-je insérer ce script sans risquer de foirer l'affichage ?
Cordialement,
--
docanski
Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Désolé si cette question n'a pas sa place ici mais s'agissant de
l'utilisation de 2 langages différents, je tente ma chance ici. Si un FU
paraît utile
Description de l'évènement : une fenêtre de chat dont les messages sont
actualisés toutes les 5 secondes avec un affichage de bas en haut.
Les messages sont appelés d'une base MySQL sous la variable "$msg"
Problème : si lors de l'actualisation (5 sec) un nouveau message a été
écrit et donc renvoyé dans la fenêtre du chat, l'ascenseur remonte au
lieu de suivre le flux des messages.
Je cherche à forcer l'ascenseur à suivre le flux des messages et donc à
rester systématiquement collé au bas de la fenêtre. Avec la possibilité,
bien entendu, de l'utiliser pour pouvoir lire des messages précédents
situés en dehors de la fenêtre.
Voici le code PHP permettant d'aller chercher les messages dans la BdD
et de les formater :
<code>
$ide= MYSQL_CONNECT($host_mysql,$user_mysql,$pass_mysql);
mysql_select_db("$bd_mysql");
$tm=microtime();$tm2=explode(" ",$tm);$tm3=$tm2[1];
$query = "DELETE FROM $table WHERE (temp+7777)<$tm3";
mysql_query($query,$ide);
$query = "SELECT * FROM $table ORDER BY id DESC";
$result = mysql_query($query,$ide);
$cpt=0;
while($row = mysql_fetch_row($result))
{
$cpt++;
$coul=substr($row[4],0,1);
$tail=substr($row[4],1,1);
$appa=substr($row[4],2,1);
$msg=$row[2];
if ($appa==1){$msg.=$row2;}
if ($appa==2){$msg2="<B>";$msg2.=$msg;$msg2.="</B>";$msg=$msg2;}
if ($appa==3){$msg2="<I>";$msg2.=$msg;$msg2.="</I>";$msg=$msg2;}
if ($appa==4){$msg2="<U>";$msg2.=$msg;$msg2.="</U>";$msg=$msg2;}
if ($appa==5){$msg2="<STRIKE>";$msg2.=$msg;$msg2.="</STRIKE>";$msg=$msg2;}
if ($coul==1){$msg2='<FONT
COLOR="#000000">';$msg2.=$msg;$msg2.="</FONT>";$msg=$msg2;}
if (snip la suite de la série des couleurs utilisables pour chaque
message)
echo"- <u>$row[1]</u> <font color="999999">[$row[3]]</font> : $msg<br>";
if ($cpt= ) {break;}
}
MYSQL_CLOSE();
?>
</code>
Si je ne me trompe, je ne vois que JavaScript pour forcer l'ascenseur.
J'envisage ceci :
<script type="text-javascript">
var i = setInterval('$msg()', 5);
function $msg()
{
document.documentElement.scrollTop =
document.documentElement.scrollHeight;
}
</script>
Est-ce que le nom de la variable ne risque pas de poser problème et où
puis-je insérer ce script sans risquer de foirer l'affichage ?
Cordialement,
--
docanski
Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Heu ... tous les 5/1000 de seconde ... ça va bien occuper le CPU !!!
Je me demande même si l'utilisateur aura encore l'accès à son mulot, ou
pire : son clavier
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
echo 'n<a id="lastOne"></a>';
break;}
location = "#lastOne";
... pas testé ... mais bon espoir.
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
docanski
[...]
Puisque le contenu ne change qu'après le rechargement de la page
complète en PHP, il suffit de positionner l'ascenseur une seule fois
(lors du rechargement). Cela permettra à l'utilisateur de se balader
entre chaque chargement. Selon vos spécifications, il n'a que 5 secondes
pour le faire ce qui ne lui laisse pas beaucoup de temps pour trouver un
vieux message et le lire. Un rechargement toutes les 30 secondes ou même
toutes les minutes me semblerait plus adapté...
Une méthode bien meilleure serait de ne recharger que le contenu de la
fenêtre de chat via une requête javascript et de ne repositionner
l'ascenseur en bas du contenu que s'il y était déjà...
--
Paul Gaborit -
Bretagne, docanski ecrit ce qui suit en ce 20/05/2013 15:13 :
Oups ! Je viens de me rendre compte que c'est un script non corrigé que
j'avais envoyé. Le code définitif ne comporte plus les 3 lignes ci-dessus.
Désolé.
--
docanski
Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Bretagne, Paul Gaborit ecrit ce qui suit en ce 21/05/2013 11:19 :
Le contenu ne change pas, c'est simplement le ou les nouveaux messages
envoyés dans l'intervalle de rafraîchissement de 5 secondes qui viennent
s'y ajouter.
Impossible sans nuire à la fluidité voulue car en cours de chat
plusieurs messages peuvent être envoyés pendant ce cours laps de temps.
Pour le moment, quand l'utilisateur remonte l'ascenceur, il ne se
repositionne pas au bas de la page lors du rafraîchissement : il reste
sur sa dernière position.
Je cherche donc à positionner l'ascenseur automatiquement au niveau du
dernier message lors du rafraîchissement mais en laissant la possibilité
à l'utilisateur de le positionner où il veut. Il s'agit donc de forcer
cet ascenseur uniquement si l'utilisateur ... ne le force pas à son tour.
Le tout est de savoir si PHP+SQL+JS peut le faire. Je sais que c'est
possible avec Flash (que je ne n'ai jamais essayé pour ce faire et que
je préfère éviter), comme le fait l'application "coveritlive"
Ben ... c'est justement ce que je cherche. Le tout est de savoir coder
cet évènement.
Cordialement,
--
docanski
Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Le contenu ne change pas
mais ...
ce ne sont pas/plus les mêmes messages
? ! ? ! ? !
exemple non testé, mais ça doit fonctionner :
'monIframeAMoi' est le "name" de l'iframe de tchat,
[JS]
var delai = 5; // secondes
function aJour() { parent.monIframeAMoi.location.reload(); }
setInterval(aJour, delai*1000);
[/JS]
Hop !
Enfin ... presque ... on n'a pas jamais fait scroler sur le dernier
message ... :-(
on se contente de respecter le scroll déjà effectué (par qui que ce
soit, JS ou utilisateur)
alors, tentons ceci :
[JS de la page pincipale]
var delai = 5; // secondes
var indicateur = 0;
function aJour() {
indicateur = 1;
parent.monIframeAMoi.location.reload();
}
setInterval(aJour, delai*1000);
[/JS]
en fin de body de l'iframe :
<script type="text/javascrip">
if(!parent.indicateur) this.location = '#fin';
</script>
<a name="fin" id="fin"></a>
</body></html>
Mais ... si l'utilisateur est remonté dans les messages et qu'un nouveau
arrive il ne le saura pas ... :-(
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Bretagne, SAM ecrit ce qui suit en ce 24/05/2013 17:50 :
A mont tour : ? ! ? ! ? !
2 délais de rafraîchissement pour la même page ? C'est pas un peu
beaucoup ? Me demande si je ne vais pas plutôt acheter un sapin de Noël :-)
Et patatras ! Mébon, c'est pas un canon pour tuer une mouche, ce double
script ?
Tu n'as pas essayé in vitro avec les codes PHP envoyés précédemment ?
Il y en a 3 qui entrent en jeu pour obtenir l'affichage : index, message
et affichage.
Si tu veux, je te les envoie en MP ?
Cordialement,
--
docanski
Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Tu dis 2 choses opposées :
(ne change pas mais se modifie)
Non, je te corrige ton script.
avec un clignotement de 5 millisecondes ?
qué codes php ?
Je n'ai rien vu
(à part le 'tit esstrait de manip de BdD et isolé du contexte)
Non, non. J'ai juste joué avec le tChat en ligne
Comme chez moi ça ne rafraichi pas ça prend des plombes, le temps que je
réalise de faire ré-afficher (comme si le bouton d'envoi ne savait pas
le faire tout seul ???)
et comme j'étais tout seul à (laborieusement) tenter de tChater, je n'ai
jamais rempli la fenêtre de l'iFrame ... histoire de voir à voir
l'étendue du problème.
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Bretagne, SAM ecrit ce qui suit en ce 26/05/2013 23:52 :
Oui, c'est vrai, j'avais oublié : le début de la mise en route du tchat
avait fait l'objet d'une question sur fclp où j'avais publié les codes
de ces pages.
Mais c'est vrai qu'ils étaient également extraits des pages ... pisque
seul le PHP intéresse ce groupe.
Si tu veux bricoler à l'occasion avec le tout, je peux t'envoyer un zip
complet en MP. Ou autre format d'archive, si tu préfères.
Ben ça le fait ! Testé avec Firefox, Internet Exploseur et Google Chrome
+ des navigateurs sous Gecko développés pour Linux.
Mauvais navigateur (Safari ?), changer navigateur. ;-)
Suis à nouveau en plein bricolage maison : peintures, tapissage et
parquet. Comme j'ai un copain à la maison pour m'aider, je n'aurai pas
le temps de suivre ces prochains jours mais dès que je m'y remets, je
teste tes scripts. Ceci dit, c'est le 1er ou le second qui fonctionne et
qu'il faut essayer ?
Cordialement,
--
docanski
Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/