通过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 相关文章推荐
如何用jquery控制表格奇偶行及活动行颜色
Apr 20 Javascript
js中document.write的那点事
Dec 12 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 Javascript
JS基于面向对象实现的拖拽库实例
Sep 24 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
Mar 03 Javascript
在vue中使用jointjs的方法
Mar 24 Javascript
Angular开发实践之服务端渲染
Mar 29 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
vue实现五子棋游戏
May 28 Javascript
js实现ajax的用户简单登入功能
Jun 18 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
PHP微信红包API接口
2015/12/05 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
py中的目录与文件判别代码
2008/07/16 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
python对html代码进行escape编码的方法
2015/05/04 Python
Python二维码生成识别实例详解
2019/07/16 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
pytorch 模型可视化的例子
2019/08/17 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
自荐书格式
2013/12/01 职场文书
初中政治教学反思
2014/01/17 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
优秀班组长事迹
2014/05/31 职场文书
财产保全担保书
2015/01/20 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