const KEFU={ KEFU_URL:"", KEFU_KEFU_ID:"", KEFU_ENT:"", KEFU_LANG:"en", KEFU_EXTRA: {}, KEFU_AUTO_OPEN:true,//是否自动打开 KEFU_SHOW_TYPES:1,//展示样式,1:普通右下角,2:圆形icon KEFU_AUTO_SHOW:false, KEFU_WITHOUT_BOX:false, VISITOR_ID:"", VISITOR_NAME:"", VISITOR_AVATOR:"", }; KEFU.launchButtonFlag=false; KEFU.titleTimer=0; KEFU.titleNum=0; KEFU.noticeTimer=null; KEFU.originTitle=document.title; KEFU.chatPageTitle="KEFU"; KEFU.kefuName=""; KEFU.kefuAvator=""; KEFU.kefuIntroduce=""; KEFU.kefuDialogDelay="3000"; KEFU.offLine=false; KEFU.TEXT={ "cn":{ "online_notice":"在线咨询", "offline_notice":"离线留言", }, "zh-CN":{ "online_notice":"在线咨询", "offline_notice":"离线留言", }, "en":{ "online_notice":"chat with us", "offline_notice":"we are offline", }, "ru":{ "online_notice":"Свяжитесь с нами", "offline_notice":"Мы оффлайн", }, "kr":{ "online_notice":"온라인 컨설팅", "offline_notice":"오프라인", }, }; // 设置重连时间间隔(单位:毫秒) KEFU.RECONNECT_INTERVAL = 1000; // 设置最大重连次数 KEFU.MAX_RECONNECT_TIMES = 3; KEFU.reconnectTimes = 0; KEFU.ws=null; KEFU.init=function(config){ var _this=this; if (!config) { config = {}; } for (var key in KEFU) { if (typeof config[key] !== 'undefined') { this[key] = config[key]; } else { this[key] = KEFU[key]; } } if (typeof config.KEFU_URL!="undefined"){ this.KEFU_URL=config.KEFU_URL.replace(/([\w\W]+)\/$/,"$1"); } this.dynamicLoadCss(this.KEFU_URL+"/static/css/kefu-front.css?v="+Date.now()); this.dynamicLoadCss(this.KEFU_URL+"/static/css/layui/css/layui.css?v="+Date.now()); var refer=document.referrer?document.referrer:"none"; this.KEFU_EXTRA.refer=refer; this.KEFU_EXTRA.host=document.location.href; this.KEFU_EXTRA=JSON.stringify(_this.KEFU_EXTRA); this.dynamicLoadJs(this.KEFU_URL+"/static/js/functions.js?v=1",function(){ if (typeof config.KEFU_LANG!="undefined"){ _this.KEFU_LANG=config.KEFU_LANG; }else{ _this.KEFU_LANG=checkLang(); } _this.KEFU_EXTRA=utf8ToB64(_this.KEFU_EXTRA); // if(window.jQuery||typeof $=="function"){ // jQuery.noConflict(); // } // if(window.jQuery||typeof $=="function"){ // _this.dynamicLoadJs(_this.KEFU_URL+"/static/js/layer/layer.js",function () { // _this.jsCallBack(); // }); // }else{ _this.dynamicLoadJs(_this.KEFU_URL+"/static/js/jquery.min.js",function () { jQuery.noConflict(); _this.dynamicLoadJs(_this.KEFU_URL+"/static/js/layer/layer.js",function () { _this.jsCallBack(); }); }); //} }); _this.addEventlisten(); } KEFU.jsCallBack=function(){ var _this=this; _this.connect();//网站监控 // if(_this.isMobile() && _this.KEFU_SHOW_TYPES!=0){ // _this.KEFU_SHOW_TYPES=2; // } _this.getNotice(function(welcomeInfo){ //展示的样式 switch(_this.KEFU_SHOW_TYPES){ case 1: _this.showPcTips(welcomeInfo); break; case 2: _this.showCircleIcon(welcomeInfo); break; case 3: _this.showLineTips(welcomeInfo); break; default: } _this.addClickEvent(); }); } //pc端的样式 KEFU.showPcTips=function(welcomeInfo){ var _this=this; if(welcomeInfo.all_offline){ _this.KEFU_AUTO_OPEN=false; var userInfo=KEFU.TEXT[_this.KEFU_LANG].offline_notice; }else{ var userInfo=KEFU.TEXT[_this.KEFU_LANG].online_notice; } //自动展开 if(_this.KEFU_AUTO_OPEN&&_this.isIE()<=0){ setTimeout(function () { _this.showKefu(); },_this.kefuDialogDelay); } var html=`
1
`+userInfo+`
` jQuery('body').append(html); if(_this.KEFU_AUTO_OPEN || _this.isMobile()){ return; } if (!welcomeInfo.welcome) return; var msgs = welcomeInfo.welcome; var len=msgs.length; var i=0; if(len<=0) { return; } var delaySecond=0; for(let i in msgs){ var msg=msgs[i]; if(msg.delay_second){ delaySecond+=msg.delay_second; }else{ delaySecond+=4; } var welcomeHtml="
×
" var timer = setTimeout(function (msg) { msg.content = replaceSpecialTag(msg.content); welcomeHtml+="
" + "
" +"
" +replaceSpecialTag(msg.content,_this.KEFU_URL)+"
"; var obj=jQuery("#launchButtonNotice"); if(obj){ if(i==0){ obj.html(welcomeHtml).fadeIn(); }else if(i
QQ:xxx
QQ:xxx
` jQuery('body').append(str); } //圆形样式 KEFU.showCircleIcon=function(welcomeInfo){ var _this=this; if(welcomeInfo.all_offline){ var imgUrl=KEFU.KEFU_URL+"/static/images/iconchat.png"; var tipText=KEFU.TEXT[this.KEFU_LANG].offline_notice var imgHtml=" "; }else{ var imgUrl=_this.kefuAvator; var tipText=KEFU.TEXT[this.KEFU_LANG].online_notice var imgHtml=" "; } if(welcomeInfo.welcome.length>0){ var tipText=replaceSpecialTag(welcomeInfo.welcome[0].content); } var html="
" + "
" + imgHtml+ '
' + "
" +tipText+ "
×
" + "
" + '
'; jQuery('body').append(html); setTimeout(function () { jQuery(".flySimpleIconTip").fadeIn(); setTimeout(function () { jQuery(".flySimpleIconTip").fadeOut(); },5000); },_this.kefuDialogDelay); window.addEventListener('message',function(e){ var msg=e.data; if(msg.type=="message"){ jQuery(".flySimpleIconTip").html(replaceSpecialTag(msg.data.content,_this.KEFU_URL)+"
×
").show(); setTimeout(function () { jQuery(".flySimpleIconTip").fadeOut(); },5000); } if(msg.type=="force_close"){ kayer.close(kayer.index); } }); //自动展开 if(_this.KEFU_AUTO_OPEN&&_this.isIE()<=0){ setTimeout(function () { _this.showKefu(); },5000); } } KEFU.addClickEvent=function(){ var _this=this; var launchButton=jQuery("#launchButton"); if(launchButton){ launchButton.on("click",function() { if(_this.launchButtonFlag){ return; } _this.KEFU_AUTO_SHOW=true; _this.showKefu(); jQuery("#launchIcon").text(0).hide(); }); } jQuery("body").on("click","#launchNoticeClose",function() { jQuery("#launchButtonNotice").fadeOut(); }); jQuery("body").on("click",".flySimpleIconTip",function() { jQuery(".flySimpleIconTip").fadeOut(); }); jQuery("body").on("click","#launchTopButton",function() { jQuery('body,html').scrollTop(0); }); jQuery("body").on("mouseover mouseout",".lineItem",function(event) { if(event.type == "mouseover"){ //鼠标悬浮 jQuery(this).find(".lineTip").show(); }else if(event.type == "mouseout"){ //鼠标离开 jQuery(".lineTip").hide(); } }); jQuery("body").click(function () { clearTimeout(_this.titleTimer); document.title = _this.originTitle; //剪贴板 try{ var selecter = window.getSelection().toString(); if (selecter != null && selecter.trim() != ""){ var str=selecter.trim().substr(0,20); _this.postMessageToIframe(str); } } catch (err){ var selecter = document.selection.createRange(); var s = selecter.text; if (s != null && s.trim() != ""){ var str=s.trim().substr(0,20); _this.postMessageToIframe(str); } } }); var ms= 1000*2; var lastClick = Date.now() - ms; jQuery("a,div,p,li,span,h1,h2,h3,h4,h5,h6").mouseover(function(){ if (Date.now() - lastClick >= ms) { lastClick = Date.now(); var msg=jQuery(this).text().trim().substr(0,20); _this.postMessageToIframe(msg); } }); jQuery("body").on("click",".flySimpleIcon",function() { _this.showPanel(); }); } KEFU.postMessageToIframe=function(str){ var msg={} msg.type='inputing_message'; msg.content=str; this.postToIframe(msg); } KEFU.postToIframe=function(messageObj){ var obj=document.getElementById('layui-layer-iframe19911116'); if(!obj||!messageObj){ return; } document.getElementById('layui-layer-iframe19911116').contentWindow.postMessage(messageObj, "*"); } KEFU.addEventlisten=function(){ var _this=this; window.addEventListener('message',function(e){ var msg=e.data; if(msg.type=="message"){ clearInterval(_this.noticeTimer); var width=jQuery(window).width(); if(width>768){ _this.flashTitle();//标题闪烁 } if (_this.launchButtonFlag || _this.isMobile()){ return; } var welcomeHtml="
×
" +"
" + "
" +"
" +replaceSpecialTag(msg.data.content,_this.KEFU_URL)+"
"; var obj=jQuery("#launchButtonNotice"); if(obj){ obj.html(welcomeHtml).fadeIn(); // setTimeout(function (obj) { // obj.fadeOut(); // },3000,obj); } var news=jQuery("#launchIcon").text(); jQuery("#launchIcon").text(++news).show(); } if(msg.type=="focus"){ clearTimeout(_this.titleTimer); _this.titleTimer=0; document.title = _this.originTitle; } if(msg.type=="force_close"){ kayer.close(kayer.index); } }); window.onfocus = function () { clearTimeout(_this.titleTimer); _this.titleTimer=0; document.title = _this.originTitle; _this.postToIframe({type:"focus"}); }; } KEFU.dynamicLoadCss=function(url){ var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.type='text/css'; link.rel = 'stylesheet'; link.href = url; head.appendChild(link); } KEFU.dynamicLoadJs=function(url, callback){ var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.defer = true; if(typeof(callback)=='function'){ script.onload = script.onreadystatechange = function () { if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete"){ callback(); script.onload = script.onreadystatechange = null; } }; } head.appendChild(script); } //获取基础信息 KEFU.getNotice=function(callback){ var _this=this; jQuery.ajax({ url: this.KEFU_URL+"/notice?ent_id="+this.KEFU_ENT, type: "GET", xhrFields: { withCredentials: false }, crossDomain: true, success: function (res) { if(!res) return; if(typeof res =="string"){ res=JSON.parse(res); } var welcomeInfo=res.result; _this.kefuIntroduce=welcomeInfo.ent_config.entIntroduce; if(welcomeInfo.ent_config.autoOpenDialogTime){ _this.kefuDialogDelay=welcomeInfo.ent_config.autoOpenDialogTime; } _this.kefuAvator=getImageUrl(welcomeInfo.avatar,_this.KEFU_URL); _this.kefuName=welcomeInfo.username; _this.chatPageTitle=welcomeInfo.username; _this.offLine=welcomeInfo.all_offline; callback(welcomeInfo); } }); // jQuery.get(this.KEFU_URL+"/notice?ent_id="+this.KEFU_ENT,function(res) { // if(!res) return; // var welcomeInfo=res.result; // _this.kefuIntroduce=welcomeInfo.ent_config.entIntroduce; // if(welcomeInfo.ent_config.autoOpenDialogTime){ // _this.kefuDialogDelay=welcomeInfo.ent_config.autoOpenDialogTime; // } // _this.kefuAvator=getImageUrl(welcomeInfo.avatar,_this.KEFU_URL); // _this.kefuName=welcomeInfo.username; // _this.chatPageTitle=welcomeInfo.username; // _this.offLine=welcomeInfo.all_offline; // // callback(welcomeInfo); // }); } KEFU.isIE=function(){ var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器 var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器 var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1; if(isIE) { var reIE = new RegExp("MSIE (\\d+\\.\\d+);"); reIE.test(userAgent); var fIEVersion = parseFloat(RegExp["$1"]); if(fIEVersion == 7) { return 7; } else if(fIEVersion == 8) { return 8; } else if(fIEVersion == 9) { return 9; } else if(fIEVersion == 10) { return 10; } else { return 6;//IE版本<=7 } } else if(isEdge) { return 'edge';//edge } else if(isIE11) { return 11; //IE11 }else{ return -1;//不是ie浏览器 } } KEFU.showPanel=function (){ var width=jQuery(window).width(); this.KEFU_AUTO_SHOW=true; if(this.isIE()>0){ this.windowOpen(); return; } if(width<768){ this.layerOpen("100%","72%","rb"); return; } var width=380; var height=560; var x=document.documentElement.clientWidth-parseInt(width)-20; var y=document.documentElement.clientHeight-parseInt(height); this.layerOpen(width+"px",height+"px",[y,x]); this.launchButtonFlag=true; } KEFU.showKefu=function (){ if (this.launchButtonFlag) return; var width=jQuery(window).width(); if(this.isIE()>0){ this.windowOpen(); return; } if(width<768){ this.layerOpen("100%","72%","rb"); return; } var width=380; var height=560; var x=document.documentElement.clientWidth-parseInt(width)-20; var y=document.documentElement.clientHeight-parseInt(height); this.layerOpen(width+"px",height+"px",[y,x]); this.launchButtonFlag=true; jQuery(".launchButtonBox").hide(); } KEFU.layerOpen=function (width,height,offset){ if (this.launchButtonFlag) return; var layBox=jQuery("#layui-layer19911116"); if(layBox.css("display")=="none"){ this.launchButtonFlag=true; layBox.show(); return; } var onlineStatus=""; if(this.offLine){ onlineStatus=""; } var title=`
`+this.kefuName+ ` ` +onlineStatus+`
`+this.kefuIntroduce+`
`; var _this=this; if(!offset){ offset="rb"; } var chatUrl=this.KEFU_URL+'/chatIndex?kefu_id='+this.KEFU_KEFU_ID+'&ent_id='+this.KEFU_ENT+'&show_title=no&lang='+this.KEFU_LANG+'&refer='+urlEncode(window.document.title)+'&url='+urlEncode(document.location.href)+'&extra='+this.KEFU_EXTRA; if(this.VISITOR_ID!=""){ chatUrl+="&visitor_id="+this.VISITOR_ID; } if(this.VISITOR_NAME!=""){ chatUrl+="&visitor_name="+this.VISITOR_NAME; } if(this.VISITOR_AVATOR!=""){ chatUrl+="&avator="+this.VISITOR_AVATOR; } kayer.index="19911115"; kayer.open({ type: 2, title: title, skin:"kfLayer", closeBtn: 1, //不显示关闭按钮 shade: 0, area: [width, height], offset: offset, //右下角弹出 anim: 2, content: [chatUrl , 'yes'], //iframe的url,no代表不显示滚动条 move:false, success:function(layero, index){ //切换语言 var iframe = layero.find('iframe'); // 获取到弹窗中的iframe元素 var btnReload = jQuery('#btn-reload img'); // 获取到按钮 var url=changeURLPar(chatUrl,"lang","en") btnReload.on("click",function(e){ iframe.attr('src', url); // 重新加载iframe的内容 }); var layBox=jQuery("#layui-layer19911116"); _this.launchButtonFlag=true; if(!_this.KEFU_WITHOUT_BOX&&_this.KEFU_AUTO_SHOW&&layBox.css("display")=="none"){ layBox.show(); } jQuery("#layui-layer-iframe19911116 .chatEntTitle").hide(); }, end: function(){ _this.launchButtonFlag=false; jQuery(".launchButtonBox").show(); }, cancel: function(index, layero){ jQuery("#layui-layer19911116").hide(); _this.launchButtonFlag=false; jQuery(".launchButtonBox").show(); return false; } }); } KEFU.windowOpen=function (){ window.open(this.KEFU_URL+'/chatIndex?kefu_id='+this.KEFU_KEFU_ID+'&lang='+this.KEFU_LANG+'&refer='+window.document.title+'&ent_id='+this.KEFU_ENT+'&extra='+this.KEFU_EXTRA); } KEFU.flashTitle=function () { flashTitle(); } // KEFU.flashTitleFunc=function(){ // this.titleNum++; // if (this.titleNum >=3) { // this.titleNum = 1; // } // if (this.titleNum == 1) { // document.title = '【】' + this.originTitle; // } // if (this.titleNum == 2) { // document.title = '【new message】' + this.originTitle; // } // } /** * 判断是否是手机访问 * @returns {boolean} */ KEFU.isMobile=function () { if( /Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { return true; } return false; } /** * 连接websocket */ KEFU.connect=function () { var _this=this; var domain=getDomainFromUrl(_this.KEFU_URL); var protocol=getProtocolFromUrl(_this.KEFU_URL); var wsProtocol="ws://"; if(protocol=="https"){ wsProtocol="wss://"; } if(!this.KEFU_KEFU_ID){ return; } let ws = new WebSocket(wsProtocol+domain+"/ws_monitor?kefu_name="+this.KEFU_KEFU_ID); ws.onopen = function () { console.log('WebSocket 连接已打开'); _this.reconnectTimes = 0; }; ws.onclose = function () { console.log('WebSocket 连接已关闭'); // 尝试重连 _this.reconnect(); }; ws.onmessage = function (event) { console.log(`收到服务器的消息:${event.data}`); let data=event.data; let message={ "type":"monitorOnline", "data":{ "url":window.location.href, "title":document.title, "refer":document.referrer } } if(data=="ok"){ ws.send(JSON.stringify(message)) } if(data=="chat"){ _this.showPanel(); } // // 解析消息 // const message = JSON.parse(event.data); // if (message.type === 'message') { // console.log(`收到消息:${message.data}`); // } }; _this.ws=ws; } // 尝试重连 KEFU.reconnect=function(){ var _this=this; if (_this.reconnectTimes >= _this.MAX_RECONNECT_TIMES) { console.log('重连失败'); return; } _this.reconnectTimes++; console.log(`正在尝试重连(第 ${_this.reconnectTimes} 次)`); setTimeout(function () { _this.connect(); }, _this.RECONNECT_INTERVAL); }