我的實(shí)現(xiàn)思路是:
1.用一個(gè)數(shù)組,儲(chǔ)存用戶(hù)輸入框的所有內(nèi)容(包括表情和輸入的文本)
2.監(jiān)聽(tīng)onchange事件,將每次輸入的文本都單獨(dú)提取出來(lái)push到顯示數(shù)組內(nèi)
3.表情用兩個(gè)數(shù)組保存,點(diǎn)擊表情圖標(biāo)時(shí),獲取當(dāng)前點(diǎn)擊的表情將該表情的title和src分別保存在兩個(gè)數(shù)組內(nèi),title數(shù)組用戶(hù)輸入框顯示,src的數(shù)組用戶(hù)發(fā)送后顯示表情圖標(biāo)
問(wèn)題描述:
按照輸入的順序(包含文本和表情)顯示正確,如果在已經(jīng)輸入的內(nèi)容中再插入新的內(nèi)容顯示會(huì)異常(在已輸入的文本中再插入文本目前正常,主要是在已經(jīng)輸入的表情中再插入文本,顯示異常)。
例如:輸入[微笑]123[微笑],實(shí)際是先輸入的微笑,然后后兩個(gè)表情中間插入的123;文字和表情混合輸入會(huì)顯示異常
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
#div_body {
width: 720px;
margin: 0 auto;
}
#div_1 {
width: 720px;
height: 200px;
background-color: black;
opacity: 0.7;
color: white;
overflow-y: auto;
overflow-x: hidden;
}
#div1 img {
width: 24px;
height: 24px;
}
#send {
width: 720px;
height: 32px;
background-color: #954b4b;
}
#send > button {
display: inline-block;
width: 60px;
height: 32px;
float: right;
}
textarea {
float: left;
display: block;
width: 660px;
font-family: 微軟雅黑, "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 16px;
height: 32px;
max-height: 80px;
resize: none;
box-sizing: border-box;
-webkit-box-flex: 1;
box-shadow: rgba(0, 0, 0, 0.2) 0 1px 4px inset;
padding: 5px 10px;
overflow: hidden;
outline: none;
}
#div_ul > li {
width: 720px;
height: 287px;
background-image: url("004.jpg");
clear: both;
}
#div_ul li i {
display: block;
float: left;
width: 102px;
height: 93px;
}
#div_ul li i:hover {
border: 1px solid #5f9cc5;
}
</style>
</head>
<body>
<script>
window.onload = function () {
var div_1 = document.getElementById('div_1');
var send = document.getElementById('send');
var div_ul = document.getElementById('div_ul');
var send_txt = send.firstElementChild;
var send_button = send.lastElementChild;
var emj_i = document.getElementsByTagName('i');
send_button.onclick = function () {
if (send_txt.value.length !== 0) {//判斷是否輸入了內(nèi)容
var send_list = document.createElement('div');
var new_p = document.createElement('p');
div_1.appendChild(send_list);
send_list.appendChild(new_p);
/**/
new_p.innerHTML = send_arry.join('');
/**/
send_txt.value = '';//發(fā)送完清空輸入框內(nèi)容
send_arry = [];
send_emj_flg = 0;
emj_arry = [];//顯示
send_emj = [];//發(fā)送
} else {
alert('沒(méi)輸入');
}
};
var send_arry = [];
send_txt.onchange = function () {
send_arry.push(this.value.substring(send_emj_flg));
console.log(send_arry);
console.log(this.value.length);
};
var emj_arry = [];//顯示
var send_emj = [];//發(fā)送
var send_emj_flg = 0;
for (var i = 0; i < emj_i.length; i++) {
emj_i[i].index = i;
emj_i[i].onclick = function () {
//debugger;
if (this.title !== 'delKey') {
emj_arry.push('[' + this.title + ']');
emj_arry.toString();
send_emj.push("<img src=\"http://pub.idqqimg.com/lib/qqface/" + this.index + ".gif\">");//用于表情發(fā)送后顯示圖標(biāo)
/**/
send_arry.push(send_emj[send_emj.length - 1]);//每次點(diǎn)擊的表情都會(huì)push到send_arry,所以send_emj只取最后一個(gè)即可
/**/
if (send_txt.value.length > 0) {//起手點(diǎn)擊表情沒(méi)有文字輸入
send_txt.value = send_txt.value + '[' + this.title + ']';
}
if (send_txt.value.length === 0) {//文字輸入在先然后再點(diǎn)擊表情
send_txt.value = emj_arry.join('');
}
/*11.13*/
send_emj_flg = send_txt.value.length;
/*11.13*/
}
else {
alert('這是刪除');
}
}
}
};
</script>
<div id="div_body">
<div id="div_1"></div>
<div id="send">
<textarea></textarea>
<button>發(fā)送按鈕</button>
</div>
<ul id="div_ul">
<li>
<i title="微笑"></i>
<i title="撇嘴"></i>
<i title="色"></i>
<i title="發(fā)呆"></i>
<i title="得意"></i>
<i title="流淚"></i>
<i title="害羞"></i>
<i title="閉嘴"></i>
<i title="睡"></i>
<i title="大哭"></i>
<i title="尷尬"></i>
<i title="發(fā)怒"></i>
<i title="調(diào)皮"></i>
<i title="呲牙"></i>
<i title="驚訝"></i>
<i title="難過(guò)"></i>
<i title="酷"></i>
<i title="冷汗"></i>
<i title="抓狂"></i>
<i title="吐"></i>
<i title="delKey"></i>
</li>
</ul>
</div>
</body>
</html>
我是初學(xué)者,目前自己在自學(xué)前端,求教諸位前輩指點(diǎn)思路,在此感謝?。?!
或許你可以調(diào)整一下思路:不在用戶(hù)輸入時(shí)處理,而是在展示時(shí)才處理內(nèi)容。
你之前的思路: 用戶(hù)點(diǎn)擊表情,又是判斷輸入框里之前的內(nèi)容,又是存儲(chǔ)表情,等等。
其實(shí)這些都不用,我們換成這樣的思路:先不管用戶(hù)如何輸入,他怎么輸入,輸入框就怎樣展示,比如他輸入兩個(gè)表情與一個(gè)文本,那么輸入框的內(nèi)容是[微笑]123[撇嘴],等到用戶(hù)點(diǎn)擊發(fā)送按鈕要把內(nèi)容展示到聊天框里時(shí),再把[微笑]和[撇嘴]轉(zhuǎn)換為表情。
提供一個(gè)簡(jiǎn)單的代碼:
// 存儲(chǔ)所有表情,方便轉(zhuǎn)換
/*
emj_arry = {
[冷汗] : {
text: "冷汗",
url: "http://pub.idqqimg.com/lib/qqface/17.gif"
},
[發(fā)呆] : {
text: "發(fā)呆",
url: "http://pub.idqqimg.com/lib/qqface/3.gif"
}
}
*/
var emj_arry = {}; //表情列表
var emj_i = document.getElementsByTagName('i');
for(var i=0, len=emj_i.length; i<len; i++){
var item = emj_i[i];
// emj_arry.push( '[' + item.title + ']' );
emj_arry[ '[' + item.title + ']' ] = {
text : item.title,
url : 'http://pub.idqqimg.com/lib/qqface/' + i + '.gif'
};
}
// 將文字轉(zhuǎn)換為圖片
function emoj2img(text){
return text.replace(/\[(.*?)\]/g, function(word){
return '<img src="'+emj_arry[word].url+'" alt="'+word+'" />';
})
}
// 輸入表情
document.querySelector('#div_ul').addEventListener('click', function(event){
if(event.target.tagName=='I' && event.target.title!=='delKey'){
send_txt.value = send_txt.value + '[' + event.target.title + ']';
}
});
// 點(diǎn)擊按鈕發(fā)送
document.querySelector('button').addEventListener('click', function(){
var textarea = document.querySelector('#send textarea'),
value = textarea.value;
document.querySelector('#div_1').innerHTML += '<p>'+emoj2img(value)+'</p>'; // 把表情轉(zhuǎn)換為圖片后輸出
textarea.value = '';
});北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。