Bonjour amis de Grafikart ! :)
Voilà, j'ai réalisé un tchat en Ajax, enfin bref c'est pas ça mon problème.
Pour bien l'organiser, j'ai ajouté un overflow: auto; dans mon css. Le tchat fonctionne, sauf qu'il est affiché dans le menu et donc s'affiche sur toute les pages membre de mon site. Et à chaque chargement d'une autre page, la barre du overflow ce remet automatiquement en haut. Ce qui est un peu embêtant vu que les derniers messages s'affichent en bas.
De plus autre problème, quand un nouveau message arrive, la barre ne descend pas au niveau de ce dernier message.
Si vous pouvez m'aider, j'en serais ravi :)
Hello, tu dois le mettre deux fois ( document.getElementById... ).
1: En chargement de page: normalement ce que tu as déjà fait.
2: Lorsqu'il y a un nouveau message: ici c'est getMessage() lorsque tout est "ok". (à mettre apres le append hein :p)
Voilà :p
Salut, j'y connais rien en développement mais c'est la détection d'évènement via javascript qui te sera utile à mon avis.
Bonsoir à vous,
Voici une image schématisant ce que je souhaiterais :
Ensuite, voici le bug en 3 images :
Au niveau du code, lequel désire tu ? Tout les fichiers du tchat ? On peut peut être se contacter par mail ?
Ca serait sympa que tu fasse un tuto là dessus avec jQuery par exemple Creatiq. J'en ai trouvé mais ils sont en Anglais et j'y comprend pas grand chose, surtout que le JS c'est pas ce que je préfère ^^ Merci pour ton aide :)
Ps : on se moque pas du thème de mon site svp :D
Hello, il faut plutôt faire ça en JavaScript.
Imaginons que "history" contient tous tes évènements. (par exemple, dans ton cas: tous les messages)
document.getElementById("history").scrollTop = document.getElementById("history").scrollHeight;
Il faut placer cette ligne de code: au chargement de page et à chaque évènements (que ce soit les tiens ou ceux des autres)
Par contre, tu auras un petit soucis:
Si une personne remonte la scrollbar pour relire la discussion et qu'il y a un nouvel évènement, la scrollbar se mettra automatiquement en bas. (Ce qui peut être gênant si tu as un grand publique :))
Voilà :)
Merci d'avoir répondu :)
Si j'ai bien compris je dois placer ceci dans la page tchat.php qui gère le tchat ?
Car je me suis inspiré du tuto proposé par le site pour développer mon tchat.
C'est l'id qui contient tous les messages.
Je ne sais pas comment tu as construit ton code html mais par exemple:
<div id="history">
<p>
<span>19:20</span>
<span>John:</span>
<span>Salut comment ça va?</span>
</p>
<p>
<span>19:20</span>
<span>John2:</span>
<span>Très bien & toi?</span>
</p>
</div>
Ça devrait fonctionner pourtant. As-tu bien mis la propriété overflow-y à scroll/auto? (Pour l'id qui englobe tes messages)
Exemple:
<style type="text/css">
#history {
overflow-y: auto;
height: 300px;
}
</style>
...
<div id="history">
...
<p>
<span>12:23</span>
<span>Jean:</span>
<span>Salut</span>
</p>
...
<div>
...
<script>document.getElementById("history").scrollTop = document.getElementById("history").scrollHeight;</script>
En effet j'avais oublié de mettre overflow-y: auto;
J'avais juste mis overflow: auto; bref. Erreur corrigé ! Merci :)
En revanche le problème persiste au niveau de la réception d'un nouveau message en ajax...
Dois je mettre la fonction dans la page qui j'ai tout le javascript ? Soit cette page :
var url="tchatAjax.php";
var lastid=0;
var timer = setInterval(getMessages,5000);
$(function(){
$("#tchatForm form").submit(function(){
clearInterval(timer)
showLoader("#tchatForm");
var message = $("#tchatForm form textarea").val();
$.post(url,{action:"addMessage",message:message},function(data){
if(data.erreur=="ok"){
getMessages();
$("#tchatForm form textarea").val("");
}
else{
alert(data.erreur);
}
timer = setInterval(getMessages,5000);
hideLoader();
},"json");
return false;
})
});
function getMessages(){
$.post(url,{action:"getMessages",lastid:lastid},function(data){
if(data.erreur=="ok"){
$("#tchat").append(data.result);
lastid=data.lastid;
}
else{
alert(data.erreur);
}
},"json");
return false;
}
function showLoader(div){
$(div).append('<div class="loader"></div>');
$(".loader").fadeTo(500,0.6);
}
function hideLoader(){
$(".loader").fadeOut(500,function(){
$(".loader").remove();
});
}
Merci :)