説明なし

chats.html 25KB

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <title></title> <link href="../css/mui.min.css" rel="stylesheet" /> <link rel="stylesheet" type="text/css" href="../css/app.css" /> <link href="../css/iconfont.css" rel="stylesheet" /> <link href="../css/mui.imageviewer.css" rel="stylesheet" /> <style> html, body { height: 100%; margin: 0px; padding: 0px; overflow: hidden; -webkit-touch-callout: none; -webkit-user-select: none; } footer { position: fixed; width: 100%; height: 50px; min-height: 50px; border-top: solid 1px #bbb; left: 0px; bottom: 0px; overflow: hidden; padding: 0px 50px; background-color: #fafafa; } .footer-left { position: absolute; width: 50px; height: 50px; left: 0px; bottom: 0px; text-align: center; vertical-align: middle; line-height: 100%; padding: 12px 4px; } .footer-right { position: absolute; width: 50px; height: 50px; right: 0px; bottom: 0px; text-align: center; vertical-align: middle; line-height: 100%; padding: 12px 5px; display: inline-block; } .footer-center { height: 100%; padding: 5px 0px; } .footer-center [class*=input] { width: 100%; height: 100%; border-radius: 5px; } .footer-center .input-text { background: #fff; border: solid 1px #ddd; padding: 10px !important; font-size: 16px !important; line-height: 18px !important; font-family: verdana !important; overflow: hidden; } .footer-center .input-sound { background-color: #eee; } .mui-content { height: 100%; padding: 44px 0px 50px 0px; overflow: auto; background-color: #eaeaea; } #msg-list { height: 83%; overflow: auto; -webkit-overflow-scrolling: touch; } .msg-item { padding: 8px; clear: both; } .msg-item .mui-item-clear { clear: both; } .msg-item .msg-user { width: 38px; height: 38px; /*border: solid 1px #d3d3d3;*/ display: inline-block; background: #fff; border-radius: 3px; vertical-align: top; text-align: center; float: left; /*padding: 3px;*/ color: #ddd; } .msg-item .msg-user-img{ width: 38px; height: 38px; display: inline-block; border-radius: 3px; vertical-align: top; text-align: center; float: left; color: #ddd; } .msg-item .msg-content { display: inline-block; border-radius: 5px; border: solid 1px #E3E3E3; background-color: #FFFFFF; color: #333; padding: 8px; vertical-align: top; font-size: 15px; position: relative; margin: 0px 8px; max-width: 75%; min-width: 35px; float: left; } .msg-item .msg-content .msg-content-inner { overflow-x: hidden; } .msg-item .msg-content .msg-content-arrow { position: absolute; border: solid 1px #E3E3E3; border-right: none; border-top: none; background-color: #FFFFFF; width: 10px; height: 10px; left: -5px; top: 12px; -webkit-transform: rotateZ(45deg); transform: rotateZ(45deg); } .msg-item-self .msg-user, .msg-item-self .msg-content { float: right; } .msg-item-self .msg-content .msg-content-arrow { left: auto; right: -5px; -webkit-transform: rotateZ(225deg); transform: rotateZ(225deg); } .msg-item-self .msg-content, .msg-item-self .msg-content .msg-content-arrow { background-color: #0ee032; color: #fff; border-color: #0ee032; } footer .mui-icon { color: #999999; } footer .mui-icon:active { color: #FF9900 !important; }/*#007AFF*/ footer .mui-icon-paperplane:before { content: "发送"; } footer .mui-icon-paperplane { /*-webkit-transform: rotateZ(45deg); transform: rotateZ(45deg);*/ font-size: 16px; word-break: keep-all; line-height: 100%; padding-top: 6px; color: rgba(0, 135, 250, 1); } #msg-sound { -webkit-user-select: none !important; user-select: none !important; } .rprogress { position: absolute; left: 50%; top: 50%; width: 140px; height: 140px; margin-left: -70px; margin-top: -70px; background-image: url(../images/arecord.png); background-repeat: no-repeat; background-position: center center; background-size: 30px 30px; background-color: rgba(0, 0, 0, 0.7); border-radius: 5px; display: none; -webkit-transition: .15s; } .rschedule { background-color: rgba(0, 0, 0, 0); border: 5px solid rgba(0, 183, 229, 0.9); opacity: .9; border-left: 5px solid rgba(0, 0, 0, 0); border-right: 5px solid rgba(0, 0, 0, 0); border-radius: 50px; box-shadow: 0 0 15px #2187e7; width: 46px; height: 46px; position: absolute; left: 50%; top: 50%; margin-left: -23px; margin-top: -23px; -webkit-animation: spin 1s infinite linear; animation: spin 1s infinite linear; } .r-sigh{ display: none; border-radius: 50px; box-shadow: 0 0 15px #2187e7; width: 46px; height: 46px; position: absolute; left: 50%; top: 50%; margin-left: -23px; margin-top: -23px; text-align: center; line-height: 46px; font-size: 40px; font-weight: bold; color: #2187e7; } .rprogress-sigh{ background-image: none !important; } .rprogress-sigh .rschedule{ display: none !important; } .rprogress-sigh .r-sigh{ display: block !important; } .rsalert { font-size: 12px; color: #bbb; text-align: center; position: absolute; border-radius: 5px; width: 130px; margin: 5px 5px; padding: 5px; left: 0px; bottom: 0px; } @-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } #h { background: #fff; border: solid 1px #ddd; padding: 10px !important; font-size: 16px !important; font-family: verdana !important; line-height: 18px !important; overflow: visible; position: absolute; left: -1000px; right: 0px; word-break: break-all; word-wrap: break-word; } .cancel { background-color: darkred; } .displayNone { display: none; } #consultCon { margin: -11px 15px -11px; } #lookConBtn { text-align: center; font-size: 12px; } /*待评价开始*/ .frmbtn1 { border:1px solid red; border-radius:6px; color:red; } .frmbtn1.mui-btn:enabled:active{ background: red; color: #fff; } /*待评价结束*/ </style> </head> <body contextmenu="return false;"> <header class="mui-bar mui-bar-nav toptitbox"> <span class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left topback" id="backBtn"> <a href="consultlist.html"></a> </span> <h1 class="mui-title toptit" id="chatName"></h1> <!--<span class="mui-icon mui-icon-contact mui-pull-right personhead"></span>--> </header> <pre id='h'></pre> <script id='msg-template' type="text/template"> <% for(var i in record){ var item=record[i]; %> <div class="msg-item <%= (item.sender=='self'?' msg-item-self':'') %>" msg-type='<%=(item.type)%>' msg-content='<%=(item.content)%>'> <!--对话内容渲染--> <% if(item.sender=='self' ) { %> <!--<i class="msg-user mui-icon mui-icon-person"></i>--> <img class="msg-user msg-user-img" src="<%=(item.imgurl)%>" alt="" id="selfImg"/> <% } else { %> <img class="msg-user msg-user-img" src="<%=(item.imgurl)%>"alt="" id="thatImg"/> <% } %> <div class="msg-content"> <div class="msg-content-inner"> <% if(item.type=='text' ) { %> <%=( item.content|| '&nbsp;&nbsp;') %> <% } else if(item.type=='image' ) { %> <img class="msg-content-image" src="<%=(item.content)%>" style="max-width: 100px;" /> <% } else if(item.type=='sound' ) { %> <span class="mui-icon mui-icon-mic" style="font-size: 18px;font-weight: bold;"></span> <span class="play-state">点击播放</span> <% } %> </div> <div class="msg-content-arrow"></div> </div> <div class="mui-item-clear"></div> </div> <% } %> </script> <div class="mui-content"> <div class="displayNone" id="status"></div> <div class="operatebox"> <div class="themespan mui-pull-left"> <span class="" id="consultTitle"> </span> </div> <!--我的需求,进行中--> <div class="operatebtnbox mui-pull-right displayNone" id="confirm"> <button class="mui-btn mui-btn-block mui-btn-outlined frmbtn operatebtn" id="confirmBtn" >点击确认完成咨询</button> </div> <!--我的需求,未评价--> <div class="operatebtnbox mui-pull-right displayNone" id="assessBtn"> <button class="mui-btn mui-btn-block mui-btn-outlined frmbtn1 operatebtn" style="width:80px;">去评价</button> </div> <!--我的需求,已评价--> <div class="operatebtnbox mui-pull-right operated displayNone" id="assessed"> <div class="evabox" id="myNeeAss"> <span>已评价</span> <div class="levelbox" id="my_starContainer"> <span class="mui-icon iconfont icon-favor"></span> <!--无色星星icon-favor 黄色星icon-favorfill--> <span class="mui-icon iconfont icon-favor"></span> <span class="mui-icon iconfont icon-favor"></span> <span class="mui-icon iconfont icon-favor"></span> <span class="mui-icon iconfont icon-favor"></span> </div> </div> </div> <!--收到咨询,对方未评价--> <div class="operatebtnbox mui-pull-right displayNone" style="width:30%;" id="that_weiassess"> <div class="evabox"><span>对方还未评价</span></div> </div> <!--收到咨询,进行中--> <div class="operatebtnbox mui-pull-right displayNone" id="waying" style="width:30%;"> <!--<div class="evabox"><span>进行中</span></div>--> </div> <!--收到咨询,对方已评价--> <div class="operatebtnbox mui-pull-right operated displayNone" id="that_assessed" style="cursor: pointer;"> <div class="evabox" id="getConAss"> <span>对方已评价</span> <div class="levelbox" id="consult_starContainer"> <span class="mui-icon iconfont icon-favor"></span> <!--无色星星icon-favor 黄色星icon-favorfill--> <span class="mui-icon iconfont icon-favor"></span> <span class="mui-icon iconfont icon-favor"></span> <span class="mui-icon iconfont icon-favor"></span> <span class="mui-icon iconfont icon-favor"></span> </div> </div> </div> </div> <div class="consult_content"> <ul class="mui-table-view" > <li class="mui-table-view-cell mui-collapse" id="mui-active" style="background-color:#fff;border-top:1px solid #f0f0f0;border-top:1px solid #f0f0f0;"> <div class="mui-collapse-content" id="consultCon"> 可以在折叠面板中放置任何内容;折叠面板默认收缩,若希望某个面板默认展开, 只需要在包含.mui-collapse类的li节点上,增加.mui-active类即可;mui官网中的方法说明, 使用的就是折叠面板控件。 </div> <a class="mui-navigate-right" href="#" id="lookConBtn">查看咨询内容</a> </li> </ul> </div> <div id='msg-list'> </div> </div> <footer class="" id="chatFooter"> <!--<div class="footer-left"> <i id='msg-image' class="mui-icon mui-icon-camera" style="font-size: 28px;"></i> </div>--> <div class="footer-center"> <textarea id='msg-text' type="text" class='input-text'></textarea> <button id='msg-sound' type="button" class='input-sound' style="display: none;">按住说话</button> </div> <label for="" class="footer-right"> <i id='msg-type' class="mui-icon mui-icon-paperplane"></i> </label> </footer> <div id='sound-alert' class="rprogress"> <div class="rschedule"></div> <div class="r-sigh">!</div> <div id="audio_tips" class="rsalert">手指上滑,取消发送</div> </div> <script src="../js/public/mui.min.js"></script> <script src="../js/public/base.js"></script> <script src="../js/public/mui.imageViewer.js"></script> <script src="../js/public/arttmpl.js"></script> <script type="text/javascript" src="../js/chats.js"></script> <script type="text/javascript" charset="utf-8"> /*mui.init({ swipeBack: true //启用右滑关闭功能 });*/ /*mui('.mui-scroll-wrapper').scroll(); mui('body').on('shown', '.mui-popover', function(e) { //console.log('shown', e.detail.id);//detail为当前popover元素 console.log('shown'); }); mui('body').on('hidden', '.mui-popover', function(e) { //console.log('hidden', e.detail.id);//detail为当前popover元素 });*/ /*(function($, doc) { var MIN_SOUND_TIME = 800; $.init({ gestureConfig: { tap: true, //默认为true doubletap: true, //默认为false longtap: true, //默认为false swipe: true, //默认为true drag: true, //默认为true hold: true, //默认为false,不监听 release: true //默认为false,不监听 } }); template.config('escape', false); //$.plusReady=function(fn){fn();}; $.plusReady(function() { plus.webview.currentWebview().setStyle({ softinputMode: "adjustResize" }); var showKeyboard = function() { if ($.os.ios) { var webView = plus.webview.currentWebview().nativeInstanceObject(); webView.plusCallMethod({ "setKeyboardDisplayRequiresUserAction": false }); } else { var Context = plus.android.importClass("android.content.Context"); var InputMethodManager = plus.android.importClass("android.view.inputmethod.InputMethodManager"); var main = plus.android.runtimeMainActivity(); var imm = main.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED); //var view = ((ViewGroup)main.findViewById(android.R.id.content)).getChildAt(0); imm.showSoftInput(main.getWindow().getDecorView(), InputMethodManager.SHOW_IMPLICIT); //alert("ll"); } }; var record = [{ sender: 'zs', type: 'text', content: 'Hi,我是 科袖 小管家!' }]; var ui = { body: doc.querySelector('body'), footer: doc.querySelector('footer'), footerRight: doc.querySelector('.footer-right'), footerLeft: doc.querySelector('.footer-left'), btnMsgType: doc.querySelector('#msg-type'), boxMsgText: doc.querySelector('#msg-text'), boxMsgSound: doc.querySelector('#msg-sound'), btnMsgImage: doc.querySelector('#msg-image'), areaMsgList: doc.querySelector('#msg-list'), boxSoundAlert: doc.querySelector('#sound-alert'), h: doc.querySelector('#h'), content: doc.querySelector('.mui-content') }; ui.h.style.width = ui.boxMsgText.offsetWidth+'px'; //alert(ui.boxMsgText.offsetWidth ); var footerPadding = ui.footer.offsetHeight - ui.boxMsgText.offsetHeight; var msgItemTap = function(msgItem, event) { var msgType = msgItem.getAttribute('msg-type'); var msgContent = msgItem.getAttribute('msg-content') if (msgType == 'sound') { player = plus.audio.createPlayer(msgContent); var playState = msgItem.querySelector('.play-state'); playState.innerText = '正在播放...'; player.play(function() { playState.innerText = '点击播放'; }, function(e) { playState.innerText = '点击播放'; }); } }; var imageViewer = new $.ImageViewer('.msg-content-image', { dbl: false }); var bindMsgList = function() { //绑定数据: // tp.bind({ // template: 'msg-template', // element: 'msg-list', // model: record // }); ui.areaMsgList.innerHTML = template('msg-template', { "record": record }); var msgItems = ui.areaMsgList.querySelectorAll('.msg-item'); [].forEach.call(msgItems, function(item, index) { item.addEventListener('tap', function(event) { msgItemTap(item, event); }, false); }); imageViewer.findAllImage(); ui.areaMsgList.scrollTop = ui.areaMsgList.scrollHeight + ui.areaMsgList.offsetHeight; }; bindMsgList(); window.addEventListener('resize', function() { ui.areaMsgList.scrollTop = ui.areaMsgList.scrollHeight + ui.areaMsgList.offsetHeight; }, false); var send = function(msg) { record.push(msg); bindMsgList(); toRobot(msg.content); }; var toRobot = function(info) { var apiUrl = 'http://www.tuling123.com/openapi/api'; // var apiUrl = baseUrl+'/ajax/tidings/qacon'; $.getJSON(apiUrl, { "key": 'acfbca724ea1b5db96d2eef88ce677dc', "info": info, "userid": plus.device.uuid }, function(data) { //alert(JSON.stringify(data)); record.push({ sender: 'zs', type: 'text', content: data.text }); bindMsgList(); }); }; function msgTextFocus() { ui.boxMsgText.focus(); setTimeout(function() { ui.boxMsgText.focus(); }, 150); } //解决长按“发送”按钮,导致键盘关闭的问题; ui.footerRight.addEventListener('touchstart', function(event) { if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) { msgTextFocus(); event.preventDefault(); } }); //解决长按“发送”按钮,导致键盘关闭的问题; ui.footerRight.addEventListener('touchmove', function(event) { if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) { msgTextFocus(); event.preventDefault(); } }); // ui.footerRight.addEventListener('touchcancel', function(event) { // if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) { // msgTextFocus(); // event.preventDefault(); // } // }); // ui.footerRight.addEventListener('touchend', function(event) { // if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) { // msgTextFocus(); // event.preventDefault(); // } // }); ui.footerRight.addEventListener('release', function(event) { if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) { //showKeyboard(); ui.boxMsgText.focus(); setTimeout(function() { ui.boxMsgText.focus(); }, 150); // event.detail.gesture.preventDefault(); send({ sender: 'self', type: 'text', content: ui.boxMsgText.value.replace(new RegExp('\n', 'gm'), '<br/>') }); ui.boxMsgText.value = ''; $.trigger(ui.boxMsgText, 'input', null); } else if (ui.btnMsgType.classList.contains('mui-icon-mic')) { ui.btnMsgType.classList.add('mui-icon-compose'); ui.btnMsgType.classList.remove('mui-icon-mic'); ui.boxMsgText.style.display = 'none'; ui.boxMsgSound.style.display = 'block'; ui.boxMsgText.blur(); document.body.focus(); } else if (ui.btnMsgType.classList.contains('mui-icon-compose')) { ui.btnMsgType.classList.add('mui-icon-mic'); ui.btnMsgType.classList.remove('mui-icon-compose'); ui.boxMsgSound.style.display = 'none'; ui.boxMsgText.style.display = 'block'; //-- //showKeyboard(); ui.boxMsgText.focus(); setTimeout(function() { ui.boxMsgText.focus(); }, 150); } }, false); ui.footerLeft.addEventListener('tap', function(event) { var btnArray = [{ title: "拍照" }, { title: "从相册选择" }]; plus.nativeUI.actionSheet({ title: "选择照片", cancel: "取消", buttons: btnArray }, function(e) { var index = e.index; switch (index) { case 0: break; case 1: var cmr = plus.camera.getCamera(); cmr.captureImage(function(path) { send({ sender: 'self', type: 'image', content: "file://" + plus.io.convertLocalFileSystemURL(path) }); }, function(err) {}); break; case 2: plus.gallery.pick(function(path) { send({ sender: 'self', type: 'image', content: path }); }, function(err) {}, null); break; } }); }, false); var setSoundAlertVisable=function(show){ if(show){ ui.boxSoundAlert.style.display = 'block'; ui.boxSoundAlert.style.opacity = 1; }else{ ui.boxSoundAlert.style.opacity = 0; //fadeOut完成再真正隐藏 setTimeout(function(){ ui.boxSoundAlert.style.display = 'none'; },200); } }; var recordCancel = false; var recorder = null; var audio_tips = document.getElementById("audio_tips"); var startTimestamp = null; var stopTimestamp = null; var stopTimer = null; ui.boxMsgSound.addEventListener('hold', function(event) { recordCancel = false; if(stopTimer)clearTimeout(stopTimer); audio_tips.innerHTML = "手指上划,取消发送"; ui.boxSoundAlert.classList.remove('rprogress-sigh'); setSoundAlertVisable(true); recorder = plus.audio.getRecorder(); if (recorder == null) { plus.nativeUI.toast("不能获取录音对象"); return; } startTimestamp = (new Date()).getTime(); recorder.record({ filename: "_doc/audio/" }, function(path) { if (recordCancel) return; send({ sender: 'self', type: 'sound', content: path }); }, function(e) { plus.nativeUI.toast("录音时出现异常: " + e.message); }); }, false); ui.body.addEventListener('drag', function(event) { //console.log('drag'); if (Math.abs(event.detail.deltaY) > 50) { if (!recordCancel) { recordCancel = true; if (!audio_tips.classList.contains("cancel")) { audio_tips.classList.add("cancel"); } audio_tips.innerHTML = "松开手指,取消发送"; } } else { if (recordCancel) { recordCancel = false; if (audio_tips.classList.contains("cancel")) { audio_tips.classList.remove("cancel"); } audio_tips.innerHTML = "手指上划,取消发送"; } } }, false); ui.boxMsgSound.addEventListener('release', function(event) { //console.log('release'); if (audio_tips.classList.contains("cancel")) { audio_tips.classList.remove("cancel"); audio_tips.innerHTML = "手指上划,取消发送"; } // stopTimestamp = (new Date()).getTime(); if (stopTimestamp - startTimestamp < MIN_SOUND_TIME) { audio_tips.innerHTML = "录音时间太短"; ui.boxSoundAlert.classList.add('rprogress-sigh'); recordCancel = true; stopTimer=setTimeout(function(){ setSoundAlertVisable(false); },800); }else{ setSoundAlertVisable(false); } recorder.stop(); }, false); ui.boxMsgSound.addEventListener("touchstart", function(e) { //console.log("start...."); e.preventDefault(); }); ui.boxMsgText.addEventListener('input', function(event) { ui.btnMsgType.classList[ui.boxMsgText.value == '' ? 'remove' : 'add']('mui-icon-paperplane'); ui.btnMsgType.setAttribute("for", ui.boxMsgText.value == '' ? '' : 'msg-text'); ui.h.innerText = ui.boxMsgText.value.replace(new RegExp('\n', 'gm'), '\n-') || '-'; ui.footer.style.height = (ui.h.offsetHeight + footerPadding) + 'px'; ui.content.style.paddingBottom = ui.footer.style.height; }); ui.boxMsgText.addEventListener('tap', function(event) { ui.boxMsgText.focus(); setTimeout(function() { ui.boxMsgText.focus(); }, 0); }, false); }); }(mui, document));*/ </script> </body> </html>