展望

前端代码

数据库表构造

phpajax聊天室Ajax PHP JavaScript MySQL实现简略单纯的无刷新在线聊天室 React

做事器端代码

显示非重复性的数据

优化显示

加上滚动条

每次都显示最新

显示

发送

显示区

思路

板块

优化

完全代码

总结与展望

为更好的利用这两天学到的Ajax的干系的知识,就做了个大略的在线网络谈天室。

为更好的利用这两天学到的Ajax的干系的知识,就做了个大略的在线网络谈天室。

思路

实现谈天室,基本上便是通过Ajax来通报数据,让PHP来实现对数据的差入和查找,再交给前端JavaScript实现页面的更新,达到即时谈天的功能。

显示区

显示区便是一个DIV块,我们会借助Ajax获取到做事器端信息之后,利用JavaScript来更新页面。

<h3>显示区</h3><div id=\"大众up\"大众></div><hr />1234

发模块,实在说白了,便是向做事器上插入数据的过程,也是属于比较大略的。

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

板块

下面开始利用代码来实现干系的业务逻辑。

显示

我们的思路便是每隔一段韶光,客户端向做事器发送要求,轮询得到最新的数据。

<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 +\"大众&nbsp;对&nbsp;\公众 + data[i].receiver +\"大众&nbsp;&nbsp;\"大众+ 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>1234567891011121314151617181920212223242526272829303132333435363738

里虚假比较主要的便是setInterval函数的利用,以此来实现间隔性的触发要求事宜。

发送

关于发送,通过表单形式发给做事器即可。
我们这里利用了目前Html5的一个最新的技能,FormData,一样平常来说目前的主流的当代浏览器都是支持这一技能了。
利用FormData我们可以方便的获取一个表单的数据。

把稳: FormData网络表单数据的时候因此键值对的形式搜集的,以是对应的表单项一定要有name属性,否则表单将网络不到该项的数据值。

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

值得寻思的是:setTimeout函数实现的功能。
在得到做事器真个反馈信息之后,及时的更新到发送按钮后面,给用户一个很好的体验。

优化

做完这里基本上就可以实现谈天了。
但是实现的效果会非常的不好,紧张是有以下几点。

没有滚动显示,每次都得手动的查看最新。

获取到的数据有很多的重复数据,既摧残浪费蹂躏流量,也未便利查看信息。

显示非重复性的数据

对付显示重复性的数据,这是由于我们没有利用where语句,而好似每次都获取到所有的数据了。
试想一下,若何才能获取到最新的数据呢?

而且对付不同的客户端都要照顾得到。

好莱坞原则:不要来找我,我会去找你

这也是很多软件开拓理念的一个体现,让客户决定来获取什么数据,而不是做事器端一棍子打去世。
以是我们须要在客户端发送数据要求方面最优化。

<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 +\公众&nbsp;对&nbsp;\"大众 + data[i].receiver +\"大众&nbsp;&nbsp;\公众+ 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>123456789101112131415161718192021222324252627282930313233343536373839404142

优化显示

优化显示界面是必不可少的,没有人能够容忍发送一条数据之后还得手动的查看最新的。
以是我们要设置一下显示区域的div。

加上滚动条

<style> #up { height:320px; width:100%; overflow:auto; }</style>1234567

每次都显示最新

说白了便是让底部的div永久最先显示。

//showmessage.scrollTop 可以实现div底部最先展示// divnode.scrollHeight而已得到div的高度包括滚动条的高度showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;123

完全代码

前端代码

<!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 +\公众&nbsp;对&nbsp;\"大众 + data[i].receiver +\公众&nbsp;&nbsp;\"大众+ 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>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123

数据库表构造

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

做事器端代码

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

总结与展望

总结

完全的小例子便是这样了。
回顾一下,本日的收成有:

如何轮询得到数据,借助了setInterval函数

定时消逝提示的数据,借助了setTimeout函数

如何获取最新数据:有客户端掌握发送的maxId参数。

如何优化显示:overflow实现滚动效果;divnode.scrollTop掌握显示底部殊效

展望

大概你会创造,客户端发送人是固定的,那便是由于咱们没有做用户登录。
如果做了用户登录,我们的发送人就可以从Session里面动态的获取。
这样也能更符合人们的主不雅观感想熏染。

界面做的比较烂,没有加美化效果。
加上Bootstrap后效果该当会很棒。

手机适配效果不好,其余在WindowsPhone上面颜色控件不能正常的显示。