I have created a simple chatbox using PHP. I want this to be able to load a all the new message and scroll to the bottom of the chatbox. I'm using AJAX to reload the new messages, but cannot seem to make it scroll down to the bottom where the new messages appear.
I have tried using down.scrollTop = down.scrollHeight; but cant get it to function properly.
Any help please?
<div id="tab3">
<h2>Chat Room</h>
<div id="c-input_wrap">
<div id="chatlog">
Loading chat please wait...
</div>
<div id="chatwrap">
<div id="chatinput">
<form name="chatbox" class="userchat">
<input class="userchat" name="message" type="text" autocomplete="off" onkeydown="if (event.keyCode == 13) document.getElementById('chatbutton').click()" autofocus/><br>
<input class="userchat" id="chatbutton" name="submitmsg" type="button" onclick="submitChat()" value="Send" />
</form>
</div>
</div>
</div>
</div>
<script>
var form = document.querySelector('form[name="chatbox"]');
form.addEventListener("submit", function (event) {
event.preventDefault();
});
function submitChat() {
if(chatbox.message.value == '') {
alert('Error: Missing Fields.');
return;
}
var message = chatbox.message.value;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState==4&&xmlhttp.status==100) {
document.getElementById('chatlog').innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open('GET','chat.php?message='+message, true);
xmlhttp.send();
chatbox.reset();
}
$(document).ready(function(e) {
$.ajaxSetup({cache:false});
setInterval(function() {$('#chatlog').load('logs.php');}, 200);
});
</script>
css:
#tabs {
overflow: hidden;
max-width: 100%;
margin: 0;
padding: 0;
list-style: none;
}
#tabs li {
float: left;
margin: 0px -15px 0 0;
}
#tabs a {
float: left;
position: relative;
padding: 0 20px;
height: 0;
line-height: 30px;
text-transform: uppercase;
font-weight: bold;
text-decoration: none;
color: #FFFFFF;
border-right: 20px solid transparent;
border-bottom: 30px solid #3D3D3D;
opacity: .3;
filter: alpha(opacity=30);
transition: all .5s;
}
#tabs a:hover, #tabs a:focus {
border-bottom-color: rgba(255,0,4,0.60);
opacity: 1;
filter: alpha(opacity=100);
}
#tabs a:focus {
outline: 0;
}
#tabs #current {
z-index: 10;
border-bottom-color: #3d3d3d;
opacity: .8;
filter: alpha(opacity=100);
cursor: default;
}
#content {
background-color: rgba(0,0,0,0.10);
border-top: 3px solid rgba(61,61,61,0.80);
padding: 2em;/*height: 220px;*/
overflow-y: auto;
height: 85%;
}
#content h2, #content h3, #content p {
margin: 0 0 15px 0;
}
#chatlog {
position: absolute;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
padding: 0;
text-align: left;
font-family:"Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
color: #000000;
background-color: rgba(255,255,255,0.70);
border-top: solid 2px rgba(235,0,3,0.70);
width: 95%;
height: 88%;
overflow-y: auto;
word-wrap: break-word;
}
#c-input_wrap {
position: absolute;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
padding: 0;
height: 63%;
}
#chatinput {
position: absolute;
margin-left: auto;
margin-right: auto;
left: 27%;
right: 25%;
width: 70%;
}
#chatwrap {
position: absolute;
height: 40px;
width: 95%;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
bottom: -10px;
}
input.userchat {
display: inline-block;
float: left;
margin-left: 0;
width: 50%;
padding: 10px;
border: none;
border-bottom: solid 2px #3D3D3D;
transition: border, background-color .75s;
background-color: rgba(255,255,255,0.70);
font-weight: bold;
line-height: 18px;
color: #000000;
}
input:focus.userchat {
background-color: rgba(255,255,255,0.90);
border-bottom: solid 2px rgba(235,0,3,0.69);
outline: 0;
color: rgba(61,61,61,1.00);
font-weight: bold;
}
input[type=button].userchat {
display: block;
margin-top: -23px;
margin-left: 2px;
text-align: center;
padding-left: 2px;
float: left;
width: 40px;
font-family: "Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
color: rgba(61,61,61,0.70);
font-size: 16px;
background: rgba(255,255,255,0.70);
border-bottom: solid 2px #3D3D3D;
cursor :pointer;
transition: all .75s;
}
input[type=button].userchat:hover,
input[type=button].userchat:focus {
font-family: "Gill Sans", "Gill Sans MT", "Myriad Pro", "DejaVu Sans Condensed", Helvetica, Arial, sans-serif;
color: #000000;
font-size: 16px;
border-bottom: solid 2px rgba(235,0,3,0.69);
background: rgba(255,255,255,0.90);
cursor: pointer;
}
chat.php:
<?php
error_reporting(E_ALL & ~E_NOTICE);
session_start();
if (isset($_SESSION['id'])) {
$userId = $_SESSION['id'];
$username = $_SESSION['username'];
$userLabel = $_SESSION['nickname'];
}
$connect = mysqli_connect("", "", "", "webclyde_root");
mysqli_select_db($connect, "webclyde_root");
$message = $_REQUEST['message'];
mysqli_query($connect, "INSERT INTO chat (name, message) VALUES ('$userLabel', '$message')");
$result1 = mysqli_query($connect, "SELECT * FROM chat ORDER by id");
while ($extract = mysqli_fetch_assoc($result1)) {
echo $extract['name'] . ": " . $extract['message'];
}
?>
logs.php
<?php
error_reporting(E_ALL & ~E_NOTICE);
session_start();
if (isset($_SESSION['id'])) {
$userId = $_SESSION['id'];
$username = $_SESSION['username'];
$userLabel = $_SESSION['nickname'];
}
$connect = mysqli_connect("", "", "", "webclyde_root");
mysqli_select_db($connect, "webclyde_root");
$result1 = mysqli_query($connect, "SELECT * FROM chat ORDER by id");
while ($extract = mysqli_fetch_assoc($result1)) {
echo "<br>" . $extract['name'] . ": " . $extract['message'];
}
?>
To make it animated you can use the jQuery .animate() function.
Use:
var log = $('#chatlog');
log.animate({ scrollTop: log.prop('scrollHeight')}, 1000);
jsFiddle Example: http://jsfiddle.net/00xsrck8/
Or without animation use:
var log = $('#chatlog');
log.animate({ scrollTop: log.prop('scrollHeight')}, 0);
Used the provided css to accomplish this task. Please see jsfiddle: http://jsfiddle.net/00g2LnqL/
Use this :
var c = $('#chatlog');
c.scrollTop(c.prop("scrollHeight"));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With