js判断用户当前网络状态和判断网速

news/2024/7/19 12:51:56 标签: javascript, 网络, 开发语言, 前端, js

前端判断用户当前网络状态和判断网速

  • 一、第一种是通过 HTML5 提供的 navigator 去检测网络
        • (1)、原理介绍:
        • (2)、兼容性
  • 二、监听window.ononline和window.onoffline事件:
  • 三、通过ajax进行请求判断(兼容性好-推荐)
        • (1)、原理介绍:
        • (2)、注意:
  • 四、navigator.connection方法监听网络变化
        • (1)、原理介绍:
        • (2)、兼容性:


前端必备工具推荐网站(免费图床、API和ChatAI等实用工具):
http://luckycola.com.cn/


一、第一种是通过 HTML5 提供的 navigator 去检测网络

(1)、原理介绍:

通过window.navigator.onLine属性,返回的是布尔值。true表示在线,false表示离线。onLine属性只能简单判断网络的断开和连接状态,而不能监听网络状态的变化,例如从4g到3g。

js">     if (window.navigator.onLine) {
       console.log('网络正常!');
     } else {
          console.log('网络中断!');
     }

(2)、兼容性

在这里插入图片描述

二、监听window.ononline和window.onoffline事件:

js"><script type="text/javascript">
    window.addEventListener("offline",function(){alert("网络连接恢复");})
    window.addEventListener("online",function(){alert("网络连接中断");})
</script>`

或者这样写

<script type="text/javascript">
    window.ononline=function(){alert("网络连接恢复");}
    window.onoffline=function(){alert("网络连接中断");}
</script>

三、通过ajax进行请求判断(兼容性好-推荐)

(1)、原理介绍:

这种方式的原理是通过ajax请求一张较小的资源和资源返回消耗的时长计算出当前网络的速度,所以兼容性较好,也可以得到具体的网速值,是一种比较好的解决方案

(2)、注意:

但是这种方案有一个注意点就是用来测速的图片资源必须小(十几K足够了),因为太大会导致测速耗时过长导致业务阻塞

js">/ 判断网速 kb
export function measureBW(): Promise<number> {
    return new Promise((resolve, reject) => {
        let startTime = 0;
        let endTime = 0;
        let fileSize = 0;
        let xhr = new XMLHttpRequest();
        let measureTimerStatus = false;
        let measureTimer = setTimeout(() => {
            if (!measureTimerStatus) {
                resolve(50);
            };
        }, 5000);
        xhr.onreadystatechange = () =>{
            if(xhr.readyState === 2){
                startTime = Date.now();
            }
            if (xhr.readyState === 4 && xhr.status === 200) {
                endTime = Date.now();
                fileSize = xhr.responseText.length;
                // console.log(fileSize);
                let speed = fileSize  / ((endTime - startTime) / 1000) / 1024;
                // console.log('measureBW res:', speed);
                measureTimerStatus = true;
                measureTimer && clearTimeout(measureTimer);
                resolve(Math.floor(speed));
            }
        }
        xhr.open("GET", "https://www.google.com.hk/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png?id=" + Math.random(), true);
        xhr.send();
        xhr.onerror = () => {
            measureTimer && clearTimeout(measureTimer);
            measureTimerStatus = true;
            resolve(50)
        }
    });
}

四、navigator.connection方法监听网络变化

(1)、原理介绍:

能监听到具体的网络变化(例如从4g变化到了3g),但不能监听到是离线状态还是在线状态。

在这里插入图片描述

js">const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;

connection.addEventListener('change', () => {
    // connection.effectiveType返回的是具体的网络状态:4g/3g/2g
    console.log(connection.effectiveType);
});

(2)、兼容性:

connection的兼容性比较低,谨慎选择使用
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/4956087.html

相关文章

Vue--进度条

挺有意思的&#xff0c;大家可以玩一玩儿&#xff1a; 前端代码如下&#xff1a;可以直接运行的代码。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

Nginx 异步非阻塞事件处理机制

Nginx 是一个广泛使用的 Web 服务器和反向代理服务器&#xff0c;它采用异步非阻塞事件处理机制来实现高性能和高并发能力。以下是关于 Nginx 异步非阻塞事件处理机制的简要描述&#xff1a; 目的&#xff1a;Nginx 的设计目标之一是提供高性能、高并发的网络服务。为了实现这样…

认识Junit

1. 前言 2. Junit注解 2.1. 常用的注解 2.1.1. Test 表示当前方法是一个测试方法(不需要main来执行) Test void Test01() throws InterruptedException {System.out.println("测试用例1");WebDriver webDriver new ChromeDriver();webDriver.get("https:/…

firewall-cmd放行端口时报错

使用sudo firewall-cmd --permanent --add-port61208/tcp放行61208端口的tcp流量时&#xff0c;系统报错&#xff1a; Error: DBUS_ERROR: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory错误原因&#xff1a; dbus服务未启动&#xff…

leetcode 322. 零钱兑换

本题属于完全背包问题&#xff0c;但要求最少的硬币个数。于是设定dp数组的含义dp[i]:总金额为i时&#xff0c;能凑成i的最少硬币个数。 需要注意初始化dp数组时&#xff0c;除0以外的其他地方需要初始化为INT_MAX以保证在递推过程中能被正确的覆盖。 代码如下&#xff1a; …

为啥网线都会限制传输距离为100米?

下午好&#xff0c;我的网工朋友。 大部分网工都经历过网络布线这件事儿吧。 无论是五类双绞线&#xff0c;还是六类双绞线&#xff0c;传输距离都是100米。 而且&#xff0c;在综合布线规范中&#xff0c;水平布线不能超过90米&#xff0c;链路总长度不能超过100米。 换句话…

Python| 理解yield关键字及示例分享

在本文中&#xff0c;我们将介绍Python中的yield关键字。在开始之前&#xff0c;让我们了解一下yield关键字的定义。 Python中yield关键字的语法&#xff1a; def gen_func(x):for i in range(x):yield iyield关键字有什么作用&#xff1f; yield关键字用于创建生成器函数。一…

一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)

本地搭建ChatGPT&#xff08;非api调用&#xff09; 第一种方法&#xff1a;使用Docker本地化部署第一步&#xff0c;下载安装Docker登录GPT 第二种方法&#xff1a;不部署项目&#xff0c;直接连接 第一种方法&#xff1a;使用Docker本地化部署 这种方法的好处就是没有登录限…