这段代码的主要作用是通过创建并加载隐藏的图片来检测多个外部链接的加载时间,并将其显示在页面上。以下是代码的详细说明和优化建议:
代码说明
HTML结构:
- 页面上有多个外部链接,每个链接包含一个显示加载时间的元素(
enter-ping
)。 - 通过
a
标签将外部链接与相应的站点进行关联。
- 页面上有多个外部链接,每个链接包含一个显示加载时间的元素(
JavaScript 逻辑:
- 通过 JavaScript 动态创建
img
元素并尝试加载外部链接中的图片。 - 通过捕获
onerror
事件来判断图片加载失败,并计算加载时间。 - 计算出的加载时间显示在相应的
enter-ping
元素中。
- 通过 JavaScript 动态创建
计时:
- 使用
setInterval
函数每 100 毫秒更新一次tim
变量,用于记录加载时间。 - 当图片加载失败时,触发
uomg
函数,显示加载时间。
- 使用
优化建议
避免直接使用
setInterval
:setInterval
是一种基于时间的轮询机制,可能会导致不准确的计时。可以改用更精确的Date.now()
来计算时间。
图片加载的优化:
- 图片加载使用随机数来防止缓存问题,这种方法可行,但并非最佳选择。可以使用其他缓存控制手段来实现同样的效果。
避免内联样式和事件:
- 在创建元素时避免内联样式和事件绑定,可以使用更现代的事件处理方式,如
addEventListener
。
- 在创建元素时避免内联样式和事件绑定,可以使用更现代的事件处理方式,如
加载错误处理:
- 当前只捕获了图片加载失败的情况(
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>
说明
- 准确计时: 使用
Date.now()
计算加载时间,避免了setInterval
的不准确性。 - 事件处理: 使用
onload
和onerror
事件来处理图片的加载结果,更加全面。 - 简化逻辑: 优化了 DOM 操作,使得代码更加简洁和易读。
通过这些优化,可以更好地测量外部链接的响应时间,并显示在页面上,有助于用户判断各个链接的可用性和加载速度。