用new Image()预先加载图片真的有用吗?

预加载图片的误区
本文通过实验探讨了使用newImage()预加载图片的有效性。结果显示,即使图片已预加载,当图片源发生变化时,浏览器仍会发送新的请求加载图片,这与预期中利用缓存避免重复加载的行为不符。
经常会用到在网页上交替显示图片。很多推荐的作法是用new Image() 预先装载图片。但是用new Image()真的有用吗?

试验:

在后台放一个过滤器捕捉所有 /* 的请求:

doFilter里面简单的打印请求的URL:

[code]

HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("requets url: " + httpRequest.getRequestURI());
chain.doFilter(request, response);

[/code]


html代码:

[code]
<body>
<script>
var t1 = new Image();
t1.src = 'ico_unchecked.gif';

function change(){
im.src = t1.src;
}
</script>
<button onclick="change()">change</button>
<img id="im" src="ico_checked.gif">
</body>
[/code]


可以看到打印了三次url。html页面的请求一次。t1.src设值的时候一次。<img src="">的时候一次。

我想这时候如果按按钮改变页面上的图片,应该不会再从服务端载图片了,因为缓存里面已经有了嘛。可是点的时候过滤器仍然是有打印出URL!

看来只要image对象的src一被改变就会发出请求。那预先装载图片不是等于没用吗?
预先加载图片资源并显示到指定标签处,有以下几种常见的实现方法: ### 使用 JavaScript 的 Image 对象 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>图片加载并显示</title> </head> <body> <div id="imageContainer"></div> <script> const image = new Image(); image.onload = function () { const container = document.getElementById('imageContainer'); container.appendChild(image); }; image.src = 'your_image_path.jpg'; </script> </body> </html> ``` 上述代码通过创建`Image`对象,监听其`onload`事件,在图片加载完成后将其添加到指定的`div`标签中,实现了图片的预加载和显示。 ### 使用 HTML 的 link 标签(Preload) ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>图片加载并显示</title> <link rel="preload" as="image" href="your_image_path.jpg"> </head> <body> <div id="imageContainer"></div> <script> const container = document.getElementById('imageContainer'); const img = new Image(); img.src = 'your_image_path.jpg'; container.appendChild(img); </script> </body> </html> ``` 这里使用`link`标签的`preload`属性提前加载图片资源,之后在 JavaScript 中创建`Image`对象并将其添加到指定标签中显示图片。 ### 预加载多张图片并显示 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>多张图片加载并显示</title> </head> <body> <div id="imageContainer"></div> <script> const imageUrls = ['image1.jpg', 'image2.jpg', 'image3.jpg']; const container = document.getElementById('imageContainer'); const loadedImages = []; function loadImages() { let loadedCount = 0; imageUrls.forEach((url) => { const image = new Image(); image.onload = function () { loadedCount++; loadedImages.push(image); if (loadedCount === imageUrls.length) { loadedImages.forEach((img) => { container.appendChild(img); }); } }; image.src = url; }); } loadImages(); </script> </body> </html> ``` 该代码实现了多张图片的预加载,在所有图片加载完成后,将它们添加到指定的`div`标签中显示。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值