通过JS判断联网类型和连接状态的实现代码


Posted in Javascript onApril 01, 2015

中国的移动网络环境复杂,为了给用户带去更好访问体验,开发者希望能了解用户当前的联网方式,然后给用户一个符合当前网络环境的请求结果。

W3C的规范中给出了一个方法来获得现在的网络状态navigator.connection;根据Working Draft 29 November 2012协议规范我们可以从接口中获得bandwidth(带宽,M/s)和metered两个参数的值;还提供了一个监听方法,来时刻监听接入环境的变化情况。现实中我们发现很多浏览器并没有返回bandwidth值,而且遵守了Working Draft 07 June 2011的协议返回给我们type(类型,wifi/2g/3g/4g)。

我们接下来就看看各家的支持情况

Android 2.3+ Browser UC Dolphin QQ浏览器 Baidu Firefox Chrome Opera Mini Maxthon
Yes No* Yes Yes* Yes Yes(New) No No Yes

说明下在iPhone中任何浏览器都无法得到相关信息。

通过上面的说明,我们发现还是可以通过这个参数了解很大一部分用户的联网情况的,并且为他们提供更加优质的体验。
接下来我们重点说说各浏览器的返回情况。

大部分浏览器会返回一个int型的类型,其中的特例是QQ浏览器,返回的就是类型名称,对应关系如下

返回值 QQ返回值 类型
0 unknown UNKNOWN
1 ethernet ETHERNET
2 wifi WIFI
3 2g CELL_2G
4 3g CELL_3G
5 4g CELL_4G(中国现在也会出现这个值,是hspa+)
? none NONE

接下去是一个更大的特例,这就是firefox,他使用了新版规范,所以返回的是bandwidth;不过很奇怪的是只要是wifi或3G他就返回20,如果是2G返回的就是0.1953125;每次都一样不管现在网络状态到底是多少。这个问题还会继续跟进。

给大家提供一个demo地址:http://demo.3water.com/js/2015/net.html
Demo中对不支持connection的浏览器直接返回了{type:0},这样就很便利解决了某些浏览器不支持的问题;对于不支持又能上网的浏览器处理为“unknown”当然也是合乎情理的。

很多工程师觉得这个功能支持还不好,还是先不使用的好;但是我觉得只要错误能被处理,风险能被把控,为什么不给那些先天优秀的客户提供更友好的体验呢。

今天同学说到让后端判断速度,这个可能有点难;不过确实可以通过每次的异步请求去得到用户大概的速度(加载的时间和文件大小其实前端都能得到),然后在选择性的提供某些服务,之后也准备向这个方向上多思考下。

Javascript 相关文章推荐
选择复选框按钮置灰否则按钮可用
May 22 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
详解Vue中过度动画效果应用
May 25 Javascript
BootStrap Fileinput上传插件使用实例代码
Jul 28 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
微信小程序form表单组件示例代码
Jul 15 Javascript
小程序实现单选多选功能
Nov 04 Javascript
基于JS实现父组件的请求服务过程解析
Oct 14 Javascript
使用typescript快速开发一个cli的实现示例
Dec 09 Javascript
javascript函数式编程基础
Sep 15 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 #Javascript
javascript闭包的理解
Apr 01 #Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 #Javascript
JavaScript之Object类型介绍
Apr 01 #Javascript
JS修改iframe页面背景颜色的方法
Apr 01 #Javascript
JS返回iframe中frameBorder属性值的方法
Apr 01 #Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Apr 01 #Javascript
You might like
PHP编程函数安全篇
2013/01/08 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
认识深刻的检讨书
2014/02/16 职场文书
财务担保书范文
2014/04/02 职场文书
经理任命书模板
2014/06/06 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
Python绘画好看的星空图
2022/03/17 Python