判断图片是否加载完成/图片拼接到页面上后获得图片的宽度和高度出错/如何获得渲染后的图片的宽度和高度

本文详细介绍了在网页中判断图片是否加载完成的多种方法,包括使用jQuery的load事件、原生onload事件、img的complete属性及onreadystatechange事件,帮助开发者在图片加载完毕后准确获取其尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:通过拼字符串将图片放到页面上,然后获得图片的宽度和高度,打印出来的图片的高度一直为0。后来发现是由于图片渲染到页面需要一些时间,打印图片的宽度和高度的时候,img标签渲染上去了,但是图片还没有加载完成,导致出现问题。

解决方法:在图片加载完成后再获得图片的宽度和高度

$(window).load(function() {
   // 图片加载完成后再操作
    ...
});

下面具体介绍判断图片是否加载完成的方法:

了解一下jquery的ready与window.onload的区别,ready只是dom结构加载完毕,便视为加载完成。(此时图片没有加载完毕),onload是指dom的生成和资源完全加载(比如flash、图片)出来后才执行。

一、load事件

1).单张图片(图片在文档中或图片动态生成)

<img id='xiu' src="http://www.daqianduan.com/wp-content/uploads/2014/11/hs-xiu.jpg">  

<script>
$(document).ready(function(){
    //jquery
    $('#xiu').load(function(){
       // 加载完成 
    });

   //原生  onload
    var xiu = document.getElementById('xiu')
    xiu.onload = xiu.onreadystatechange = function(){
       if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
           // 加载完成 
       }
    };

})
</script>

2) 多张图片

img[i].onload = function(){
   //第i张图片加载完成
       
       
}

1、IE8及以下版本不支持onload事件,但支持onreadystatechange事件;
2、readyState是onreadystatechange事件的一个状态,值为loaded或complete的时候,表示已经加载完毕。

二、img的complete属性

<img src="http://pic1.win4000.com/wallpaper/f/51c3bb99a21ea.jpg" alt="">
<script>
// img的complate属性
var timer = setInterval(function(){
if ($("img").complete){
clearInterval(timer);
alert(1);
console.log($("img").complete)
}
}, 10);
</script>

询不断监测img的complete属性,如果为true则表明图片已经加载完毕,停止轮询。该属性所有浏览器都支持。 

三、onreadystatechange事件

<img src="http://pic1.win4000.com/wallpaper/f/51c3bb99a21ea.jpg">
<p id="p1">loading...</p>
<script type="text/javascript">
  $("img").onreadystatechange = function() {
     if($("img").readyState=="complete"||$("img").readyState=="loaded"){
        $("p").html('readystatechange:loaded');
     }
   }
</script>

readyState为complete和loaded则表明图片已经加载完毕。测试IE6-IE10支持该事件,其它浏览器不支持。

转载自:

https://www.cnblogs.com/snandy/p/3704938.html

https://www.cnblogs.com/mq0036/p/6278498.html

https://blog.youkuaiyun.com/kabulore/article/details/23296575

http://www.daqianduan.com/6419.html

 

