IM12345_Web demo - 代码源于 商丘市12345项目

chat.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. var wst, objs = {}, lockReconnect = false;
  2. function CreateWebSockets() {
  3. try {
  4. // $("#conn").attr("disabled", "disabled");
  5. Connects();
  6. } catch (e) {
  7. ReConnect();
  8. }
  9. }
  10. //连接
  11. function Connects() {
  12. // ws = new WebSocket("ws://192.168.4.18:4006");
  13. // ws = new WebSocket("ws://192.168.1.21:2021");
  14. wst = new WebSocket("ws://192.168.8.10:2022");
  15. wst.onopen = function () {
  16. console.log(new Date() + " " + "建立连接");
  17. // $("#conn").removeAttr("disabled");
  18. var userCode = $.cookie("zx_user");
  19. Conn(userCode); //注册
  20. lockReconnect = false;
  21. };
  22. //接收到消息的回调方法
  23. wst.onmessage = function (evt) {
  24. console.log(new Date() + " receive " + evt.data);
  25. var data = JSON.parse(evt.data);
  26. if (data) {
  27. var ele = $("#" + data.code).find(".chatlist_con")[0];
  28. var type = data.action;
  29. switch (type.toLowerCase()) {
  30. case "serconn":
  31. if (!data.state) {
  32. $(".error").text(data.msg);
  33. }
  34. else {
  35. $(".sidebar_list").empty();//sidebar
  36. $(".chat_main").empty();
  37. }
  38. break;
  39. case "sersend":
  40. if (data.state) {
  41. append(ele, "self", data.msg, data.code, data.time, data.humanclass);
  42. $("#" + data.code).find(".send_content").val("");
  43. }
  44. else {
  45. notice(ele, "notice", data.msg);
  46. }
  47. break
  48. //case "sersenderror":
  49. // append("notice", data.msg);
  50. // break
  51. case "serreceive":
  52. if (!ele) {
  53. $('.before').show();
  54. var first = '';
  55. if (!$(".sidebar_list li").length) {
  56. first = 'activess';
  57. }
  58. // var userhtml = '<span class="user ' + first + '" code="' + data.code + '">' + data.name + '</span>';
  59. var userhtml = '<li class="user ' + first + ' li' + data.code + '" code="' + data.code + '">' +
  60. '<img class="ver_middle" src="img/youkeTx.png" alt="" width="30" height="30"/>' +
  61. '<p class="chat_name">' + data.name + '</p>' +
  62. '<i class="fa fa-circle pie" style="color:red;"></i>' +
  63. '<i class="fa fa-remove closeds" onclick="removed(this)"></i>' +
  64. '</li>';
  65. $(userhtml).appendTo(".sidebar_list").click(function () {
  66. $(".user").removeClass("activess");
  67. // $(this).siblings('li').removeClass("actives");
  68. $(this).addClass("activess");
  69. $(this).find('.pie').removeClass('pieShow').addClass('pieHide');
  70. $('.open_chat').find('.before').removeClass('show').addClass('hide');
  71. $(".tabMain").removeClass("activess");
  72. $("#" + $(this).attr("code")).addClass("activess");
  73. var conul = $("#" + $(this).attr("code")).find(".chatlist_con");
  74. $(conul).scrollTop($(conul)[0].scrollHeight);
  75. });
  76. var tabhtml = '<div class="tabMain ' + first + '" id="' + data.code + '">' +
  77. '<div class="main_message">' +
  78. '<ul class="chatlist_con">' +
  79. '<a href="javascript:void(0)" class="more" onclick="getmore(\'' + data.code + '\')"><i class="fa fa-clock-o" style="margin-right: 5px;"></i>查看更多信息</a>' +
  80. '<input type="hidden" class="hidnum" />' +
  81. '</ul>' +
  82. '</div>' +
  83. '<div class="main_sendMessage ">' +
  84. '<textarea name=" " rows=" " cols=" " onkeypress="keySend(event)" placeholder="按Enter 发送 " class="send_content "></textarea>' +
  85. '<input type="hidden" class="hidcid" value="' + data.code + '" />' +
  86. '<div class="send_btn ">' +
  87. '<button class="sendTo " onclick="sendinfo(\'' + data.code + '\') ">发送(S)</button>' +
  88. '<span style="color:red; " class="senderror"></span>' +
  89. '</div>' +
  90. '</div>' +
  91. '</div>';
  92. $(".chat_main").append($(tabhtml));
  93. ele = $("#" + data.code).find(".chatlist_con")[0];
  94. objs.action = "loglist";
  95. objs.code = data.code;
  96. Sends();
  97. }
  98. if (!data.state) {
  99. notice(ele, "notice", data.msg);
  100. }
  101. else {
  102. append(ele, "left", data.msg, data.code, data.time, data.humanclass);
  103. }
  104. break; //收到消息
  105. case "loglist":
  106. var list = data.data.rows;
  107. $(list).each(function (i, n) {
  108. var classname = "self";
  109. if (n.F_FromUser == data.code) {
  110. classname = "left";
  111. }
  112. insert(ele, classname, n.F_Message, $("#" + data.code).find(".hidnum").val(), n.F_HumanClass);
  113. })
  114. if (!data.data.isfirst) {
  115. $(ele).find(".more").css("display", "block");
  116. $("#" + data.code).find(".hidnum").val(data.data.num);
  117. }
  118. else {
  119. $(ele).find(".more").css("display", "none");
  120. }
  121. break;//聊天记录
  122. }
  123. }
  124. };
  125. //连接关闭的回调方法
  126. wst.onclose = function (evt) {
  127. console.log(new Date() + " " + "连接关闭");
  128. console.log(new Date() + " " + "开始重连");
  129. ReConnect();
  130. };
  131. //连接发生错误的回调方法
  132. wst.onerror = function (evt) {
  133. console.log(new Date() + " " + "连接异常");
  134. console.log(new Date() + " " + "开始重连");
  135. ReConnect();
  136. };
  137. }
  138. //重连
  139. function ReConnect() {
  140. if (!lockReconnect) {
  141. lockReconnect = true;
  142. //没连接上会一直重连,设置延迟避免请求过多
  143. setTimeout(function () {
  144. console.log(new Date() + " " + "重连中……");
  145. lockReconnect = false;
  146. CreateWebSockets();
  147. }, 2000);
  148. }
  149. }
  150. //发送
  151. function Sends() {
  152. if (wst.readyState != wst.OPEN) {
  153. ReConnect();
  154. }
  155. if (wst.readyState == wst.OPEN) {
  156. console.log(new Date() + " send " + JSON.stringify(objs));
  157. wst.send(JSON.stringify(objs));
  158. }
  159. }
  160. //注册
  161. function Conn(userCode) {
  162. console.log(userCode);
  163. objs.action = "serconn";
  164. objs.code = userCode;
  165. Sends();
  166. }
  167. //查看更多
  168. function getmore(ele) {
  169. objs.action = "loglist";
  170. objs.code = $("#" + ele).find(".hidcid").val();
  171. objs.msg = $("#" + ele).find(".hidnum").val();
  172. Sends();
  173. }
  174. //发送消息
  175. function sendinfo(ele) {
  176. var msg = $("#" + ele).find(".send_content").val();
  177. console.log(msg)
  178. if ($.trim(msg)) {
  179. objs.action = "sersend";
  180. objs.code = $("#" + ele).find(".hidcid").val();
  181. objs.msg = msg;
  182. Sends();
  183. $("#" + ele).find(".senderror").text("");
  184. }
  185. else {
  186. $("#" + ele).find(".send_content").val('');
  187. $("#" + ele).find(".senderror").text("请输入内容");
  188. }
  189. }
  190. function append(ele, cname, msg, codes, dates, humanclass) {
  191. var html = '<li>' +
  192. '<p class="message_time"><span>' + dates + '</span></p>' +
  193. '<div class="message_mincon ' + cname + '">'
  194. if (humanclass) {
  195. if (humanclass == 1)
  196. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  197. else if (humanclass == 2)
  198. html += '<img class="ver_middle chat_yhtx" src="img/youkeTx.png" alt="" width="30" height="30" />'
  199. else
  200. html += '<img class="ver_middle chat_yhtx" src="img/robot.png" alt="" width="30" height="30" />'
  201. }
  202. else {
  203. if (cname == 'self') {
  204. html += '<img class="ver_middle" src="img/kefuTx.png" alt="" width="30" height="30"/>'
  205. } else {
  206. html += '<img class="ver_middle" src="img/youkeTx.png" alt="" width="30" height="30"/>'
  207. }
  208. }
  209. html += '<div class="message_text">' + msg + '</div>' +
  210. '</div>' +
  211. '</li>'
  212. $(html).appendTo(ele);
  213. $(ele).scrollTop($(ele)[0].scrollHeight);
  214. $('.li' + codes).find('.pie').removeClass('pieHide').addClass('pieShow');
  215. $('.open_chat').find('.before').removeClass('hide').addClass('show');
  216. }
  217. function insert(ele, cname, msg, nodown,humanclass) {
  218. var html = '<li>' +
  219. // '<p class="message_time"><span>' + n.CreateDate + '</span></p>' +
  220. '<div class="message_mincon ' + cname + '">'
  221. if (humanclass) {
  222. if (humanclass == 1)
  223. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  224. else if (humanclass == 2)
  225. html += '<img class="ver_middle chat_yhtx" src="img/youkeTx.png" alt="" width="30" height="30" />'
  226. else
  227. html += '<img class="ver_middle chat_yhtx" src="img/robot.png" alt="" width="30" height="30" />'
  228. }
  229. else {
  230. if (cname == 'self') {
  231. html += '<img class="ver_middle chat_yhtx" src="img/kefuTx.png" alt="" width="30" height="30" />'
  232. } else {
  233. html += '<img class="ver_middle" src="img/youkeTx.png" alt="" width="30" height="30"/>'
  234. }
  235. }
  236. html += '<div class="message_text">' + msg + '</div>' +
  237. '</div>' +
  238. '</li>'
  239. var list = $(ele).find("li");
  240. if (list.length) {
  241. $(html).insertBefore(list[0]);
  242. }
  243. else {
  244. $(html).appendTo(ele);
  245. }
  246. if (!nodown) {
  247. $(ele).scrollTop($(ele)[0].scrollHeight);
  248. }
  249. }
  250. function notice(ele, cname, msg) {
  251. var html = '<li><span class="' + cname + '">' + msg + '</span></li>';
  252. $(html).appendTo(ele);
  253. $(ele).scrollTop($(ele)[0].scrollHeight);
  254. }
  255. // //键盘发送事件
  256. function keySend(event) {
  257. event = event || window.event;
  258. if (event.keyCode == 13) {
  259. $(".sendTo").click();
  260. event.returnValue = false;
  261. return false
  262. }
  263. }
  264. function removed(ele) {
  265. var code = $(ele).parent().attr('code');
  266. $(".user").removeClass("activess");
  267. $("#" + code).remove();
  268. $(ele).parent().remove();
  269. $(ele).parent().parent();
  270. showChat();
  271. }
  272. function showChat() {
  273. $('.sidebar_list').children("li:first-child").addClass("activess");
  274. $('.chat_main').children(".tabMain:first-child").addClass("activess");
  275. }
  276. $('.open_chat').click(function () {
  277. if ($('#chat').css('display') == 'block') {
  278. $('#chat').hide();
  279. } else {
  280. $('#chat').show();
  281. }
  282. })