通过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 相关文章推荐
JS查看对象功能代码
Apr 25 Javascript
监控 url fragment变化的js代码
Apr 19 Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
js获取当前地址 JS获取当前URL的示例代码
Feb 26 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
JS设计模式之单例模式(一)
Sep 29 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
mpvue中使用flyjs全局拦截的实现代码
Sep 13 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
php的sso单点登录实现方法
2015/01/08 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
python开根号实例讲解
2020/08/30 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
机电一体化大学生求职信
2013/11/08 职场文书
生产内勤岗位职责
2013/12/07 职场文书
消防安全汇报材料
2014/02/08 职场文书
群教个人对照检查材料
2014/08/20 职场文书
新郎新娘答谢词
2015/01/04 职场文书
学籍证明模板
2015/06/18 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python