编程 利用图片实现网站的加载速度

2024-11-18 12:29:31 +0800 CST views 662

这段代码的主要作用是通过创建并加载隐藏的图片来检测多个外部链接的加载时间,并将其显示在页面上。以下是代码的详细说明和优化建议:

代码说明

  1. HTML结构:

    • 页面上有多个外部链接,每个链接包含一个显示加载时间的元素(enter-ping)。
    • 通过 a 标签将外部链接与相应的站点进行关联。
  2. JavaScript 逻辑:

    • 通过 JavaScript 动态创建 img 元素并尝试加载外部链接中的图片。
    • 通过捕获 onerror 事件来判断图片加载失败,并计算加载时间。
    • 计算出的加载时间显示在相应的 enter-ping 元素中。
  3. 计时:

    • 使用 setInterval 函数每 100 毫秒更新一次 tim 变量,用于记录加载时间。
    • 当图片加载失败时,触发 uomg 函数,显示加载时间。

优化建议

  1. 避免直接使用 setInterval

    • setInterval 是一种基于时间的轮询机制,可能会导致不准确的计时。可以改用更精确的 Date.now() 来计算时间。
  2. 图片加载的优化

    • 图片加载使用随机数来防止缓存问题,这种方法可行,但并非最佳选择。可以使用其他缓存控制手段来实现同样的效果。
  3. 避免内联样式和事件

    • 在创建元素时避免内联样式和事件绑定,可以使用更现代的事件处理方式,如 addEventListener
  4. 加载错误处理

    • 当前只捕获了图片加载失败的情况(onerror),建议同时处理加载成功的情况(onload),以便记录准确的加载时间。

优化前的代码

<div class="field">

        <div class="enter-maomi">

          <div class="enter-icon">

            <div class="icon icon_hand"></div>

          </div>

          <div class="enter-ping">

            <span class="text-white">90ms</span>

          </div>

          <div class="enter-link">

            <a href="https://abc.com" target="_blank"><span class="c_blue">测试网站</span> </a>

          </div>

        </div>

        <div class="enter-maomi">

          <div class="enter-icon">

            <div class="icon icon_hand"></div>

          </div>

          <div class="enter-ping">

            <span class="text-white">240ms</span>

          </div>

          <div class="enter-link">

             <a href="https://abc.com" target="_blank"><span class="c_blue">测试网站</span> </a>

          </div>

        </div>

        <div class="enter-maomi">

          <div class="enter-icon">

            <div class="icon icon_hand"></div>

          </div>

          <div class="enter-ping">

            <span class="text-white">60ms</span>

          </div>

          <div class="enter-link">

           <a href="https://abc.com" target="_blank"><span class="c_blue">测试网站</span> </a>

          </div>

        </div>

        <div class="enter-maomi">

          <div class="enter-icon">

            <div class="icon icon_hand"></div>

          </div>

          <div class="enter-ping">

            <span class="text-white">340ms</span>

          </div>

          <div class="enter-link">

         <a href="https://abc.com" target="_blank"><span class="c_blue">测试网站</span> </a>

          </div>

        </div>

        <div class="enter-maomi">

          <div class="enter-icon">

            <div class="icon icon_hand"></div>

          </div>

          <div class="enter-ping">

            <span class="text-white">20ms</span>

          </div>

          <div class="enter-link">

           <a href="https://abc.com" target="_blank"><span class="c_blue">测试网站</span> </a>

          </div>

        </div>

        <div class="enter-maomi">

          <div class="enter-icon">

            <div class="icon icon_hand"></div>

          </div>

          <div class="enter-ping">

            <span class="text-white">500ms</span>

          </div>

          <div class="enter-link">

        <a href="https://abc.com" target="_blank"><span class="c_blue">测试网站</span> </a>

          </div>

        </div>

        <p class="c_blue c_link">请添加收藏本页面地址,方便您下次访问使用哦!</p>

      </div>



<script language="javascript">

      var tim = 1;

      setInterval("tim++",100);

      obj = document.querySelectorAll('.enter-link a');

      sbj = document.querySelectorAll('.enter-ping span');

      for(var i = 0;i < obj.length; i++){

        var pobj = document.querySelector('.field');

        var img = document.createElement('img');

        img.setAttribute('src', obj[i].href + '/' + Math.random());

        img.setAttribute('onerror', 'uomg("' + i + '")');

        img.setAttribute('style', 'display:none');

        pobj.appendChild(img);

      }

      function uomg(index){

        console.log(sbj[index]);

        sbj[index].innerText = tim * 10 + 'ms';

      }

    </script> 

优化后的代码

<div class="field">
    <!-- 这里放置多个链接块,每个块代表一个外部链接 -->
    <!-- 每个链接块都包含图标、加载时间显示和链接 -->
</div>

<script language="javascript">
    document.addEventListener('DOMContentLoaded', function() {
        var startTime = Date.now(); // 记录起始时间
        var links = document.querySelectorAll('.enter-link a'); // 获取所有链接
        var pingDisplays = document.querySelectorAll('.enter-ping span'); // 获取显示加载时间的元素

        links.forEach((link, index) => {
            var img = new Image();
            img.src = link.href + '/' + Math.random();
            img.style.display = 'none';

            img.onload = img.onerror = function() {
                var endTime = Date.now(); // 记录结束时间
                var loadTime = endTime - startTime; // 计算加载时间
                pingDisplays[index].innerText = loadTime + 'ms'; // 显示加载时间
            };

            document.body.appendChild(img);
        });
    });
</script>

说明

  1. 准确计时: 使用 Date.now() 计算加载时间,避免了 setInterval 的不准确性。
  2. 事件处理: 使用 onloadonerror 事件来处理图片的加载结果,更加全面。
  3. 简化逻辑: 优化了 DOM 操作,使得代码更加简洁和易读。

通过这些优化,可以更好地测量外部链接的响应时间,并显示在页面上,有助于用户判断各个链接的可用性和加载速度。

推荐文章

JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
快手小程序商城系统
2024-11-25 13:39:46 +0800 CST
10个极其有用的前端库
2024-11-19 09:41:20 +0800 CST
js常用通用函数
2024-11-17 05:57:52 +0800 CST
Go 并发利器 WaitGroup
2024-11-19 02:51:18 +0800 CST
Golang 中你应该知道的 noCopy 策略
2024-11-19 05:40:53 +0800 CST
Go 协程上下文切换的代价
2024-11-19 09:32:28 +0800 CST
Web浏览器的定时器问题思考
2024-11-18 22:19:55 +0800 CST
php微信文章推广管理系统
2024-11-19 00:50:36 +0800 CST
Golang在整洁架构中优雅使用事务
2024-11-18 19:26:04 +0800 CST
JavaScript设计模式:装饰器模式
2024-11-19 06:05:51 +0800 CST
Vue3中如何处理WebSocket通信?
2024-11-19 09:50:58 +0800 CST
JS 箭头函数
2024-11-17 19:09:58 +0800 CST
使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
一个简单的打字机效果的实现
2024-11-19 04:47:27 +0800 CST
程序员茄子在线接单