本次在项目中,需要制作一个客服与顾客进行对话的消息界面,所以采用了webSocket进行双方间交流时的数据传递。话不多说直接上代码:
// 创建socket
function createWebSocket() {
const wsUrl = "ws://";
try {
ws = new WebSocket(wsUrl);
init();
} catch (e) {
console.log('catch');
reconnect();
}
}
var lockReconnect = false; // 避免重复连接的标识
// 重新连接socket
function reconnect() {
if (lockReconnect) return;
lockReconnect = true;
var tt
tt && clearTimeout(tt);
tt = setTimeout(function () { // 没连接上会一直重连,设置延迟避免请求过多
createWebSocket();
lockReconnect = false;
}, 4000);
}
// 初始化socket
function init() {
ws.onclose = function () { // 连接关闭时触发
console.log('链接关闭');
reconnect();
};
ws.onerror = function () { // 通信发生错误时触发
console.log('发生异常了');
reconnect();
};
ws.onopen = function () { // 连接建立时触发
var obj = { //心跳检测重置
'to': customer_id,
'form': kefu_id,
'type': '-1',
'content': $('#sendText').val()
};
ws.send(JSON.stringify(obj));
heartCheck.start();
};
ws.onmessage = function (event) { //拿到任何消息都说明当前连接是正常的
console.log('接收到消息');
getChatEvent(JSON.parse(event.data));
heartCheck.start();
}
}
// 心跳检测
var heartCheck = {
timeout: 3000,
timeoutObj: null,
serverTimeoutObj: null,
start: function () {
console.log('start');
var self = this;
console.log(this.timeoutObj)
this.timeoutObj && clearTimeout(this.timeoutObj);
this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
this.timeoutObj = setTimeout(function () { //这里发送一个心跳,后端收到后,返回一个心跳消息,
if (ws.readyState == 1) { //onmessage拿到返回的心跳就说明连接正常
} else { //否则重连
reconnect();
}
}, this.timeout)
}
};
客服这边的发送事件代码如下:
// 发送事件
function sendMsgBtn() {
heartCheck.start();
var obj = {
'to': customer_id,
'form': kefu_id,
'type': '1',
'content': $('#sendText').val(),
};
console.log(obj.content)
ws.send(JSON.stringify(obj));
msg_html_arr[customer_index - 1]['msg'] += `
<p class="time"><span>${getCurrentDate()}</span></p>
<div class="chatout">
<img src="../img/kefu.jpg">
<span>${$('#sendText').val()}</span>
</div>`;
$('#sendText').val('');
setHTMLEvent();
}
顾客的接收事件的代码:
// 接收事件
function setChatEvent(item) {
returnHTML();
if (!customer_index) { // 尚未进行过对话
let msg_html = '';
item.message.forEach((item_) => {
msg_html += `
<p class="time"><span>${item_.created_at}</span></p>
<div class="chatin">
<img src="${item.headimg}">
<span>${item_.words}</span>
</div>`;
});
msg_html_arr.push({
name: customer_id,
msg: msg_html
});
}
returnHTML();
setHTMLEvent();
}
实时获取到返回的数据代码:
// 实时获取返回信息
function getChatEvent(data) {
if (data.type !== '1') return;
msg_html_arr[customer_index - 1]['msg'] += `
<p class="time"><span>${getCurrentDate()}</span></p>
<div class="chatin">
<img src="${cust_img}">
<span>${data.content}</span>
</div>`;
setHTMLEvent();
}
效果图:

来源:https://www.cnblogs.com/hxw1024/p/12023983.html