chats.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  6. <title></title>
  7. <link href="../../css/common/mui.min.css" rel="stylesheet" />
  8. <link rel="stylesheet" type="text/css" href="../../css/common/common.css" />
  9. <link rel="stylesheet" type="text/css" href="../../css/communicate/chats.css" />
  10. <style>
  11. /*聊天记录删除*/
  12. .msg-item-cz {
  13. position: relative;
  14. }
  15. .canclecommentss {
  16. position: absolute;
  17. font-size: 14px !important;
  18. left: 70%;
  19. top: 60px;
  20. padding: 10px;
  21. text-align: center;
  22. height: 34px;
  23. width: 50px;
  24. border: 1px solid #ccc;
  25. background: #F0F0F0;
  26. box-shadow: 5px 5px 5px #888888;
  27. color: #1BADF8;
  28. border-radius: 3px;
  29. z-index: 99999;
  30. display: none;
  31. }
  32. //三角形会话
  33. .canclecommentss:before {
  34. box-sizing: content-box;
  35. width: 0px;
  36. height: 0px;
  37. position: absolute;
  38. top: -18px;
  39. right: 14px;
  40. padding: 0;
  41. border-bottom: 8px solid #C7C7CC;
  42. border-top: 8px solid transparent;
  43. border-left: 8px solid transparent;
  44. border-right: 8px solid transparent;
  45. display: block;
  46. content: '';
  47. z-index: 12;
  48. }
  49. .canclecommentss:after {
  50. box-sizing: content-box;
  51. width: 0px;
  52. height: 0px;
  53. position: absolute;
  54. top: -18px;
  55. ;
  56. right: 14px;
  57. padding: 0;
  58. border-bottom: 9px solid #C7C7CC;
  59. border-top: 9px solid transparent;
  60. border-left: 9px solid transparent;
  61. border-right: 9px solid transparent;
  62. display: block;
  63. content: '';
  64. z-index: 10
  65. }
  66. </style>
  67. </head>
  68. <body class="Body" contextmenu="return false;">
  69. <header id="header" class="mui-bar mui-bar-nav">
  70. <a class="mui-icon mui-icon-arrowleft fh">
  71. <span class="back">返回</span>
  72. </a>
  73. <h1 class="mui-title">聊天窗口</h1>
  74. </header>
  75. <pre id='h'></pre>
  76. <script id='msg-template' type="text/template">
  77. <% for(var i in record){ var item=record[i]; %>
  78. <div class="msg-item msg-item-cz <%= (item.sender=='self'?' msg-item-self':'') %>" msg-type='<%=(item.type)%>' msg-content='<%=(item.content)%>'>
  79. <% if(item.sender=='self' ) { %>
  80. <img class="msg-user" src="<%=(item.src)%>" alt="" />
  81. <% } else { %>
  82. <img class="msg-user-img" src="<%=(item.src)%>" alt="" />
  83. <% } %>
  84. <div class="msg-content">
  85. <div class="msg-content-inner ">
  86. <% if(item.type=='text' ) { %>
  87. <%=( item.content|| '&nbsp;&nbsp;') %>
  88. <% } else if(item.type=='image' ) { %>
  89. <img class="msg-content-image" src="<%=(item.content)%>" style="max-width: 100px;" />
  90. <% } else if(item.type=='sound' ) { %>
  91. <span class="mui-icon mui-icon-mic" style="font-size: 18px;font-weight: bold;"></span>
  92. <span class="play-state">点击播放</span>
  93. <% } %>
  94. </div>
  95. <div class="msg-content-arrow"></div>
  96. </div>
  97. <div class="mui-item-clear"></div>
  98. <div class="canclecommentss">删除</div>
  99. </div>
  100. <% } %>
  101. </script>
  102. <div class="mui-content">
  103. <div id='msg-list'>
  104. </div>
  105. </div>
  106. <footer>
  107. <!--<div class="footer-left">
  108. <i id='msg-image' class="mui-icon mui-icon-camera" style="font-size: 28px;"></i>
  109. </div>-->
  110. <div class="footer-center">
  111. <textarea id='msg-text' type="text" class='input-text'></textarea>
  112. <button id='msg-sound' type="button" class='input-sound' style="display: none;">按住说话</button>
  113. </div>
  114. <label for="" class="footer-right">
  115. <i id='msg-type' class="mui-icon mui-icon-paperplane"></i>
  116. </label>
  117. </footer>
  118. <div id='sound-alert' class="rprogress">
  119. <div class="rschedule"></div>
  120. <div class="r-sigh">!</div>
  121. <div id="audio_tips" class="rsalert">手指上滑,取消发送</div>
  122. </div>
  123. <script src="../../libs/mui.min.js"></script>
  124. <script src="../../app/communicate-js/arttmpl.js"></script>
  125. <script src="../../app/communicate-js/mui.imageViewer.js"></script>
  126. <script type="text/javascript" charset="utf-8">
  127. (function($, doc) {
  128. var MIN_SOUND_TIME = 800;
  129. $.init({
  130. gestureConfig: {
  131. tap: true, //默认为true
  132. doubletap: true, //默认为false
  133. longtap: true, //默认为false
  134. swipe: true, //默认为true
  135. drag: true, //默认为true
  136. hold: true, //默认为false,不监听
  137. release: true //默认为false,不监听
  138. }
  139. });
  140. template.config('escape', false);
  141. //$.plusReady=function(fn){fn();};
  142. var scoket;
  143. $.plusReady(function() {
  144. var self = plus.webview.currentWebview();
  145. var datas = self.data;
  146. var str = plus.storage.getItem('user');
  147. var user = JSON.parse(str);
  148. var token = user.Data.Token;
  149. var data = token + datas
  150. var aa = plus.storage.getItem(data + 'item')
  151. plus.webview.currentWebview().setStyle({
  152. softinputMode: "adjustResize"
  153. });
  154. $(document.body).on('tap', '.fh', function() {
  155. $.back();
  156. });
  157. var showKeyboard = function() {
  158. if($.os.ios) {
  159. var webView = plus.webview.currentWebview().nativeInstanceObject();
  160. webView.plusCallMethod({
  161. "setKeyboardDisplayRequiresUserAction": false
  162. });
  163. } else {
  164. var Context = plus.android.importClass("android.content.Context");
  165. var InputMethodManager = plus.android.importClass("android.view.inputmethod.InputMethodManager");
  166. var main = plus.android.runtimeMainActivity();
  167. var imm = main.getSystemService(Context.INPUT_METHOD_SERVICE);
  168. imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
  169. //var view = ((ViewGroup)main.findViewById(android.R.id.content)).getChildAt(0);
  170. imm.showSoftInput(main.getWindow().getDecorView(), InputMethodManager.SHOW_IMPLICIT);
  171. //alert("ll");
  172. }
  173. };
  174. //获取储存id
  175. var arrayId = JSON.parse(plus.storage.getItem('chartId'));
  176. var count;
  177. if(arrayId != null || arrayId != undefined) {
  178. for(var i = 0; i < arrayId.length; i++) {
  179. if(data == arrayId[i]) {
  180. count = i;
  181. break;
  182. }
  183. }
  184. var conTent = JSON.parse(plus.storage.getItem(arrayId[count]));
  185. var record = [];
  186. for(var i = 0; i < conTent.length; i++) {
  187. if(conTent[i].mine[0].id == self.data) {
  188. if(aa != i) {
  189. record.push({
  190. sender: 'zs',
  191. type: 'text',
  192. content: conTent[i].mine[0].content,
  193. src: 'http://www.bosshand.cn/' + conTent[i].mine[0].avatar
  194. })
  195. }
  196. } else {
  197. if(aa != i) {
  198. record.push({
  199. sender: 'self',
  200. type: 'text',
  201. content: conTent[i].mine[0].content,
  202. src: 'http://www.bosshand.cn/' + conTent[i].mine[0].avatar
  203. })
  204. }
  205. }
  206. }
  207. } else {
  208. var record = [];
  209. }
  210. //接收消息
  211. window.addEventListener('Msg', function(event) {
  212. record.push({
  213. sender: 'zs',
  214. type: 'text',
  215. content: event.detail.content,
  216. src: 'http://www.bosshand.cn/' + conTent[0].to[0].avatar
  217. });
  218. bindMsgList();
  219. }, false);
  220. var ui = {
  221. body: doc.querySelector('body'),
  222. footer: doc.querySelector('footer'),
  223. footerRight: doc.querySelector('.footer-right'),
  224. // footerLeft: doc.querySelector('.footer-left'),
  225. btnMsgType: doc.querySelector('#msg-type'),
  226. boxMsgText: doc.querySelector('#msg-text'),
  227. boxMsgSound: doc.querySelector('#msg-sound'),
  228. btnMsg: doc.querySelector('#msg-image'),
  229. areaMsgList: doc.querySelector('#msg-list'),
  230. boxSoundAlert: doc.querySelector('#sound-alert'),
  231. h: doc.querySelector('#h'),
  232. content: doc.querySelector('.mui-content')
  233. };
  234. ui.h.style.width = ui.boxMsgText.offsetWidth + 'px';
  235. //alert(ui.boxMsgText.offsetWidth );
  236. var footerPadding = ui.footer.offsetHeight - ui.boxMsgText.offsetHeight;
  237. var msgItemTap = function(msgItem, event) {
  238. var msgType = msgItem.getAttribute('msg-type');
  239. var msgContent = msgItem.getAttribute('msg-content')
  240. if(msgType == 'sound') {
  241. player = plus.audio.createPlayer(msgContent);
  242. var playState = msgItem.querySelector('.play-state');
  243. playState.innerText = '正在播放...';
  244. player.play(function() {
  245. playState.innerText = '点击播放';
  246. }, function(e) {
  247. playState.innerText = '点击播放';
  248. });
  249. }
  250. };
  251. var imageViewer = new $.ImageViewer('.msg-content-image', {
  252. dbl: false
  253. });
  254. var bindMsgList = function() {
  255. //绑定数据:
  256. /*tp.bind({
  257. template: 'msg-template',
  258. element: 'msg-list',
  259. model: record
  260. });*/
  261. ui.areaMsgList.innerHTML = template('msg-template', {
  262. "record": record
  263. });
  264. var msgItems = ui.areaMsgList.querySelectorAll('.msg-item');
  265. [].forEach.call(msgItems, function(item, index) {
  266. item.addEventListener('tap', function(event) {
  267. msgItemTap(item, event);
  268. }, false);
  269. });
  270. imageViewer.findAllImage();
  271. ui.areaMsgList.scrollTop = ui.areaMsgList.scrollHeight + ui.areaMsgList.offsetHeight;
  272. if(aa != null) {
  273. var strs = new Array(); //定义一数组
  274. strs = aa.split(","); //字符分割
  275. for(var i = 0; i < strs.length - 1; i++) {
  276. var s = strs[i];
  277. $('.msg-item')[s].style.display = 'none'
  278. }
  279. }
  280. };
  281. bindMsgList();
  282. window.addEventListener('resize', function() {
  283. ui.areaMsgList.scrollTop = ui.areaMsgList.scrollHeight + ui.areaMsgList.offsetHeight;
  284. }, false);
  285. //发送消息
  286. var send = function(msg) {
  287. msg.src = 'http://www.bosshand.cn/' + user.Data.Picture;
  288. record.push(msg);
  289. var detailPage = plus.webview.getWebviewById('communicate.html');
  290. mui.fire(detailPage, 'sendMsg', {
  291. msg: msg,
  292. mine: datas,
  293. to: data
  294. });
  295. bindMsgList();
  296. };
  297. function msgTextFocus() {
  298. ui.boxMsgText.focus();
  299. setTimeout(function() {
  300. ui.boxMsgText.focus();
  301. }, 150);
  302. }
  303. //解决长按“发送”按钮,导致键盘关闭的问题;
  304. ui.footerRight.addEventListener('touchstart', function(event) {
  305. if(ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  306. msgTextFocus();
  307. event.preventDefault();
  308. }
  309. });
  310. //解决长按“发送”按钮,导致键盘关闭的问题;
  311. ui.footerRight.addEventListener('touchmove', function(event) {
  312. if(ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  313. msgTextFocus();
  314. event.preventDefault();
  315. }
  316. });
  317. // ui.footerRight.addEventListener('touchcancel', function(event) {
  318. // if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  319. // msgTextFocus();
  320. // event.preventDefault();
  321. // }
  322. // });
  323. // ui.footerRight.addEventListener('touchend', function(event) {
  324. // if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  325. // msgTextFocus();
  326. // event.preventDefault();
  327. // }
  328. // });
  329. ui.footerRight.addEventListener('release', function(event) {
  330. if(ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  331. if(ui.boxMsgText.value != '') {
  332. //showKeyboard();
  333. ui.boxMsgText.focus();
  334. setTimeout(function() {
  335. ui.boxMsgText.focus();
  336. }, 150);
  337. //event.detail.gesture.preventDefault();
  338. send({
  339. sender: 'self',
  340. type: 'text',
  341. content: ui.boxMsgText.value.replace(new RegExp('\n', 'gm'), '<br/>')
  342. });
  343. ui.boxMsgText.value = '';
  344. }
  345. //$.trigger(ui.boxMsgText, 'input', null);
  346. } else if(ui.btnMsgType.classList.contains('mui-icon-mic')) {
  347. ui.btnMsgType.classList.add('mui-icon-compose');
  348. ui.btnMsgType.classList.remove('mui-icon-mic');
  349. ui.boxMsgText.style.display = 'none';
  350. ui.boxMsgSound.style.display = 'block';
  351. ui.boxMsgText.blur();
  352. document.body.focus();
  353. } else if(ui.btnMsgType.classList.contains('mui-icon-compose')) {
  354. ui.btnMsgType.classList.add('mui-icon-mic');
  355. ui.btnMsgType.classList.remove('mui-icon-compose');
  356. ui.boxMsgSound.style.display = 'none';
  357. ui.boxMsgText.style.display = 'block';
  358. //--
  359. //showKeyboard();
  360. ui.boxMsgText.focus();
  361. setTimeout(function() {
  362. ui.boxMsgText.focus();
  363. }, 150);
  364. }
  365. }, false);
  366. // ui.footerLeft.addEventListener('tap', function(event) {
  367. // var btnArray = [{
  368. // title: "拍照"
  369. // }, {
  370. // title: "从相册选择"
  371. // }];
  372. // plus.nativeUI.actionSheet({
  373. // title: "选择照片",
  374. // cancel: "取消",
  375. // buttons: btnArray
  376. // }, function(e) {
  377. // var index = e.index;
  378. // switch(index) {
  379. // case 0:
  380. // break;
  381. // case 1:
  382. // var cmr = plus.camera.getCamera();
  383. // cmr.captureImage(function(path) {
  384. // send({
  385. // sender: 'self',
  386. // type: 'image',
  387. // content: "file://" + plus.io.convertLocalFileSystemURL(path)
  388. // });
  389. // }, function(err) {});
  390. // break;
  391. // case 2:
  392. // plus.gallery.pick(function(path) {
  393. // send({
  394. // sender: 'self',
  395. // type: 'image',
  396. // content: path
  397. // });
  398. // }, function(err) {}, null);
  399. // break;
  400. // }
  401. // });
  402. // }, false);
  403. var setSoundAlertVisable = function(show) {
  404. if(show) {
  405. ui.boxSoundAlert.style.display = 'block';
  406. ui.boxSoundAlert.style.opacity = 1;
  407. } else {
  408. ui.boxSoundAlert.style.opacity = 0;
  409. //fadeOut 完成再真正隐藏
  410. setTimeout(function() {
  411. ui.boxSoundAlert.style.display = 'none';
  412. }, 200);
  413. }
  414. };
  415. var recordCancel = false;
  416. var recorder = null;
  417. var audio_tips = document.getElementById("audio_tips");
  418. var startTimestamp = null;
  419. var stopTimestamp = null;
  420. var stopTimer = null;
  421. ui.boxMsgSound.addEventListener('hold', function(event) {
  422. recordCancel = false;
  423. if(stopTimer) clearTimeout(stopTimer);
  424. audio_tips.innerHTML = "手指上划,取消发送";
  425. ui.boxSoundAlert.classList.remove('rprogress-sigh');
  426. setSoundAlertVisable(true);
  427. recorder = plus.audio.getRecorder();
  428. if(recorder == null) {
  429. plus.nativeUI.toast("不能获取录音对象");
  430. return;
  431. }
  432. startTimestamp = (new Date()).getTime();
  433. recorder.record({
  434. filename: "_doc/audio/"
  435. }, function(path) {
  436. if(recordCancel) return;
  437. send({
  438. sender: 'self',
  439. type: 'sound',
  440. content: path
  441. });
  442. }, function(e) {
  443. plus.nativeUI.toast("录音时出现异常: " + e.message);
  444. });
  445. }, false);
  446. ui.body.addEventListener('drag', function(event) {
  447. if(Math.abs(event.detail.deltaY) > 50) {
  448. if(!recordCancel) {
  449. recordCancel = true;
  450. if(!audio_tips.classList.contains("cancel")) {
  451. audio_tips.classList.add("cancel");
  452. }
  453. audio_tips.innerHTML = "松开手指,取消发送";
  454. }
  455. } else {
  456. if(recordCancel) {
  457. recordCancel = false;
  458. if(audio_tips.classList.contains("cancel")) {
  459. audio_tips.classList.remove("cancel");
  460. }
  461. audio_tips.innerHTML = "手指上划,取消发送";
  462. }
  463. }
  464. }, false);
  465. ui.boxMsgSound.addEventListener('release', function(event) {
  466. if(audio_tips.classList.contains("cancel")) {
  467. audio_tips.classList.remove("cancel");
  468. audio_tips.innerHTML = "手指上划,取消发送";
  469. }
  470. //
  471. stopTimestamp = (new Date()).getTime();
  472. if(stopTimestamp - startTimestamp < MIN_SOUND_TIME) {
  473. audio_tips.innerHTML = "录音时间太短";
  474. ui.boxSoundAlert.classList.add('rprogress-sigh');
  475. recordCancel = true;
  476. stopTimer = setTimeout(function() {
  477. setSoundAlertVisable(false);
  478. }, 800);
  479. } else {
  480. setSoundAlertVisable(false);
  481. }
  482. recorder.stop();
  483. }, false);
  484. ui.boxMsgSound.addEventListener("touchstart", function(e) {
  485. e.preventDefault();
  486. });
  487. ui.boxMsgText.addEventListener('input', function(event) {
  488. // ui.btnMsgType.classList[ui.boxMsgText.value == '' ? 'remove' : 'add']('mui-icon-paperplane');
  489. ui.btnMsgType.setAttribute("for", ui.boxMsgText.value == '' ? '' : 'msg-text');
  490. ui.h.innerText = ui.boxMsgText.value.replace(new RegExp('\n', 'gm'), '\n-') || '-';
  491. ui.footer.style.height = (ui.h.offsetHeight + footerPadding) + 'px';
  492. ui.content.style.paddingBottom = ui.footer.style.height;
  493. });
  494. var focus = false;
  495. ui.boxMsgText.addEventListener('tap', function(event) {
  496. ui.boxMsgText.focus();
  497. setTimeout(function() {
  498. ui.boxMsgText.focus();
  499. }, 0);
  500. focus = true;
  501. setTimeout(function() {
  502. focus = false;
  503. }, 1000);
  504. event.detail.gesture.preventDefault();
  505. }, false);
  506. //点击消息列表,关闭键盘
  507. ui.areaMsgList.addEventListener('click', function(event) {
  508. if(!focus) {
  509. ui.boxMsgText.blur();
  510. }
  511. })
  512. //删除聊天记录
  513. $(doc.body).on('tap', '.msg-item', function() {
  514. var cancleconte = $(this)[0];
  515. var parent = doc.getElementsByClassName('msg-item')
  516. plus.nativeUI.actionSheet({
  517. cancel: "取消",
  518. buttons: [{
  519. title: "删除"
  520. }]
  521. },
  522. function(e) {
  523. for(var i = 0; i < parent.length; i++) {
  524. if(parent[i].innerHTML == cancleconte.innerHTML) {
  525. if(plus.storage.getItem(data + 'item') == null) {
  526. arr += String(i) + ','
  527. plus.storage.setItem(data + 'item', arr);
  528. } else {
  529. var arrs = plus.storage.getItem(data + 'item');
  530. arrs += String(i) + ','
  531. plus.storage.setItem(data + 'item', arrs);
  532. }
  533. break;
  534. }
  535. }
  536. cancleconte.style.display = "none";
  537. }
  538. );
  539. })
  540. //点击删除canclecommentss
  541. var arr = '';
  542. $(doc.body).on('tap', '.canclecommentss', function() {
  543. var cancleconte = $(this)[0].parentNode;
  544. var parent = doc.getElementsByClassName('msg-item')
  545. for(var i = 0; i < parent.length; i++) {
  546. if(parent[i].innerHTML == cancleconte.innerHTML) {
  547. if(plus.storage.getItem(data + 'item') == null) {
  548. arr += String(i) + ','
  549. plus.storage.setItem(data + 'item', arr);
  550. } else {
  551. var arrs = plus.storage.getItem(data + 'item');
  552. arrs += String(i) + ','
  553. plus.storage.setItem(data + 'item', arrs);
  554. }
  555. break;
  556. }
  557. }
  558. cancleconte.style.display = "none";
  559. })
  560. });
  561. }(mui, document));
  562. </script>
  563. </body>
  564. </html>