升讯威在线客服系统是如何实现对 IE8 完全完美支持的(怎样从 WebSocket 降级到 Http)【干货】

news2024/11/14 12:32:40

简介

升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放、开源、共享。努力打造 .net 社区的一款优秀开源产品。

完整私有化包下载地址

💾 https://kf.shengxunwei.com/freesite.zip

当前版本信息

发布日期: 2023-7-9
数据库版本: 20230402a
通信协议版本: 20220306
服务器版本: 1.11.10.0
客服程序版本: 1.11.2.0
更新程序版本: 1.2.0.0
资源站点版本: 1.6.2.0
Web管理后台版本: 2.0


如何实现对 IE8 完全完美支持

对于在线客服与营销系统,对浏览器的兼容性和支持至关重要。我在设计之初,就考虑了这个问题,访客端必须支持 IE8 以上的所有PC端和移动端浏览器。并且能够根据浏览器的片本,自动切换不同的能信方式,始终选择最优的方式与服务端通信。

此外,还需要考虑到对网络的波动的兼容,访客所使用的网络五花八门,使用手机时,APP随时会被切换到后台导致中断网络,或者访客本身所处的车库、电梯、郊外网络不佳,时断时续。系统必须能够合理的处理这些情况,做到:

  • 不中断会话
  • 不丢失消息。

这里存在几个技术难点需要注意:

  • IE8 和 IE9 不支持 WebSocket 通信,只能降级使用 Http Ajax 请求。
  • 短时间的网络中断,再次连接时,不可认为是新会话,必须能够接着进行未完成的会话。
  • 访客端页面的排版布局,必须完全兼容 IE8 和 IE9,做到美观一致。

本文我将详细的解释这些问题,以及如何实现对 IE8 的完全完美的兼容。

访客端在 IE8 下的效果:

客服端与使用 IE8 的访客进行交流:


首先判断用户的浏览器版本

首先我们能过 User-Agent 判断访客所使用的浏览器。
User-Agent通常格式:

Mozilla/5.0 (平台) 引擎版本 浏览器版本号

IE8 的 User-Agent:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)

IE9 的 User-Agent:

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

我们可以通过 JavaScript 从用户的浏览器中得到 User-Agent

  var ua = navigator.userAgent;

获得 User-Agent 之后,我们通过对内容的判断,就很容易知道用户使用的浏览器版本,从而为后续的工作做准备。

从 WebSocket 降级到 HTTP Ajax

当我们判断用用户的浏览器不支持 WebSocket 时,就需要对通信方式进行降级,我们使用 XMLHttpRequest 对象进行 HTTP 异步通信。

XMLHttpRequest 能够:

  • 在不重新加载页面的情况下更新网页
  • 在页面已加载后从服务器请求数据
  • 在页面已加载后从服务器接收数据
  • 在后台向服务器发送数据

通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。

var xhr = new XMLHttpRequest();

该构造函数用于初始化一个 XMLHttpRequest 实例对象。在调用下列任何其他方法之前,必须先调用该构造函数,或通过其他方式,得到一个实例对象。

XMLHttpRequest 有一个 onreadystatechange 。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。在状态为 4 时,我们执行代码进行通信。

代码示例:

var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=new XMLHttpRequest();
if (xmlhttp!=null)
  {
  xmlhttp.onreadystatechange=state_Change;
  xmlhttp.open("GET",url,true);
  xmlhttp.send(null);
  }
else
  {
  alert("Your browser does not support XMLHTTP.");
  }
}

function state_Change()
{
if (xmlhttp.readyState==4)
  {// 4 = "loaded"
  if (xmlhttp.status==200)
    {// 200 = OK
    // ...our code here...
    }
  else
    {
    alert("Problem retrieving XML data");
    }
  }
}

我们只需要在 xmlhttp.status 状态代码为 200 时,处理从服务器返回的数据即可。


结束~

希望对你有用,支持请点个赞吧~ 谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【unity之IMGUI实践】敌方逻辑封装实现【六】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

技术实力加速企业上云,联想混合云获评专有云优秀案例入选混合云全景图四大方向

7月25-26日,由中国信息通信研究院、中国通信标准化协会联合主办的第十届可信云大会在京顺利召开。大会重磅发布了云计算白皮书(2023年)、《混合云产业全景图(2023)》、中国算力服务研究报告、中国云计算发展指数报告等…

Stream流之distinct去重详细用法

前言 distinct方法在Stream流中可以进行集合中的去重操作,但是要按照集合中的数据类型具体来定义。简单数据类型和自定义数据类型操作不同。 简单数据类型 这里以List集合为例,并且集合中数据类型为Integer。简单数据类型直接调用Stream中的distinct方…

抖音短视频seo源码矩阵系统开发

一、前言: 抖音SEO源码矩阵系统开发是一项专为抖音平台设计的SEO优化系统,能够帮助用户提升抖音视频的搜索排名和曝光度。为了确保系统运行正常,需要安装FFmpeg和FFprobe工具。FFmpeg是一个用于处理多媒体数据的开源工具集,而FFpr…

【密码学】三、分组密码的工作模式

分组密码的工作模式 ECB模式CBC模式CFB模式OFB模式CTR模式 电子密码本ECB、密码分组链接模式CBC、密码反馈模式CFB和输出反馈模式OFB、计数器模式CTR ECB模式 它一次对一个64bit长的明文分组加密,而且每次的加密密钥都相同。可以认为有一个非常大的电子密码本&…

在数字化时代,数字孪生能挽回中医的地位嘛?

