网络监控状态

在有些时候我们需要监控网络的状态,比如要显示高清的图片,但是网络状态不好的话,能不能看的见图片都是一说,所以这个时候不如给用户一个稍微模糊的图片,再或者用户突然断网了但是用户不知道,此时我们就可以给出一点提示,再或者说在网络状态良好的时候提前预加载一些资源。这些都涉及一个问题,就是我们怎么才能知道用户的网络状态。

此时有一个API叫做navigator,里面有一个属性叫做connection,它是一个对象。它里面有啥呢我们来打印看一下。

js 复制代码
<template>
    <div class="screen-view"></div>
</template>
<script>
export default {
    name: '',
    data() {
        return {}
    },
    created() {
        console.log(window.navigator.connection);
    }
}
</script>
<style lang='scss' scoped>
.screen-view {
    height: 100%;
    padding: 10px;
    box-sizing: border-box;
}
</style>

其中这个effectiveType是识别出来的网络类型,不一定是真实的网络类型,比如我现在用的wifi,它识别出来的是4g,因为它的取值只有2g 3g 4g,它代表的不是真实的网络类型,而是通过你的延迟和网速综合判断出来的跟哪种网络状态比较接近。

而这个downlink就是下载速度也就是带宽,单位是兆/秒。rtt就是数据包从出去到回来的时间,相当于是ping,但是为毫秒。

怎么知道是离线还是在线呢,这就要通过navigator的另外一个属性onLine。它的值是布尔值,如果为true就是网络在线,相反,如果为false就是网络离线。

通过这两个属性我们就可以知道用户的网络状态了,那接下来还有一个问题,我们怎么知道信息有变呢?

这就涉及到三个事件,一个是window的事件online,当用户在线过后它会触发这个事件,就是从离线变成在线就会触发。另外一个事件也是window的事件offline,当用户离线过后它就会触发这个事件,就是从在线变成离线。 那如果我不离线只是改变网络状态呢,该怎么触发事件呢?这就用到最后一个事件了,后一个事件是navigator.connection的事件change,表示网络状态发生变化的时候就会触发这个事件,也就是effectiveType发生改变以后就会触发的事件。

html 复制代码
<template>
    <div class="screen-view">
        <div class="info">
            <p>网络状态:{{ effectiveType }}</p>
            <p>延迟:{{ rtt }}</p>
            <p>带宽:{{ downlink }}</p>
        </div>
    </div>
</template>
<script>
export default {
    name: '',
    data() {
        return {
            effectiveType: '',
            rtt: '',
            downlink: ''
        }
    },
    mounted() {
        window.addEventListener('online', this.updateNetworkInfo);
        window.addEventListener('offline', this.updateNetworkInfo);
        window.navigator.connection.addEventListener('change', this.updateNetworkInfo);
    },
    methods: {
        updateNetworkInfo() {
            // 获取网络信息
            const connection = window.navigator.connection || {};
            // 获取网络状态
            const flag = window.navigator.onLine;
            // 如果离线 直接返回
            if (!flag) {
                this.effectiveType = 'offline';
                this.rtt = 'unknown';
                this.downlink = 'unknown';
                return;
            }
            // 如果在线 获取网络信息
            this.effectiveType = connection.effectiveType || 'unknown';
            this.rtt = connection.rtt || 'unknown';
            this.downlink = connection.downlink + 'mb/s' || 'unknown';
        }
    },
}
</script>
<style lang='scss' scoped>
.screen-view {
    height: 100%;
    padding: 10px;
    box-sizing: border-box;

    .info {
        margin: auto;
        width: 400px;
        height: 400px;
    }
}
</style>
相关推荐
IT_陈寒16 分钟前
JavaScript实战技巧总结:深挖数组遍历的性能陷阱与实战解法
前端·人工智能·后端
步行cgn23 分钟前
为什么既要 web.xml 又要 springmvc.xml?能不能只配一个?
xml·前端·hive
风骏时光牛马30 分钟前
大模型综合能力评测:多维度性能与对齐效果对比
前端
winfredzhang36 分钟前
从零手写一个毛玻璃风格的页面搭建台:单文件 HTML 实现组件放置、面板磁吸与图层管理
前端·html
葡萄城技术团队9 小时前
1000 人协同压测的环境瓶颈排查:CPU 争用与 Wi\-Fi
前端
excel10 小时前
Marked 与 Markdown 有什么区别?该怎么选?
前端
Da Da 泓11 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
zxcvb15312 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin12 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
北岛贰12 小时前
啵啵音乐迎来全新升级!
前端