• 网页实现ping效果


    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>网络实时状态</title>
        <style>
            .signal {
                height: 30px;
                width: 50px;
                display: flex;
                align-items: flex-end;
                justify-content: space-between;
            }
    
            .signal>div {
                background-color: gainsboro;
                width: 22%;
            }
    
            .signal>div:nth-of-type(1) {
    
                height: 20%;
            }
    
            .signal>div:nth-of-type(2) {
                height: 46%;
            }
    
            .signal>div:nth-of-type(3) {
                height: 72%;
            }
    
            .signal>div:nth-of-type(4) {
                position: relative;
                height: 100%;
            }
    
            .signal .noSignal {
                position: absolute;
                bottom: 0;
                right: -10;
                padding: 0 4px;
                color: red;
                display: none;
            }
            .cmd{
                width: 800px;
                height: 300px;
                background-color: black;
                color: white;
                overflow-y: auto;
                padding-bottom:4px ;
            }
        </style>
    </head>
    
    <body>
        <div class="box">
            <div class="signal">
                <div class="item"></div>
                <div class="item"></div>
                <div class="item"></div>
                <div class="item">
                    <div class="noSignal">x</div>
                </div>
            </div>
            <div class="detail"></div>
            <div class="cmd">http实现ping工具:</div>
        </div>
        <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
        <script>
         // -----------------ping.js开始-------------------------------------
            /**
         * Creates and loads an image element by url.
         * @param  {String} url
         * @return {Promise} promise that resolves to an image element or
         *                   fails to an Error.
         */
            function request_image(url) {
                return new Promise(function (resolve, reject) {
                    var img = new Image();
                    img.onload = function () { resolve(img); };
                    img.onerror = function () { reject(url); };
                    img.src = url + '?random-no-cache=' + Math.floor((1 + Math.random()) * 0x10000).toString(16);
                });
            }
    
            /**
             * Pings a url.
             * @param  {String} url
             * @param  {Number} multiplier - optional, factor to adjust the ping by.  0.3 works well for HTTP servers.
             * @return {Promise} promise that resolves to a ping (ms, float).
             */
            function ping(url, multiplier) {
                return new Promise(function (resolve, reject) {
                    var start = (new Date()).getTime();
                    var response = function () {
                        var delta = ((new Date()).getTime() - start);
                        delta *= (multiplier || 1);
                        resolve(delta);
                    };
                    request_image(url).then(response).catch(response);
    
                    // Set a timeout for max-pings, 5s.
                    setTimeout(function () { reject(Error('Timeout')); }, 5000);
                });
            }
            // -----------------ping.js结束-------------------------------------
    
            let cmdHtml = '';
            function setSignalTip(url) {
                ping(url).then(function (delta) {
                    
                    if (navigator.onLine) {
                        const renderSgAc = (num) => {
                            const signalEl = document.querySelector('.signal');
                            signalEl.querySelectorAll('.item').forEach((item) => {
                                item.style.backgroundColor = 'gainsboro';
                            })
                            for (let i = 0; i < num; i++) {
                                signalEl.querySelectorAll('.item')[i].style.backgroundColor = 'green';
                            }
                        }
                        if (delta > 400) { // 网络延迟
                            renderSgAc(1)
                        } else if (delta > 300 && delta < 400) {// 网络不好
                            renderSgAc(2)
                        } else if (delta > 200 && delta <= 300) { // 网络一般
                            renderSgAc(3)
                        } else if (delta <= 200) { // 网络优秀
                            renderSgAc(4)
                        }
                        document.querySelector('.detail').innerHTML = `<div>
                            <div>网络延迟:${delta}毫秒</div>
                        </div>`
                        document.querySelector('.noSignal').style.display = 'none'
                        
                        const urlObj = new URL(url);
                        const cmdEl = document.querySelector('.cmd');
                        cmdHtml = cmdEl.innerHTML+`<div>
                            来自 ${urlObj.host} 的回复: 
                            <span style="90px; display:inline-block">耗时=${delta} </span>
                            <span>请求时间=${moment().format('YYYY-MM-DD HH:mm:ss')}</span>
                        </div>`;
                        cmdEl.innerHTML = cmdHtml;
                        cmdEl.scrollTop = cmdEl.scrollHeight;
                    } else {
                        const signalEl = document.querySelector('.signal');
                        signalEl.querySelectorAll('.item').forEach((item) => {
                            item.style.backgroundColor = 'gainsboro';
                        })
                        document.querySelector('.detail').innerHTML = `<div>
                        <div>网络延迟:err毫秒</div>
                            <div>网络错误</div>
                        </div>`
                        document.querySelector('.noSignal').style.display = 'block'
                    }
                }).catch(function (err) {
                    const signalEl = document.querySelector('.signal');
                    signalEl.querySelectorAll('.item').forEach((item) => {
                        item.style.backgroundColor = 'gainsboro';
                    })
                    document.querySelector('.detail').innerHTML = `<div>
                        <div>网络延迟:err毫秒</div>
                        <div>网络错误</div>
                    </div>`
                    document.querySelector('.noSignal').style.display = 'block'
                });
    
    
            }
            setSignalTip('http://www.dshvv.com/w.png')
            setInterval(() => {
                setSignalTip('http://www.dshvv.com/w.png')
            }, 1000)
        </script>
    </body>
    
    </html>
  • 相关阅读:
    phpexcel 导入超过26列、处理时间格式
    PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers
    关于微信支付服务器证书更换的提醒
    PHP微信开发之模板消息回复
    js---用对象来放置变量和方法
    electron---更改安装图标
    css---【vw,vh】进行自适应布局单位
    vue---父子组件之间的通信【props,$refs、$emit】
    vue---props进行双向数据绑定报错
    ES6----拓展运算符 三个点【...】
  • 原文地址:https://www.cnblogs.com/dshvv/p/13834499.html
Copyright © 2020-2023  润新知