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

1 view
Skip to first unread message

docanski

unread,
May 20, 2013, 9:13:29 AM5/20/13
to
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==20) {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/

SAM

unread,
May 21, 2013, 3:30:19 AM5/21/13
to
Le 20/05/13 15:13, docanski a �crit :
> 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);

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

SAM

unread,
May 21, 2013, 3:38:15 AM5/21/13
to
Le 20/05/13 15:13, docanski a �crit :
> if ($cpt==20) {
echo '\n<a id="lastOne"></a>';
break;}
> }
> MYSQL_CLOSE();
> ?>

> <script type="text-javascript">

location = "#lastOne";

> </script>


... pas test� ... mais bon espoir.

Paul Gaborit

unread,
May 21, 2013, 5:19:08 AM5/21/13
to

À (at) Mon, 20 May 2013 15:13:29 +0200,
docanski <docanski...@mobistar.be.invalid> écrivait (wrote):

> 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.
[...]
> 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>

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 - <http://perso.mines-albi.fr/~gaborit/>

docanski

unread,
May 21, 2013, 11:22:38 AM5/21/13
to
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, docanski ecrit ce qui suit en ce 20/05/2013 15:13 :

> $cpt=0;
> $cpt++;
> if ($cpt==20) {break;}

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

unread,
May 21, 2013, 11:40:26 AM5/21/13
to
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Paul Gaborit ecrit ce qui suit en ce 21/05/2013 11:19 :

> 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).

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.

> Un rechargement toutes les 30 secondes ou mï¿œme
> toutes les minutes me semblerait plus adaptᅵ...

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"

> 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ᅵ...

Ben ... c'est justement ce que je cherche. Le tout est de savoir coder
cet ï¿œvï¿œnement.

SAM

unread,
May 24, 2013, 11:50:23 AM5/24/13
to
Le 21/05/13 17:40, docanski a �crit :
> Alors que les eleveurs et agriculteurs empoisonnent toujours la
> Bretagne, Paul Gaborit ecrit ce qui suit en ce 21/05/2013 11:19 :
>
>> 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).
>
> 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.

Le contenu ne change pas
mais ...
ce ne sont pas/plus les m�mes messages
? ! ? ! ? !

> 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"
>
>> 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�...
>
> Ben ... c'est justement ce que je cherche. Le tout est de savoir coder
> cet �v�nement.

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 ... :-(

docanski

unread,
May 25, 2013, 1:29:23 PM5/25/13
to
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, SAM ecrit ce qui suit en ce 24/05/2013 17:50 :

> Le contenu ne change pas
> mais ...
> ce ne sont pas/plus les mï¿œmes messages
> ? ! ? ! ? !

A mont tour : ? ! ? ! ? !

> [JS]
> var delai = 5; // secondes
> function aJour() { parent.monIframeAMoi.location.reload(); }
> setInterval(aJour, delai*1000);
> [/JS]

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 :-)

> Mais ... si l'utilisateur est remontᅵ dans les messages et qu'un nouveau
> arrive il ne le saura pas ... :-(

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 ?

SAM

unread,
May 26, 2013, 5:52:07 PM5/26/13
to
Le 25/05/13 19:29, docanski a �crit :
> Alors que les eleveurs et agriculteurs empoisonnent toujours la
> Bretagne, SAM ecrit ce qui suit en ce 24/05/2013 17:50 :
>
>> Le contenu ne change pas
>> mais ...
>> ce ne sont pas/plus les m�mes messages
>> ? ! ? ! ? !
>
> A mont tour : ? ! ? ! ? !

Tu dis 2 choses oppos�es :
(ne change pas mais se modifie)

>> [JS]
>> var delai = 5; // secondes
>> function aJour() { parent.monIframeAMoi.location.reload(); }
>> setInterval(aJour, delai*1000);
>> [/JS]
>
> 2 d�lais de rafra�chissement pour la m�me page ?

Non, je te corrige ton script.

> C'est pas un peu
> beaucoup ? Me demande si je ne vais pas plut�t acheter un sapin de No�l :-)

avec un clignotement de 5 millisecondes ?

>> Mais ... si l'utilisateur est remont� dans les messages et qu'un nouveau
>> arrive il ne le saura pas ... :-(
>
> 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 ?

qu� codes php ?
Je n'ai rien vu
(� part le 'tit esstrait de manip de BdD et isol� du contexte)

> 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 ?

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.

docanski

unread,
May 27, 2013, 5:20:41 PM5/27/13
to
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, SAM ecrit ce qui suit en ce 26/05/2013 23:52 :

>>> Mais ... si l'utilisateur est remontᅵ dans les messages et qu'un nouveau
>>> arrive il ne le saura pas ... :-(

> quᅵ codes php ?
> Je n'ai rien vu
> (ᅵ part le 'tit esstrait de manip de BdD et isolᅵ du contexte)

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.

> 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 ???)

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

> 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.

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 ?
Reply all
Reply to author
Forward
0 new messages