function SystemStatus({}) { // 内联SVG路由器图片 const routerSVG = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 150" class="w-full h-full"> <rect x="20" y="40" width="160" height="80" rx="8" fill="#3B82F6" stroke="#1E40AF" stroke-width="2"/> <circle cx="50" cy="60" r="5" fill="#10B981"/> <circle cx="70" cy="60" r="5" fill="#10B981"/> <circle cx="90" cy="60" r="5" fill="#10B981"/> <circle cx="110" cy="60" r="5" fill="#10B981"/> <circle cx="130" cy="60" r="5" fill="#10B981"/> <circle cx="150" cy="60" r="5" fill="#10B981"/> <rect x="40" y="80" width="120" height="20" rx="3" fill="#1E40AF"/> <rect x="30" y="30" width="140" height="10" rx="3" fill="#1E40AF"/> <rect x="85" y="20" width="30" height="10" rx="2" fill="#9CA3AF"/> </svg> `; // 模拟初始系统状态数据 const initialStatusData = { routerImage: routerSVG, // 使用内联SVG uploadRate: "1.2 Mbps", downloadRate: "15.8 Mbps", wanStatus: { status: "已联网", ipv4: "122.77.241.10", subnetMask: "255.255.255.0", gateway: "122.77.241.1", dns1: "8.8.8.8", dns2: "8.8.4.4" }, systemStatus: { model: "FAST FW300R", hostname: "Home-Router", cpuUsage: "24%", memoryUsage: "512MB / 1GB (51%)", uptime: "3天12小时45分钟", version: "V1.2.0" }, connectionStatus: { onlineDevices: 8, networkConnections: 24 } }; const [status, setStatus] = useState(null); const [refreshTime, setRefreshTime] = useState(new Date()); // 模拟获取系统状态 const refresh = () => { return new Promise(resolve => { setTimeout(() => { // 保持routerImage不变,只更新其他字段 const newData = { ...initialStatusData }; if (status) { newData.routerImage = status.routerImage; // 保留现有的SVG } setStatus(newData); setRefreshTime(new Date()); resolve(); }, 300); }); }; useEffect(() => { refresh(); const interval = setInterval(refresh, 60000); return () => clearInterval(interval); }, []); if (!status) return html`<div class="flex justify-center items-center h-32">加载...</div>`; return html` <div class="m-4 grid grid-cols-1 gap-4"> <div class="py-1 divide-y border rounded bg-white flex flex-col"> <div class="flex items-center justify-between px-4 py-2"> <div class="font-light uppercase text-gray-600">路由器状态</div> <div class="text-xs text-gray-500"> 最后更新: ${refreshTime.toLocaleTimeString()} <button class="ml-2 text-blue-600 hover:text-blue-800" onClick=${refresh} > 刷新 </button> </div> </div> <div class="py-2 px-5 flex-1 flex flex-col"> <div class="grid grid-cols-1 md:grid-cols-3 gap-4"> <!-- 路由器图片上下行速率 --> <div class="border rounded p-3 flex flex-col items-center"> <h3 class="text-sm font-medium text-gray-700 mb-2">路由器视图</h3> <!-- 使用内联SVG代替外部图片 --> <div class="w-32 h-32 object-contain mb-4" dangerouslySetInnerHTML=${{ __html: status.routerImage }} ></div> <div class="text-center"> <div class="text-sm font-medium">${status.systemStatus.model}</div> <div class="text-xs text-gray-500">${status.systemStatus.hostname}</div> </div> <div class="mt-4 w-full"> <div class="flex justify-between mb-1"> <span class="text-xs text-gray-600">上传速率</span> <span class="text-xs font-medium">${status.uploadRate}</span> </div> <div class="w-full bg-gray-200 rounded-full h-2"> <div class="bg-blue-500 h-2 rounded-full" style=${{ width: "30%" }} ></div> </div> <div class="flex justify-between mb-1 mt-2"> <span class="text-xs text-gray-600">下载速率</span> <span class="text-xs font-medium">${status.downloadRate}</span> </div> <div class="w-full bg-gray-200 rounded-full h-2"> <div class="bg-green-500 h-2 rounded-full" style=${{ width: "70%" }} ></div> </div> </div> </div> <!-- WAN口状态 --> <div class="border rounded p-3"> <h3 class="text-sm font-medium text-gray-700 mb-2">WAN口状态</h3> <div class="space-y-2"> <div class="flex justify-between"> <span class="text-sm text-gray-600">状态</span> <span class="text-sm font-medium text-green-600">${status.wanStatus.status}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">IPv4地址</span> <span class="text-sm font-medium">${status.wanStatus.ipv4}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">子网掩码</span> <span class="text-sm font-medium">${status.wanStatus.subnetMask}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">网关</span> <span class="text-sm font-medium">${status.wanStatus.gateway}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">DNS1</span> <span class="text-sm font-medium">${status.wanStatus.dns1}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">DNS2</span> <span class="text-sm font-medium">${status.wanStatus.dns2}</span> </div> </div> </div> <!-- 系统状态 --> <div class="border rounded p-3"> <h3 class="text-sm font-medium text-gray-700 mb-2">系统状态</h3> <div class="space-y-2"> <div class="flex justify-between"> <span class="text-sm text-gray-600">型号</span> <span class="text-sm font-medium">${status.systemStatus.model}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">主机名</span> <span class="text-sm font-medium">${status.systemStatus.hostname}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">固件版本</span> <span class="text-sm font-medium">${status.systemStatus.version}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">CPU使用率</span> <span class="text-sm font-medium">${status.systemStatus.cpuUsage}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">内存占用</span> <span class="text-sm font-medium">${status.systemStatus.memoryUsage}</span> </div> <div class="flex justify-between"> <span class="text-sm text-gray-600">运行时间</span> <span class="text-sm font-medium">${status.systemStatus.uptime}</span> </div> </div> </div> </div> <!-- 连接状态 --> <div class="mt-4"> <div class="border rounded p-3"> <h3 class="text-sm font-medium text-gray-700 mb-2">连接状态</h3> <div class="grid grid-cols-2 gap-4"> <div class="bg-blue-50 rounded p-3 text-center"> <div class="text-2xl font-bold">${status.connectionStatus.onlineDevices}</div> <div class="text-sm text-gray-600">在线终端</div> </div> <div class="bg-green-50 rounded p-3 text-center"> <div class="text-2xl font-bold">${status.connectionStatus.networkConnections}</div> <div class="text-sm text-gray-600">网络连接数</div> </div> </div> </div> </div> </div> </div> </div>`; } 在路由器图片的左边生成一个地球表示internet,在地球旁边显示我们的上传下载速率,最下面的下载上传速率去掉,然后在路由器右边生成一个手机电脑,地球,路由器,手机电脑他们三者直接距离远一点,给出修改后的完整代码。
最新发布
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值