中医作为中国传统医学的瑰宝,拥有悠久的历史和深厚的文化底蕴。然而,随着现代医学的快速发展,中医面临着许多挑战和困境。在这个数字化时代,数字孪生作为一项前沿技术,是否能为中医行业带来新的希望和机遇呢&#xff1…

制定机器学习规划路线:从入门到专业

文章目录 🍀第一阶段:入门基础🍀了解机器学习概念🍀学习编程和数学基础🍀探索经典机器学习算法🍀完成实践项目 🍀第二阶段:深入学习🍀 掌握深度学习基础🍀学习…

无法定位程序输入点:于动态链接库KERNEL32.dll上(未解决)

错误如图: 搜索了一下,说是下载KERNEL32.dll。我在WINDOWS目录下搜索了,实际上这个文件已经存在: 原因猜测,应该是软件本身与系统版本不配套导致的。可能是.NET?C

JAVA课程期末复习学习总结

JAVA课程学习总结 知识点总结 文章目录 JAVA课程学习总结知识点总结Eclipse如何与GitHub连接1.前期准备2.远程建库3.本地操作 常用DOS命令数组正则表达式继承多态向上转型向下转型多态的应用抽象方法 抽象类与接口的异同点不同点:相同点:从设计理念层面…

【MySQL】事务与隔离级别详解

【MySQL】事务 事务的概念为什么要有事务引擎对事务的支持事务的提交方式事务的操作准备正常事务操作:启动、回滚、提交非正常事务总结 事务的隔离级别隔离性隔离级别隔离级别的查看设置隔离级别会话级别全局级别 隔离级别的具体体现读未提交 Read Uncommitted读提交…

本土机器视觉创业企业涌现,深眸科技携手AI+3D视觉勇闯小场景赛道

随着工业自动化技术向智能化方向发展,人工智能实现快速落地,机器视觉应用产品在算力、算法和技术等方面得到持续升级,助力中国机器视觉行业进入高质量发展阶段。 在制造业转型升级、新兴产业发展的过程中,中国作为全球制造中心之…

第十四章:通过迭代挖掘共同物体特征的弱监督语义分割

0.摘要 在图像标签监督下进行弱监督语义分割是一项具有挑战性的任务,因为它直接将高层语义与低层外观相关联。为了弥合这一差距,本文提出了一种迭代的自底向上和自顶向下的框架,交替扩展对象区域和优化分割网络。我们从分类网络产生的初始定位…

新版mmpose训练新版RTMDet/Pose及自定义数据集制作

自定义数据集制作:要求满足目标检测网络和关键点检测网络都可以用其来训练 1. 打开Labelme并导入我们的图像文件夹;2. 用矩形框框出目标检测网络要检测的目标,我们起名叫person;3. 用Creat Point 标记关键点,这里我们只检测人的头和裆两个点。这里教一个小技巧:每一个数据…

Mindar.JS——实现AR图像追踪插入图片或视频

Mindar.JS使用方式 注意&#xff1a;此篇文章需要启动https才可调用相机权限 图像追踪示例 需要用到两个js库 <script src"./js/aframe.min.js"></script><script src"./js/mindar-image-aframe.prod.js"></script>下面看一下标签…

一款性价比高的知识管理系统应具备的功能

编者按&#xff1a;市面上的知识管理系统有不同的类型&#xff0c;有针对文件管理的&#xff0c;也有针对内容管理的&#xff0c;各有长处&#xff0c;那么一款好用的KMS大概都具备哪些优点呢&#xff1f; 关键词&#xff1a;知识管理系统、免运维/安装、 随着企业对企业隐形知…

PyCharm解决Git冲突

什么时候会出现冲突 当我们从远程的仓库pull下来的时候&#xff0c;如果远程仓库跟本地仓库修改了同一个文件&#xff0c;在pull的过程中就会提示合并冲突&#xff1a; $ git pull remote developremote: Enumerating objects: 27, done.remote: Counting objects: 100% (27/2…

Postgres日期格式化

1、替换dual的方法 oracle: select ‘111’ phone from dual; Postgres: select ‘111’ phone ; 2、char类型格式化成日期 to_date(‘20230728’,‘yyyyMMdd’) 3、两个日期取相差的天数&#xff08;非绝对值&#xff0c;带正负号&#xff09; extract(day from now()-to_date…

git的clone,上传,mirror与upstream同步

文章目录 clone日志信息的同步子树合并同步 clone clone他人项目&#xff0c;git到自己的项目 rm -rf .git .git存放原始项目的日志信息&#xff0c;这里需要添加自己的日志信息&#xff0c;需要删除重写。也可手动删除 git init 初始化文件&#xff0c;依据本地日志信息生产.…

在CentOS 7上挂载硬盘到系统的步骤及操作

目录 1&#xff1a;查询未挂载硬盘2&#xff1a;创建挂载目录3&#xff1a;检查磁盘是否被分区4&#xff1a;格式化硬盘5&#xff1a;挂载目录6&#xff1a;检查挂载状态7&#xff1a;设置开机自动挂载总结&#xff1a; 本文介绍了在CentOS 7上挂载硬盘到系统的详细步骤。通过确…

信息安全:物理与环境安全技术.

信息安全&#xff1a;物理与环境安全技术. 传统上的物理安全也称为 实体安全 &#xff0c;是指包括 环境、设备和记录介质在内的所有支持网络信息系统运行的硬件的总体安全&#xff0c;是网络信息系统安全、可靠、不间断运行的基本保证&#xff0c;并且确保在信息进行加工处理、…