whisper-mobile.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. // 客服的id
  2. var kf_id = 0;
  3. var kf_name = '';
  4. // 是否点击显示表情的标志
  5. var flag = 1;
  6. // 发送锁 标识
  7. var sendLock = 0;
  8. // 是否显示默认的聊天记录
  9. var commChat = 1;
  10. // 连接服务器
  11. if(config != undefined && config.socket != undefined){
  12. // 创建一个Socket实例
  13. var socket = new WebSocket('ws://' + config.socket);
  14. // 加锁
  15. lockInput();
  16. //showSystem({content: '连接中...'});
  17. document.getElementById('title').innerText = '连接中...';
  18. // 打开Socket
  19. socket.onopen = function(res) {
  20. console.log('握手成功');
  21. // 登录
  22. var login_data = '{"type":"userInit", "uid": ' + config.uid + ', "name" : "' + config.name +
  23. '", "avatar" : "' + config.avatar + '", "group" : ' + config.group + '}';
  24. socket.send(login_data);
  25. // 解锁
  26. unlockInput();
  27. };
  28. // 监听消息
  29. socket.onmessage = function(res) {
  30. var data = eval("("+res.data+")");
  31. switch(data['message_type']){
  32. // 服务端ping客户端
  33. case 'ping':
  34. socket.send('{"type":"ping"}');
  35. break;
  36. // 已经被分配了客服
  37. case 'connect':
  38. kf_id = data.data.kf_id;
  39. kf_name = data.data.kf_name;
  40. showSystem({content: '客服 ' + data.data.kf_name + ' 为您服务'});
  41. document.getElementById('title').innerHTML = '与 ' + kf_name + ' 交流中';
  42. if(1 == commChat){
  43. showChatLog();
  44. }
  45. unlockInput();
  46. break;
  47. // 排队等待
  48. case 'wait':
  49. lockInput();
  50. document.getElementById('title').innerHTML = '请稍后再来';
  51. showSystem(data.data);
  52. break;
  53. // 监测聊天数据
  54. case 'chatMessage':
  55. showMsg(data.data);
  56. break;
  57. // 问候语
  58. case 'helloMessage':
  59. showMsg(data.data, 1);
  60. break;
  61. // 转接
  62. case 'relinkMessage':
  63. commChat = 2;
  64. document.getElementById('title').innerHTML = '正在转接中...';
  65. break;
  66. }
  67. };
  68. // 监听错误
  69. socket.onerror = function(err){
  70. showSystem({content: '连接失败'});
  71. document.getElementById('title').innerText = '连接失败';
  72. };
  73. }
  74. // 图片 文件上传
  75. layui.use(['upload'], function () {
  76. var upload = layui.upload;
  77. // 执行实例
  78. var uploadInstImg = upload.render({
  79. elem: '#up-image' // 绑定元素
  80. , accept: 'images'
  81. , exts: 'jpg|jpeg|png|gif'
  82. , url: '/index/upload/uploadImg' // 上传接口
  83. , done: function (res) {
  84. sendMsg('img[' + res.data.src + ']');
  85. }
  86. , error: function () {
  87. // 请求异常回调
  88. }
  89. });
  90. $('.layui-upload-file').hide();
  91. });
  92. $(function(){
  93. // 修复IOS下输入法遮挡问题
  94. $('input[type="text"],textarea').on('click', function () {
  95. var target = this;
  96. setTimeout(function(){
  97. target.scrollIntoViewIfNeeded();
  98. }, 200);
  99. });
  100. // 监听输入改变发送按钮
  101. $("#msg").bind('input porpertychange', function(){
  102. if($("#msg").val().length > 0){
  103. $(".layim-send").removeClass('layui-disabled');
  104. }else{
  105. $(".layim-send").addClass('layui-disabled');
  106. }
  107. });
  108. // 点击发送
  109. $("#send").click(function(){
  110. sendMsg();
  111. });
  112. // 点击表情
  113. $('#up-face').click(function(e){
  114. e.stopPropagation();
  115. if(1 == flag){
  116. showFaces();
  117. $('#face-box').show();
  118. flag = 2;
  119. }else{
  120. $('#face-box').hide();
  121. flag = 1;
  122. }
  123. });
  124. // 监听点击旁边关闭表情
  125. document.addEventListener("click",function(){
  126. if(2 == flag){
  127. document.getElementById('face-box').style.display = 'none';
  128. flag = 1;
  129. }
  130. });
  131. });
  132. // 发送消息
  133. function sendMsg(sendMsg){
  134. if(1 == sendLock){
  135. return false;
  136. }
  137. var msg = (typeof(sendMsg) == 'undefined') ? $('#msg').val() : sendMsg;
  138. if('' == msg){
  139. return false;
  140. }
  141. var _html = $("#chat-list").html();
  142. var time = getTime();
  143. var content = replaceContent(msg);
  144. _html += '<li class="layim-chat-system"><span>' + time + '</span></li>'
  145. _html += '<li class="layim-chat-li layim-chat-mine">';
  146. _html += '<div class="layim-chat-user">';
  147. _html += '<img src="' + config.avatar + '"><cite>我</cite></div>';
  148. _html += '<div class="layim-chat-text">' + content + ' </div></li>';
  149. $('#chat-list').html(_html);
  150. // 发送消息
  151. socket.send(JSON.stringify({
  152. type: 'chatMessage',
  153. data: {to_id: kf_id, to_name: kf_name, content: msg, from_name: config.name,
  154. from_id: config.uid, from_avatar: config.avatar}
  155. }));
  156. // 储存我发出的信息
  157. var key = kf_id + '-' + config.uid;
  158. if(typeof(Storage) !== "undefined"){
  159. var localMsg = getCache(key);
  160. if(localMsg == null || localMsg.length == 0){
  161. localMsg = [];
  162. }
  163. localMsg.push({type: 'mine', name: '我', time: time, content: content, avatar: config.avatar});
  164. cacheChat({key: key, data: localMsg});
  165. }
  166. $('#msg').val('');
  167. $(".layim-send").addClass('layui-disabled');
  168. // 滚动条自动定位到最底端
  169. wordBottom();
  170. }
  171. // 展示发送来的消息
  172. function showMsg(info, flag){
  173. var _html = $("#chat-list").html();
  174. var content = replaceContent(info.content);
  175. _html += '<li class="layim-chat-system"><span>' + info.time + '</span></li>';
  176. _html += '<li class="layim-chat-li">';
  177. _html += '<div class="layim-chat-user">';
  178. _html += '<img src="' + info.avatar + '"><cite>' + info.name + '</cite></div>';
  179. _html += '<div class="layim-chat-text">' + content + '</div></li>';
  180. $('#chat-list').html(_html);
  181. // 滚动条自动定位到最底端
  182. wordBottom();
  183. // 储存我收到的信息
  184. var key = kf_id + '-' + config.uid;
  185. if(typeof(Storage) !== "undefined" && typeof(flag) == "undefined"){
  186. var localMsg = getCache(key);
  187. if(localMsg == null || localMsg.length == 0){
  188. localMsg = [];
  189. }
  190. localMsg.push({type: 'other', name: info.name, time: info.time, content: content, avatar: info.avatar});
  191. cacheChat({key: key, data: localMsg});
  192. }
  193. }
  194. // 获取时间
  195. function getTime(){
  196. var myDate = new Date();
  197. var hour = myDate.getHours();
  198. var minute = myDate.getMinutes();
  199. if(hour < 10) hour = '0' + hour;
  200. if(minute < 10) minute = '0' + minute;
  201. return hour + ':' + minute;
  202. }
  203. // 缓存聊天数据 [本地存储策略]
  204. function cacheChat(obj){
  205. if(typeof(Storage) !== "undefined"){
  206. localStorage.setItem(obj.key, JSON.stringify(obj.data));
  207. }
  208. }
  209. // 从本地缓存中,拿出数据
  210. function getCache(key){
  211. return JSON.parse(localStorage.getItem(key));
  212. }
  213. // 对话框定位到最底端
  214. function wordBottom() {
  215. // 滚动条自动定位到最底端
  216. var box = $(".layim-chat-main");
  217. box.scrollTop(box[0].scrollHeight);
  218. }
  219. // 锁住输入框
  220. function lockInput(){
  221. sendLock = 1;
  222. document.getElementById('msg').setAttribute('readonly', 'readonly');
  223. }
  224. // 解锁输入框
  225. function unlockInput(){
  226. sendLock = 0;
  227. document.getElementById('msg').removeAttribute('readonly');
  228. }
  229. // 展示表情数据
  230. function showFaces(){
  231. var alt = getFacesIcon();
  232. var _html = '<ul class="layui-layim-face">';
  233. var len = alt.length;
  234. for(var index = 0; index < len; index++){
  235. _html += '<li title="' + alt[index] + '" onclick="checkFace(this)"><img src="/static/customer/images/face/'+ index + '.gif" /></li>';
  236. }
  237. _html += '</ul>';
  238. document.getElementById('face-box').innerHTML = _html;
  239. }
  240. // 选择表情
  241. function checkFace(obj){
  242. var msg = document.getElementById('msg').value;
  243. document.getElementById('msg').value = msg + ' face' + obj.title + ' ';
  244. document.getElementById('face-box').style.display = 'none';
  245. $(".layim-send").removeClass('layui-disabled');
  246. flag = 1;
  247. }
  248. // 系统消息
  249. function showSystem(info){
  250. $("#chat-list").append('<li class="layim-chat-system"><span>' + info.content + '</span></li>');
  251. }
  252. // 展示本地聊天缓存
  253. function showChatLog(){
  254. var chatLog = getCache(kf_id + '-' + config.uid);
  255. if(chatLog == null || chatLog.length == 0){
  256. return ;
  257. }
  258. var _html = '';
  259. var len = chatLog.length;
  260. for(var i = 0; i < len; i++){
  261. var item = chatLog[i];
  262. if('mine' == item.type){
  263. _html += '<li class="layim-chat-system"><span>' + item.time + '</span></li>'
  264. _html += '<li class="layim-chat-li layim-chat-mine">';
  265. _html += '<div class="layim-chat-user">';
  266. _html += '<img src="' + item.avatar + '"><cite>'+ item.name + '</cite></div>';
  267. _html += '<div class="layim-chat-text">' + item.content + ' </div></li>';
  268. }else if('other' == item.type){
  269. _html += '<li class="layim-chat-system"><span>' + item.time + '</span></li>';
  270. _html += '<li class="layim-chat-li">';
  271. _html += '<div class="layim-chat-user">';
  272. _html += '<img src="' + item.avatar + '"><cite>' + item.name + '</cite></div>';
  273. _html += '<div class="layim-chat-text">' + item.content + '</div></li>';
  274. }
  275. }
  276. document.getElementById('chat-list').innerHTML = _html;
  277. // 滚动条自动定位到最底端
  278. wordBottom();
  279. }
  280. // 退出
  281. function loginOut(){
  282. window.history.go(-1);
  283. }