自定义客服窗口从底部弹出

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
</head>
<body> <a href="javascript:OpenChat();">咨询客服</a>
<!-- 自定义一个容器,嵌入iframe放客服窗口 -->
<div id="frameChat" style="display:none; position:fixed; z-index:2000; bottom:0px; left:0px; right:0px; height:580px;background:#fff;">
<iframe id="chatFrame" src="kefu.html" style="height:100%;width:100%" frameborder="0"></iframe>
</div> <script>
let openchat = false;
function OpenChat(){
openchat = true;
document.getElementById('frameChat').style.display = '';
setTimeout(function(){
document.getElementById('chatFrame').contentWindow.document.getElementById('kefu').click();
},100);
}
function hideChat(){
openchat = false;
document.getElementById('frameChat').style.display = 'none';
}
//接收iframe发回的消息
window.addEventListener('message', function (e) {
let data = e.data;
if(data.c == 'hide'){
hideChat();
}
if(data.c == 'msg' && !openchat){
let t = data.t.message.value;
console.log(t);
}
}, false);
</script>
</body>
</html>

kefu.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
</head>
<body>
<a href='javascript:;' onclick='easemobim.bind({configId: "426fae41-c211-4a9c-b74e-088a1edf39e3"})' id="kefu" style="position:absolute; left:-1000px;">#</a>
<script>
window.easemobim = window.easemobim || {};
easemobim.config = {
hide: true,
autoConnect: true,
hideKeyboard: true,
visitor: {
trueName: '',
qq: '',
phone: '',
companyName: '',
userNickname: '',
description: '来源'+document.referrer,
email: ''
},
onmessage: function ( message ) {
window.parent.postMessage({c:'msg', t:message}, '*');
}
};
</script>
<script src='//kefu.easemob.com/webim/easemob.js'></script> <script>
const body = document.body;
// 监听body的class属性变化 判断是否客服隐藏窗口
const observer = new MutationObserver(mutationsList => {
if(body.getAttribute('class') != null && body.getAttribute('class').replace(/\s+/g,"") == ''){
window.parent.postMessage({c:'hide'}, '*');
}
}); observer.observe(body, {
attributes: true,
childList: true,
subtree: true,
});
</script>
</body>
</html>

h5集成环信在线客服自定义窗口的更多相关文章

  1. h5在线1v1客服|web在线客服系统|h5即时聊天

    网上有很多环信.美恰之类的客服系统,最近也使用h5+css3+fontJs+swiper+wcPop等技术架构开发了一个在线客服(1v1沟通聊天),可以应用到在线临时聊天.在线咨询等情景.实现了消息. ...

  2. pc、移动端H5网站 QQ在线客服、群链接代码【我和qq客服的那些事儿】

    转载:http://blog.csdn.net/fungleo/article/details/51835368#comments 移动端H5 QQ在线客服链接代码 <a href=" ...

  3. 使用 WPF+ ASP.NET MVC 开发 在线客服系统 (一)

    近段时间利用业余时间开发了一套在线客服系统,期间遇到过大大小小不少问题,好在都一一解决,最终效果也还可以,打算写一个系列的文章把开发过程详细的记录下来. 希望能够和更多的开发人员互相交流学习,也希望有 ...

  4. QQ,MSN,Skype在线客服代码

    QQ,MSN,Skype在线客服代码 在网站建设时,为了更好的实施网站的营销型,会用到QQ,MSN等在线交流,以便客户能够快捷方便的联系我们.在这里,提供QQ,MSN的在线客服代码给大家分享: 1.Q ...

  5. iOS:集成环信EaseMobSDK单聊功能

    当然在集成环信之前需要一些准备操作: 1.首先注册环信开发者账号,直接进入环信官网注册即可:http://www.easemob.com 2.按照文档一步一步将需要的文件全部拖入工程中:http:// ...

  6. 简单方便的在线客服展示插件 jQuery.onServ

    onServ jQuery.onServ 是一款简单方便的在线客服jQuery 插件,可以使任意html实现弹出展示在线客服效果, 可以自定义内容,简单配置出多个弹出动作特效,设置位置和样式. git ...

  7. 微信小程序添加悬浮在线客服会话按钮

    微信为小程序提供客服消息能力,小程序用户可以方便快捷地与小程序服务提供方进行沟通,并且已经做成了组件的形式,直接就可以调用.客服会话按钮,用于在页面上显示一个客服会话按钮,用户点击该按钮后会进入客服会 ...

  8. pc端_移动端_H5_ QQ在线客服链接代码

    PC端:QQ在线客服链接代码 <a href="tencent://message/?uin=1239300678&Site=sc.chinaz.com&Menu=ye ...

  9. .net core 和 WPF 开发升讯威在线客服与营销系统:背景和产品介绍

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf-m.shengxunwei.com ...

随机推荐

  1. 找不到xml、找不到类

    解决java.lang.ClassNotFoundException  解决 java.io.FileNotFoundException: class path resource [xxx.xml] ...

  2. Swift 访问权限

    internal 内部的 1.默认情况下所有的类&属性&方法的访问权限都是internal 2.在本模块(项目/包/target)中可以访问 private 私有的 1.只有在本类中访 ...

  3. Swift 类的使用class

    /* 类属性的介绍 Swift中类的属性有多种 1.存储属性:存储示例的常量和变量 2.计算属性:通过某种方式计算出来的属性 3.类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作 ...

  4. Linux每日练习-crontab

  5. HDU - 4430 Yukari's Birthday(二分+枚举)

    题意:已知有n个蜡烛,过生日在蛋糕上摆蜡烛,将蜡烛围成同心圆,每圈个数为ki,蛋糕中心最多可摆一个蜡烛,求圈数r和看,条件为r*k尽可能小的情况下,r尽可能小. 分析:n最大为1012,k最少为2,假 ...

  6. 【Vue中的坑】Vue打包上传线上报Uncaught SyntaxError: Unexpected token <

    今天在vue打包上传线上后,报一下错误,一下就懵了,这可咋整啊,一如既往的想都没想就开始复制错误,上网开搜 Uncaught SyntaxError: Unexpected token < Un ...

  7. openstack trove实例状态转换条件--Mitaka版本

    今天研究了一下trove的instance状态转换条件.发现其实设计的挺复杂的.后来思考了一下这样设计的原因.我觉得大致是因为,如果instance的状态全部来自于instance上跑的数据库服务本身 ...

  8. Webpack - 把json文件打包进js文件

    把html文件打包进index.js   1  新建文件 typings.d.ts    declare module "*.html" {   const content: st ...

  9. 使用jdbc连接oracle

    1.创建一个jdbc.properties 文件 driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@127.0.0.1:1521 ...

  10. Django中使用ORM

    一.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数 ...