思路
实现聊天室,基本上就是通过Ajax来传递数据,让PHP来实现对数据的差入和查找,再交给前端JavaScript实现页面的更新,达到即时聊天的功能。
消息显示区
消息显示区就是一个DIV块,我们会借助Ajax获取到服务器端信息之后,使用JavaScript来更新页面。
<h3>消息显示区</h3><div id="up"></div><hr />发消息
<h3>发言栏</h3><div id="bottom"><form action="./chatroom_insert.php"><div id="chat_up"><span>颜色</span><input type="color" name="color"/><span>表情</span><select name="biaoqing"><option value="微笑地">微笑地</option><option value="猥琐地">猥琐地</option><option value="和蔼地">和蔼地</option><option value="目不转睛地">目不转睛地</option><option value="傻傻地">傻傻地</option></select><span>聊天对象</span><select name="receiver"><option value="">所有的人</option><option value="老郭">老郭</option><option value="小郭">小郭</option><option value="大郭">大郭</option></select></div><div id="chat_bottom"><textarea id="msg" name="msg" style="width:380px;height:auto;"></textarea><input type="button" value="发言" onclick="send()" />发言:<span id="result"></span></div></form></div>板块
<script>function showmessage(){var ajax = new XMLHttpRequest();// 从服务器获取并处理数据ajax.onreadystatechange = function(){if(ajax.readyState==4) {//alert(ajax.responseText); // 将获取到的字符串转换成实体eval("var data = "+ajax.responseText);// 遍历data数组,把内部的信息一个个的显示到页面上var s = "";for(var i = 0 ; i < data.length;i++){data[i];s += "("+data[i].add_time+") >>>";s += "<p style="color:"+data[i].color+";">";s += data[i].sender +" 对 " + data[i].receiver +" "+ data[i].biaoqing+"说:" + data[i].msg;s += "</p>";}// 开始向页面时追加信息var showmessage = document.getElementById("up");showmessage.innerHTML += s;}}ajax.open("get","./chatroom.php");ajax.send(null);}// 更新信息的执行时机window.onload = function(){//showmessage();// 制作轮询,实现自动的页面更新setInterval("showmessage()",3000);}</script>里面比较重要的就是setInterval函数的使用,以此来实现间隔性的触发请求事件。
<script>function send(){// 向服务器差入相关的数据var form = document.getElementsByTagName("form")[0];var formdata = new FormData(form);var xhr = new XMLHttpRequest();xhr.onreadystatechange = function(){if(xhr.readyState==4) {//alert(xhr.resposneText);document.getElementById("result").innerHTML = xhr.responseText;setTimeout("hideresult()",2000);}}xhr.open("post","./chatroom_insert.php");xhr.send(formdata);document.getElementById("msg").value="";//return false;}// 2秒后实现提示信息的消失function hideresult(){document.getElementById("result").innerHTML = "";}</script>值得深思的是:setTimeout函数实现的功能。在得到服务器端的反馈信息之后,及时的更新到发送按钮后面,给用户一个很好的体验。
<script>// 记录当前获取到的id的最大值,防止获取到重复的信息var maxId = 0;function showmessage(){var ajax = new XMLHttpRequest();// 从服务器获取并处理数据ajax.onreadystatechange = function(){if(ajax.readyState==4) {//alert(ajax.responseText); // 将获取到的字符串转换成实体eval("var data = "+ajax.responseText);// 遍历data数组,把内部的信息一个个的显示到页面上var s = "";for(var i = 0 ; i < data.length;i++){data[i];s += "("+data[i].add_time+") >>>";s += "<p style="color:"+data[i].color+";">";s += data[i].sender +" 对 " + data[i].receiver +" "+ data[i].biaoqing+"说:" + data[i].msg;s += "</p>";// 把已经获得的最大的记录id更新maxId = data[i].id;}// 开始向页面时追加信息var showmessage = document.getElementById("up");showmessage.innerHTML += s;//showmessage.scrollTop 可以实现div底部最先展示// divnode.scrollHeight而已获得div的高度包括滚动条的高度showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;}}ajax.open("get","./chatroom.php?maxId="+maxId);ajax.send(null);}// 更新信息的执行时机window.onload = function(){//showmessage();// 制作轮询,实现自动的页面更新setInterval("showmessage()",3000);}</script>优化显示
<style>#up {height:320px;width:100%;overflow:auto; }</style>每次都显示最新消息
//showmessage.scrollTop 可以实现div底部最先展示// divnode.scrollHeight而已获得div的高度包括滚动条的高度showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;完整代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Ajax 聊天室</title><style>#up {height:320px;width:100%;overflow:auto; }</style><script>// 记录当前获取到的id的最大值,防止获取到重复的信息var maxId = 0;function showmessage(){var ajax = new XMLHttpRequest();// 从服务器获取并处理数据ajax.onreadystatechange = function(){if(ajax.readyState==4) {//alert(ajax.responseText); // 将获取到的字符串转换成实体eval("var data = "+ajax.responseText);// 遍历data数组,把内部的信息一个个的显示到页面上var s = "";for(var i = 0 ; i < data.length;i++){data[i];s += "("+data[i].add_time+") >>>";s += "<p style="color:"+data[i].color+";">";s += data[i].sender +" 对 " + data[i].receiver +" "+ data[i].biaoqing+"说:" + data[i].msg;s += "</p>";// 把已经获得的最大的记录id更新maxId = data[i].id;}// 开始向页面时追加信息var showmessage = document.getElementById("up");showmessage.innerHTML += s;//showmessage.scrollTop 可以实现div底部最先展示// divnode.scrollHeight而已获得div的高度包括滚动条的高度showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;}}ajax.open("get","./chatroom.php?maxId="+maxId);ajax.send(null);}// 更新信息的执行时机window.onload = function(){//showmessage();// 制作轮询,实现自动的页面更新setInterval("showmessage()",3000);}</script></head><body style="background-color:silver"><div id="main"><h3>消息显示区</h3><div id="up"></div><hr /><h3>发言栏</h3><div id="bottom"><form action="./chatroom_insert.php"><div id="chat_up"><span>颜色</span><input type="color" name="color"/><span>表情</span><select name="biaoqing"><option value="微笑地">微笑地</option><option value="猥琐地">猥琐地</option><option value="和蔼地">和蔼地</option><option value="目不转睛地">目不转睛地</option><option value="傻傻地">傻傻地</option></select><span>聊天对象</span><select name="receiver"><option value="">所有的人</option><option value="老郭">老郭</option><option value="小郭">小郭</option><option value="大郭">大郭</option></select></div><div id="chat_bottom"><script>function send(){// 向服务器差入相关的数据var form = document.getElementsByTagName("form")[0];var formdata = new FormData(form);var xhr = new XMLHttpRequest();xhr.onreadystatechange = function(){if(xhr.readyState==4) {//alert(xhr.resposneText);document.getElementById("result").innerHTML = xhr.responseText;setTimeout("hideresult()",2000);}}xhr.open("post","./chatroom_insert.php");xhr.send(formdata);document.getElementById("msg").value="";//return false;}// 2秒后实现提示信息的消失function hideresult(){document.getElementById("result").innerHTML = "";}</script><textarea id="msg" name="msg" style="width:380px;height:auto;"></textarea><input type="button" value="发言" onclick="send()" />发言:<span id="result"></span></div></form></div></div></body></html>数据库表结构
mysql> desc message;+----------+--------------+------+-----+---------+----------------+| Field| Type | Null | Key | Default | Extra |+----------+--------------+------+-----+---------+----------------+| id| int(100) | NO| PRI | NULL| auto_increment || msg | varchar(255) | NO| | NULL||| sender| varchar(30) | NO| | NULL||| receiver | varchar(30) | NO| | NULL||| color| varchar(10) | YES | | NULL||| biaoqing | varchar(10) | YES | | NULL||| add_time | datetime | YES | | NULL||+----------+--------------+------+-----+---------+----------------+7 rows in set (0.00 sec)服务器端代码
<?php// 获得最新的聊天信息$conn = mysql_connect("localhost","root","mysql");mysql_select_db("test");mysql_query("set names utf8");$maxId = $_GET["maxId"];// 防止获取重复数据,本次请求的记录结果id要大鱼上次获得的id$sql = "select * from message where id >".""$maxId"";$qry = mysql_query($sql);$info = array();while($rst = mysql_fetch_assoc($qry)){$info[] = $rst;}// 通过json格式给客户端提供数据echo json_encode($info);?>总结与展望