window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
var FastChat = {
ws: {
SocketTask: null,
Timer: null,
ErrorMsg: [],
MaxRetryCount: 3,// 最大重连次数
CurrentRetryCount: 0,
url: null
},
audio: {
context: new window.AudioContext(),
source: null,
buffer: null
},
cookie_prefix:'',// 同config.php里边的cookie前缀设置,未修改过请忽略
config: null,
url: null,
window_is_show: false,
fast_move: false,
session_id: 0,
is_cross_domain: false,// 是否跨域,若为站外调用,则在js中建立游客cookie
allowed_close_window: true,// 是否允许ecs关闭窗口(当预览图片时,不允许关闭),
initialize: function (url = document.domain, modulename = 'index', initSuccess = null) {
FastChat.url = url;
if(document.domain !== url){
FastChat.is_cross_domain = true;
}
var initialize_url = FastChat.buildUrl(url, modulename, 'initialize');
$.ajax({
url: initialize_url,
success: function (data) {
if (data.code === 403) {
return;
} else if (data.code !== 1) {
layer.msg(data.msg);
return;
}
FastChat.config = data.data;
FastChat.bulidChat(data.data);
FastChat.show_popover((!FastChat.getCookie('new_user')) ? data.data.new_user_tip : data.data.new_msg);
// 站外调用游客身份cookie建立
if (FastChat.is_cross_domain) {
FastChat.setCookie('fastchat_tourists', FastChat.config.token_list.fastchat_tourists_token, 10);
}
// 构建ws的url
FastChat.ws.url = FastChat.buildUrl('billiards.websocket.xunsoftware.com', modulename, 'ws', data.data.websocket_port);
if (modulename === 'admin') {
// 立即链接 Websocket
FastChat.ConnectSocket();
} else {
// 若用户 N 秒后任在此页面,链接Socket
setTimeout(function () {
if (!FastChat.ws.SocketTask || FastChat.ws.SocketTask.readyState === 3 || FastChat.ws.SocketTask.readyState === 2) {
FastChat.ConnectSocket();
}
}, 10000);
}
if (typeof initSuccess == 'function') {
initSuccess();
}
if (data.data.new_msg) {
// 抖动按钮和播放提示音
FastChat.new_message_prompt('#chat_button');
}
}
})
FastChat.eventReg();
},
ConnectSocket: function () {
if ("WebSocket" in window) {
var ws = new WebSocket(FastChat.ws.url);
FastChat.ws.SocketTask = ws;
ws.onopen = function () {
FastChat.ws.CurrentRetryCount = 0;
// 重新发送所有出错的消息
if (FastChat.ws.ErrorMsg.length > 0) {
for (let i in FastChat.ws.ErrorMsg) {
FastChat.ws_send(FastChat.ws.ErrorMsg[i]);
}
FastChat.ws.ErrorMsg = [];
}
if (FastChat.ws.Timer != null) {
clearInterval(FastChat.ws.Timer);
}
if ($('#error_warning').html()) {
$('#error_warning').html('');
$('#chat_button').popover('hide');
}
FastChat.ws.Timer = setInterval(FastChat.ws_send, 28000);//定时发送心跳
};
ws.onmessage = function (evt) {
var msg = $.parseJSON(evt.data);
if (msg.code === 0) {
layer.msg(msg.msg);
}
FastChat.domsg(msg);
};
ws.onclose = function (e) {
if (FastChat.ws.Timer != null) {
clearInterval(FastChat.ws.Timer);
}
$('#error_warning').html('网络链接已断开');
FastChat.show_popover('WebSocket 链接已断开');
if (FastChat.ws.MaxRetryCount) {
FastChat.ws.Timer = setInterval(FastChat.retry_webSocket, 3000);//每3秒重新连接一次
}
};
ws.onerror = function (e) {
// 错误
console.error('websocket 错误:', e);
$('#error_warning').html('WebSocket 发生错误');
FastChat.show_popover('WebSocket 发生错误,请查看控制台');
};
} else {
layer.msg(FastChat.config.chat_name + ':您的浏览器不支持 WebSocket!');
}
},
retry_webSocket: function () {
if (FastChat.ws.CurrentRetryCount < FastChat.ws.MaxRetryCount) {
FastChat.ws.CurrentRetryCount++;
FastChat.ConnectSocket();
console.log('重连 WebSocket 第' + FastChat.ws.CurrentRetryCount + '次');
} else {
if (FastChat.ws.Timer != null) {
clearInterval(FastChat.ws.Timer);
}
if (FastChat.ws.ReConnection) {
console.log('每隔10秒将再次尝试重连 WebSocket')
FastChat.ws.Timer = setInterval(FastChat.ConnectSocket, 10000);//每10秒重新连接一次
}
}
},
bulidChat: function (data) {
$("
")
.attr({
'data-toggle': "popover",
'data-title': '新消息',
'data-placement': "auto left",
'data-content': '',
'style': 'position: fixed;top: 100px;width: 48px;height: 48px;right: 90px;z-index: 9999;',
'data-html': true,
'data-template': '
',
id: 'chat_button',
class: 'chat_button'
})
.appendTo("body");
$("
![]()
")
.attr({
src: FastChat.config.__CDN__ + "/assets/addons/fastchat/img/fastchat.png",
ondragstart: "return false;",
style: 'width: 100%;height: 100%;'
})
.appendTo("#chat_button");
$("body").append(data.window_html);
$('#search_input').attr('placeholder', data.search_tip);
if (!FastChat.ws.SocketTask || FastChat.ws.SocketTask.readyState === 3 || FastChat.ws.SocketTask.readyState === 2) {
$('#error_warning').html('链接中...');
}
let send_tis_key = parseInt(data.send_message_key) === 1 ? 'Enter' : 'Ctrl+Enter';
$('#send_tis').html('按下' + send_tis_key + '发送消息');
var username = data.user_info ? data.user_info.username : '未登录';
$('#modal-title').html(data.chat_name + ' - ' + username);
},
buildSession: function (item) {
if (item.existing_session || $('#session_list').children("[data-session='" + item.id + "']").length) {
// 去掉该会话再添加最新的
$('#session_list').children("[data-session='" + item.id + "']").remove();
}
$('#session_list').prepend(
'
' +
'
' +
'' +
'' + item.nickname + '' +
'' + item.last_time + '' +
'
' +
'' + item.last_message + '' +
(item.unread_msg_count ? '' + item.unread_msg_count + '' : '') +
'
' +
''
);
if (!item.online) {
// 把头像变灰色
FastChat.edit_online_status(item.session_user, 0);
}
},
buildSessionTime: function (data, page) {
if (parseInt(page) === 1) {
$('.chat_scroll').append('
' + data + '
');
} else {
$('.chat_scroll').prepend('
' + data + '
');
}
},
buildRecord: function (data, page) {
if (parseInt(page) === 1) {
$('.chat_scroll').append('
' + data.message + '
');
} else {
$('.chat_scroll').prepend('
' + data.message + '
');
}
},
changeSession: function (event) {
if (event.length === 0) {
FastChat.session_id = 0;
$('#session_user_name').html('无会话');
return;
}
$('.person').removeClass("active");
if ($('.chat-container .right').css('display') != 'none' &&
$('.chat-container .left').css('display') != 'none') {
event.addClass("active");
}
let session_id = event.data('session');
// 加载聊天记录
var load_message = {
c: 'Message',
a: 'chat_record',
data: {
session_id: session_id,
page: 1
}
};
FastChat.session_id = session_id;
FastChat.ws_send(load_message);
// 清理红点
event.children(".session_info_item").children(".unread_msg_count").eq(0).hide(200);
// 获取焦点
$('#message').focus();
$('.chat_emoji').hide();
},
buildChatImg: function (filename, facename, is_filepath = false) {
if (is_filepath) {
return '

';
} else {
return '

';
}
},
buildChatA: function (filepath, file_suffix) {
return '
点击下载:' + file_suffix + ' 文件';
},
buildUrl: function (url, modulename, type = 'ws', wsport = 8282) {
// 用户的身份通过读取 cookie 来识别
var protocol = window.location.protocol + '//';
var port = window.location.port;
port = port ? ':' + port:'';
if (type === 'ws') {
// 用户的身份通过 FastChat.config.token_list.kefu_token 来识别
// 游客的身份通过 FastChat.config.token_list.fastchat_tourists_token 来识别
let token = '&token=' + (FastChat.config.token_list.fastchat_token ? FastChat.config.token_list.fastchat_token : '');
let fastchat_user = '&fastchat_user=' + (FastChat.config.token_list.fastchat_tourists_token ? FastChat.config.token_list.fastchat_tourists_token : '');
protocol = parseInt(FastChat.config.wss_switch) === 1 ? 'wss://':'ws://';
return protocol + url + ':' + wsport + '?modulename=' +
modulename + token + fastchat_user;
} else if (type === 'initialize') {
if (FastChat.is_cross_domain){
return protocol + url + port + '/addons/fastchat/index/initialize?modulename=' +
modulename + '&tourists_token=' + FastChat.getCookie('fastchat_tourists');
}
return protocol + url + port + '/addons/fastchat/index/initialize?modulename=' +
modulename;
} else if (type === 'upload') {
return protocol + url + port + '/addons/fastchat/index/upload?modulename=' +
modulename;
} else if (type === 'load_message_prompt') {
return protocol + url + port + '/addons/fastchat/index/load_message_prompt?modulename=' +
modulename;
}
},
// 设置搜索框选中的预选词
setSelectedItem: function () {
if (FastChat.search_primary < 0) {
FastChat.search_primary = $('#search_users').find('li').length - 1;
} else if (FastChat.search_primary > $('#search_users').find('li').length - 1) {
FastChat.search_primary = 0;
}
$('#search_users').find('li').removeClass('select_item')
.eq(FastChat.search_primary).addClass('select_item');
// 将预选词放入输入框
$('#search_input').val($('#search_users').find('li').eq(FastChat.search_primary).data('nickname'));
FastChat.search_select_id = $('#search_users').find('li').eq(FastChat.search_primary).data('userid');
},
postAddSession: function () {
if (!FastChat.search_select_id) {
layer.msg('用户找不到啦!');
}
$('#search_input').val('');
var load_message = {
c: 'Message',
a: 'add_session',
data: {
user_id: FastChat.search_select_id
}
};
FastChat.ws_send(load_message);
},
sendMessage: function (message) {
var load_message = {
c: 'Message',
a: 'send_message',
data: {
message: message,
session_id: FastChat.session_id
}
};
FastChat.ws_send(load_message);
var data = {
sender: 'me',
message: message
}
FastChat.buildRecord(data, 1);
$('#message').html('');
var re = new RegExp("
![]()
", "g");
message = message.replace(re, '[图片]');
re = new RegExp("
", "g");
message = message.replace(re, '[链接]');
// 修改该会话的最后消息
let session = $('#session_list').children("[data-session='" + FastChat.session_id + "']");
session.children(".session_info_item").children(".time").eq(0).html('刚刚');
session.children(".session_info_item").children(".preview").eq(0).html(message);
let first_session = $('#session_list li').eq(0);
first_session.before(session);
if ($('#chat_scroll').children('.conversation-start').children('span').eq(0).html() === '还没有消息') {
$('#chat_scroll').children('.conversation-start').children('span').eq(0).html('刚刚');
}
$('.chat_scroll').scrollTop($('.chat_scroll')[0].scrollHeight);
},
show_window: function () {
FastChat.window_is_show = true;
if (!FastChat.getCookie('new_user')) {
FastChat.setCookie('new_user', true, 365);
}
// 检查 websocket 是否连接
if (!FastChat.ws.SocketTask || FastChat.ws.SocketTask.readyState === 3 || FastChat.ws.SocketTask.readyState === 2) {
FastChat.ConnectSocket();
}
// 隐藏会话按钮和提示消息
$('#chat_button').popover('hide');
$('#chat_button').hide(200);
$('#FastChat').modal({
keyboard: false,
show: true
});
// 找到当前会话,去掉红点标记(直接重载当前会话)
if (FastChat.session_id) {
var load_message = {
c: 'Message',
a: 'chat_record',
data: {
session_id: FastChat.session_id,
page: 1
}
};
FastChat.ws_send(load_message);
// 清理红点
let session = $('#session_list').children("[data-session='" + FastChat.session_id + "']");
session.children(".session_info_item").children(".unread_msg_count").eq(0).hide(200);
} else {
FastChat.changeSession($('.person').eq(0));
}
},
forecast_add_session: function (e) {
// 预添加会话
FastChat.search_select_id = $(e.currentTarget).data('userid');
FastChat.postAddSession();//添加会话
$('#search_users').hide(200);
$('#search_input').val('');
FastChat.search_select_id = 0;
// 显示会话窗口
FastChat.show_window();
},
show_popover: function (content) {
if (!FastChat.window_is_show && content) {
$('#chat_button').attr("data-content", content);
$('#chat_button').popover('show');
}
},
edit_online_status: function (user_id, status) {
if (status) {
$('#session_list').children("[data-session_user='" + user_id + "']").children(".person_avatar").removeClass("person_head_gray");
} else {
$('#session_list').children("[data-session_user='" + user_id + "']").children(".person_avatar").addClass("person_head_gray");
}
},
edit_shielding_status: function (blacklist, code, session_id) {
// code:1=屏蔽成功,2=解除屏蔽成功,3=通过blacklist判断屏蔽状态
if (code === 3) {
if (blacklist) {
$('.shielding').html('取消屏蔽');
} else {
$('.shielding').html('屏蔽此人');
}
return;
}
if (code === 1 && parseInt(session_id) === parseInt(FastChat.session_id)) {
$('.shielding').html('取消屏蔽');
} else if (code === 2 && parseInt(session_id) === parseInt(FastChat.session_id)) {
$('.shielding').html('屏蔽此人');
}
},
domsg: function (msg) {
if (msg.msgtype === 'config') {
// 加载会话列表
var load_message = {
c: 'Message',
a: 'session_list'
};
FastChat.ws_send(load_message);
if (!FastChat.window_is_show && msg.data.new_msg) {
// 窗口关闭状态
FastChat.show_popover(msg.data.new_msg);
// 抖动按钮和播放提示音
FastChat.new_message_prompt('#chat_button');
}
// console.log('接受到config',msg);
} else if (msg.msgtype === 'offline') {
FastChat.edit_online_status(msg.user_id, 0);
} else if (msg.msgtype === 'online') {
FastChat.edit_online_status(msg.user_id, 1);
} else if (msg.msgtype === 'test') {
console.log(msg)
} else if (msg.msgtype === 'shielding_session') {
FastChat.edit_shielding_status(false, msg.code, msg.session_id);
} else if (msg.msgtype === 'welcome_tourists') {
if (msg.code == 1) {
FastChat.setCookie('fastchat_tourists', msg.data, 10);
}
} else if (msg.msgtype === 'search_user') {
if (msg.data.length) {
FastChat.search_primary = -1;
$('#search_users').html('');
$.each(msg.data, function (index, item) {
$('#search_users').show(200);
$('#search_users').append(
'' +
'
' +
'' + item.nickname + '' +
'聊天' +
''
);
})
} else {
$('#search_users').html('');
$('#search_users').show(200);
$('#search_users').append(
'' +
'找不到该用户!' +
''
);
}
} else if (msg.msgtype === 'add_session') {
if (msg.code === 1) {
FastChat.buildSession(msg.data);
FastChat.changeSession($('.person').eq(0));
FastChat.edit_shielding_status(msg.data.blacklist, 3);
}
} else if (msg.msgtype === 'message_list') {
$('#session_list').html('');
for (let i in msg.data) {
FastChat.buildSession(msg.data[i]);
}
if (FastChat.window_is_show) {
FastChat.changeSession($('.person').eq(0));
}
} else if (msg.msgtype === 'chat_record') {
// 聊天记录
if (msg.code === 0) {
return;
}
if (parseInt(msg.data.page) === 1) {
$('.chat_scroll').html('');
}
var chat_record = msg.data.chat_record
$('#session_user_name').html(msg.data.session_info.nickname ? msg.data.session_info.nickname : '游客');
FastChat.chat_record_page = msg.data.next_page;
for (let i in chat_record) {
if (msg.data.page === 1) {
FastChat.buildSessionTime(chat_record[i].datetime, msg.data.page);
}
for (let y in chat_record[i].data) {
FastChat.buildRecord(chat_record[i].data[y], msg.data.page)
}
if (msg.data.page !== 1) {
FastChat.buildSessionTime(chat_record[i].datetime, msg.data.page);
}
}
FastChat.edit_shielding_status(msg.data.session_info.blacklist, 3);
setTimeout(() => {
$('.chat_scroll').scrollTop($('.chat_scroll')[0].scrollHeight);
}, 500)
} else if (msg.msgtype === 'clear') {
FastChat.ws.MaxRetryCount = 0;
FastChat.ws.ReConnection = false;
// 删除
var delTimer = setInterval(function () {
if ($('#chat_button').length != 0) {
console.warn('禁止匿名聊天,清退链接!');
$('#chat_button').popover('hide');
$('#chat_button').remove();
$('#FastChat').modal('hide');
clearInterval(delTimer);
}
}, 100);
var load_message = {
c: 'Message',
a: 'clear'
};
FastChat.ws_send(load_message);
} else if (msg.msgtype === 'new_message') {
var message_content = msg.data.nickname + '发来新的消息!';
let mp3 = new Audio("https://pbbaby.xunsoftware.com/uploads/audio/order.mp3");
mp3.loop = false;
mp3.play();
if (FastChat.window_is_show) {
// 窗口打开状态
FastChat.new_message_prompt('#FastChat');
} else {
// 窗口关闭状态
FastChat.show_popover(message_content);
// 抖动按钮和播放提示音
FastChat.new_message_prompt('#chat_button');
}
// 检查是否有该会话
let session = $('#session_list').children("[data-session='" + msg.data.id + "']");
if (session.length === 0) {
FastChat.buildSession(msg.data);
} else {
// 修改该会话的最后消息
session.children(".session_info_item").children(".time").eq(0).html(msg.data.last_time);
session.children(".session_info_item").children(".preview").eq(0).html(msg.data.last_message);
// 将会话移动到第一位
let first_session = $('#session_list li').eq(0);
first_session.before(session);
if ($('#chat_scroll').children('.conversation-start').children('span').eq(0).html() === '还没有消息') {
$('#chat_scroll').children('.conversation-start').children('span').eq(0).html('刚刚');
}
// 必要时,直接去除红点
if (parseInt(msg.data.id) === parseInt(FastChat.session_id) && FastChat.window_is_show) {
FastChat.buildRecord(msg.data, 1);
var load_message = {
c: 'Message',
a: 'read_message',
data: {
record_id: msg.data.record_id
}
};
FastChat.ws_send(load_message);
$('.chat_scroll').scrollTop($('.chat_scroll')[0].scrollHeight);
return;
}
if (msg.data.unread_msg_count > 0) {
session.children(".session_info_item").children(".unread_msg_count").eq(0).html(msg.data.unread_msg_count).show(200);
} else {
session.children(".session_info_item").children(".unread_msg_count").eq(0).hide(200);
}
}
}
},
playSound: function () {
FastChat.audio.source = FastChat.audio.context.createBufferSource();
FastChat.audio.source.buffer = FastChat.audio.buffer;
FastChat.audio.source.loop = false;
FastChat.audio.source.connect(FastChat.audio.context.destination);
FastChat.audio.source.start(0); //立即播放
},
loadAudioFile: function (url) {
var xhr = new XMLHttpRequest(); //通过XHR下载音频文件
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function (e) { //下载完成
FastChat.audio.context.decodeAudioData(this.response,
function (buffer) { //解码成功时的回调函数
FastChat.audio.buffer = buffer;
FastChat.playSound();
},
function (e) { //解码出错时的回调函数
console.log('音频解码失败', e);
});
};
xhr.send();
},
new_message_prompt: function (event) {
// 抖动元素和播放提示音乐
$(event).addClass('fastchat-shake-horizontal');
setTimeout(function () {
$(event).removeClass('fastchat-shake-horizontal');
}, 400);
if (FastChat.audio.buffer) {
FastChat.playSound();
} else {
let url = FastChat.buildUrl(FastChat.url, 'index', 'load_message_prompt');
FastChat.loadAudioFile(url);
}
},
getCookie: function (cname) {
var name = FastChat.cookie_prefix + cname + "=";
var decodedCookie = document.cookie
var ca = decodedCookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1);
}
if (c.indexOf(name) === 0) {
return c.substring(name.length, c.length);
}
}
return '';
},
setCookie: function (cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toUTCString();
document.cookie = FastChat.cookie_prefix + cname + "=" + cvalue + ";" + expires + ";path=/";
},
ws_send: function (message) {
if (!message) {
message = {c: 'Message', a: 'ping'};
}
if (FastChat.ws.SocketTask && FastChat.ws.SocketTask.readyState == 1) {
FastChat.ws.SocketTask.send(JSON.stringify(message));
} else {
console.log('消息发送出错', message)
FastChat.ws.ErrorMsg.push(message);
}
},
eventReg: function () {
// 点击轻提示和FastChat悬浮球的事件
$(document).on('click', '.chat_button_popover,#chat_button', function () {
FastChat.show_window();
});
// 拖动悬浮球的事情
$(document).on('mousedown', '#chat_button', function (e) {
$(document).find("iframe").css("pointer-events", "none");
FastChat.fast_move = true;
FastChat.fast_x = e.pageX - parseInt($("#chat_button").css("left"));
FastChat.fast_y = e.pageY - parseInt($("#chat_button").css("top"));
$(document).on('mousemove', function (e) {
if (FastChat.fast_move) {
var x = e.pageX - FastChat.fast_x;//控件左上角到屏幕左上角的相对位置
var y = e.pageY - FastChat.fast_y;
$("#chat_button").css({"top": y, "left": x});
}
}).mouseup(function () {
$(document).find("iframe").css("pointer-events", "auto");
FastChat.fast_move = false;
});
});
// 滑动聊天记录的事件
document.addEventListener('scroll', function (event) {
if (event.target.id === 'chat_scroll') {
if (parseInt($(event.target).scrollTop()) === 0 && FastChat.chat_record_page !== 'done') {
// 加载历史聊天记录
var load_message = {
c: 'Message',
a: 'chat_record',
data: {
session_id: FastChat.session_id,
page: FastChat.chat_record_page
}
};
FastChat.ws_send(load_message);
}
}
}, true);
// 隐藏窗口时
$(document).on('hidden.bs.modal', '#FastChat', function (e) {
$('#chat_button').show(200);
FastChat.window_is_show = false;
});
// 屏蔽用户
$(document).on('click', '.shielding', function () {
var load_message = {
c: 'Message',
a: 'shielding_session',
data: {
session_id: FastChat.session_id
}
};
FastChat.ws_send(load_message);
});
// 监听子框架的点击事件-一键添加会话窗口
/*$('iframe').contents().find('.fastchat_user').bind('click',function(e){
FastChat.forecast_add_session(e);
});*/
// 添加会话窗口
$(document).on('click', '.fastchat_user', function (e) {
FastChat.forecast_add_session(e);
});
// 显示表情选择面板
$(document).on('click', '.smiley', function (e) {
$('.chat_emoji').toggle(200);
// 获取焦点
$('#message').focus();
});
// 选择表情
$(document).on('click', '.chat_emoji img', function (e) {
$('#message').append(e.target);
$('.chat_emoji').hide();
$('#message').focus();
});
// 用户选择了文件
$(document).on('change', '#chatfile', function (e) {
if (!$('#chatfile')[0].files[0]) {
return;
}
// 上传文件
var formData = new FormData();
formData.append("file", $('#chatfile')[0].files[0]);
var url = FastChat.buildUrl(FastChat.url, 'index', 'upload');
$.ajax({
url: url, /*接口域名地址*/
type: 'post',
data: formData,
contentType: false,
processData: false,
success: function (res) {
if (res.code === 1) {
var file_name = res.data.url.split('.');
var file_suffix = file_name[file_name.length - 1];
if (file_suffix === 'png' ||
file_suffix === 'jpg' ||
file_suffix === 'gif' ||
file_suffix === 'jpeg') {
var message = FastChat.buildChatImg(res.data.url, '', true);
FastChat.sendMessage(message);
} else {
var file_name = res.data.url.split('.');
var file_suffix = file_name[file_name.length - 1];
var message = FastChat.buildChatA(res.data.url, file_suffix);
FastChat.sendMessage(message);
}
} else {
layer.msg(res.msg);
}
},
error: function (e) {
layer.msg('文件上传失败,请重试!');
},
complete: function () {
$('#chatfile').val('');
}
})
});
// 用户点击聊天记录窗口,隐藏表情面板
$(document).on('click', '#chat_scroll', function () {
if ($('.chat_emoji').css('display') === 'block') {
$('.chat_emoji').hide();
}
});
// 右键菜单
$(document).on('contextmenu', '.person', function (e) {
FastChat.select_session_id = $(e.currentTarget).data('session');
var popupmenu = $('.fastchat_menu');
popupmenu.hide();
let l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;
let t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;
popupmenu.css({left: l, top: t}).show(200);
e.preventDefault();
}).click(function () {
// 菜单的隐藏
$('.fastchat_menu').hide();
});
// 点击右键菜单项
$(document).on('click', '.fastchat_menu_item', function (e) {
var action = $(e.currentTarget).data('action');
if (FastChat.select_session_id && action === 'del') {
// 删除会话
$('#session_list').children("[data-session='" + FastChat.select_session_id + "']").remove();
var load_message = {
c: 'Message',
a: 'del_session',
data: {
session_id: FastChat.select_session_id
}
};
FastChat.ws_send(load_message);
} else if (FastChat.select_session_id && action === 'shielding') {
// FastChat.shielding_session(window.FastChat.select_session_id);
}
});
// 切换会话人
$(document).on('click', '#session_list li', function (e) {
if ($('.chat-container .right').css('display') === 'none') {
$('.chat-container .right').show();
$('.chat-container .left').hide();
}
FastChat.changeSession($(e.currentTarget));
});
// 手机版聊天窗口兼容
$(document).on('hide.bs.modal', '#FastChat', function (e) {
if ($('.chat-container .left').css('display') === 'none') {
$('.chat-container .left').show(200);
$('.chat-container .right').hide();
return false;
}
});
// 预览图片
$(document).on('click', '.chat_scroll .bubble img', function (e) {
var img_obj = $(e.target)[0];
FastChat.allowed_close_window = false;// 按下ecs不允许关闭会话窗口
layer.photos({
photos: {
"title":"聊天图片预览",
"id":"record",
data:[
{
"src":img_obj.src
}
]
},
end:function () {
// 图片预览已关闭
FastChat.allowed_close_window = true;
},anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数)
});
})
// 搜索框失去焦点
$(document).on('blur', '#search_input', function () {
// $('#search_input').val('');
setTimeout(function () {
// 等待点击事件冒泡-防止搜索结果中的蓝色聊天文字不能被点击
$('#search_users').hide(200);
FastChat.search_select_id = 0;
}, 250);
})
// 禁止回车键换行
$(document).on('keypress', '#message', function (event) {
if (parseInt(FastChat.config.send_message_key) === 1 && parseInt(event.keyCode) === 13 && !event.ctrlKey) {
event.preventDefault()
}
});
// 按键监听 FastChat.config.ecs_exit == 1
$(document).on('keyup', function (event) {
// 对ecs键的监听
if (parseInt(event.keyCode) === 27 && FastChat.window_is_show) {
if (parseInt(FastChat.config.ecs_exit) === 1 && FastChat.allowed_close_window) {
$('#FastChat').modal('hide');
} else {
layer.closeAll();
}
}
});
// 按键发送消息监听
$(document).on('keydown', '#message', function (event) {
var message = $(event.currentTarget).html();
if (parseInt(FastChat.config.send_message_key) === 1 && parseInt(event.keyCode) === 13 && !event.ctrlKey) {
if (message) {
FastChat.sendMessage(message);
}
} else if (parseInt(FastChat.config.send_message_key) === 1 && parseInt(event.keyCode) === 13 && event.ctrlKey) {
// Enter发送消息时,用户按下了ctrl+Enter
if (FastChat.browserType() === "IE" || FastChat.browserType() === "Edge") {
$(event.currentTarget).html(message + "");
} else if (FastChat.browserType() === "FF") {
$(event.currentTarget).html(message + "
");
} else {
$(event.currentTarget).html(message + "
");
}
// 获得焦点
var o = document.getElementById("message").lastChild;
var sel = window.getSelection();
var range = document.createRange();
range.selectNodeContents(event.currentTarget);
range.collapse(false);
range.setEndAfter(o);
range.setStartAfter(o);
sel.removeAllRanges();
sel.addRange(range);
} else if (parseInt(FastChat.config.send_message_key) === 0 && parseInt(event.keyCode) === 13 && event.ctrlKey) {
if (message) {
FastChat.sendMessage(message);
}
}
});
$(document).on('keyup', '#search_input', function (event) {
if (parseInt(event.keyCode) === 13) {
var user = $('#search_input').val();
if (user.length <= 0) {
// 无搜索词,且预选框已显示,隐藏预选框
if ($('#search_users').css('display') !== 'none') {
$('#search_users').hide(200);
FastChat.search_select_id = 0;
} else {
layer.msg('请输入要查找的用户!');
}
return;
} else {
// 有预选人,添加会话
if ($('#search_users').css('display') !== 'none' && FastChat.search_select_id) {
FastChat.postAddSession();
$('#search_users').hide(200);
FastChat.search_select_id = 0;
return;
}
}
var load_message = {
c: 'Message',
a: 'search_user',
data: user
};
FastChat.ws_send(load_message);
} else if (parseInt(event.keyCode) === 38) {
FastChat.search_primary--;
FastChat.setSelectedItem();
} else if (parseInt(event.keyCode) === 40) {
FastChat.search_primary++;
FastChat.setSelectedItem();
}
event.preventDefault()
})
},
browserType: function () {
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
var isOpera = false;
if (userAgent.indexOf('Edge') > -1) {
return "Edge";
}
if (userAgent.indexOf('.NET') > -1) {
return "IE";
}
if (userAgent.indexOf("Opera") > -1 || userAgent.indexOf("OPR") > -1) {
isOpera = true;
return "Opera"
}
; //判断是否Opera浏览器
if (userAgent.indexOf("Firefox") > -1) {
return "FF";
} //判断是否Firefox浏览器
if (userAgent.indexOf("Chrome") > -1) {
return "Chrome";
}
if (userAgent.indexOf("Safari") > -1) {
return "Safari";
} //判断是否Safari浏览器
if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
return "IE";
}
; //判断是否IE浏览器
}
}