`
zzc1684
  • 浏览: 1225947 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JS实现图片预加载无需等待

    博客分类:
  • Js
阅读更多

网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像pconline一样每个页面只显示一张图片,让用户每看一张图片就 需要重新下载一下整个页面。不过,在web2.0时代,更多人愿意用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图 片。

知道了一张图片的地址,需要把它在一个固定大小的html容器(可以是div等)里边显示出来,最重要的当然是需要知道这张即将显示的图片的宽和高,然后再结合容器的宽和高,按照一定的缩放比例使图片显示出来。因此,实现图片预加载就成为图片浏览器的核心功能了。

做过图片翻转效果的朋友其实都知道,要让图片轮换的时候不出现等待,最好是先让图片下载到本地,让浏览器缓存起来。这时,一般都会用到js里边的Image对象。一般的手段无非这样:

function preLoadImg(url) {
var img = new Image();
img.src = url;
} 

 

通过调用preLoadImg函数,传入图片的url,就能使图片预先下载下来了。实际上,这里用到的预下载功能也和这基本一致。图片预下载下来后,通过 img的width和height属性,就能知道图片的宽和高了。但是需要考虑到,在做图片浏览器功能时,图片都是实时显示的。比如你点了显示的按钮,这 个时候才会调用上边类似的代码来加载图片。因此,如果你直接用img.width的时候,图片还没有完全下载下来。因此,需要用一些异步的方法,等到图片 下载完毕的时候才会再对img的width和height进行调用。

实现这样的异步方法实际上不难,图片的下载完毕事件也很简单,就是简单的onload事件。因此,我们可以写出下面的代码:

function loadImage(url, callback) {
var img = new Image();
img.src = url;
img.onload = function(){ //图片下载完毕时异步调用callback函数。
callback.call(img); // 将callback函数this指针切换为img。
};
} 

 

好了,再来写一个测试用例。

function imgLoaded(){
alert(this.width);
}
<input type="button" value="loadImage" onclick="loadImage('aaa.jpg',imgLoaded)"/> 

 

在firefox中测试一下,发现不错,果然和预想的效果一样,在图片下载后,就会弹出图片的宽度来。无论点击多少次或者刷新结果都一样。

不过,做到这一步,先别高兴太早——还需要考虑一下浏览器的兼容性,于是,赶紧到ie里边测试一下。没错,同样弹出了图片的宽度。但是,再点击load的时候,情况就不一样了,什么反应都没有了。刷新一下,也同样如此。

经 过对多个浏览器版本的测试,发现ie6、opera都会这样,而firefox和safari则表现正常。其实,原因也挺简单的,就是因为浏览器的缓存 了。当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于 firefox和safari,它们视图使这两种加载方式对用户透明,同样会引起图片的onload事件,而ie和opera则忽略了这种同一性,不会引 起图片的onload事件,因此上边的代码在它们里边不能得以实现效果。

怎么办呢?最好的情况是Image可以有一个状态值表明它是否已经载入成功了。从缓存加载的时候,因为不需要等待,这个状态值就直接是表明已经下载了,而从http请求加载时,因为需要等待下载,这个值显示为未完成。这样的话,就可以搞定了。

经过一些分析,终于发现一个为各个浏览器所兼容的Image的属性——complete。所以,在图片onload事件之前先对这个值做一下判断即可。最后,代码变成如下的样子:

function loadImage(url, callback) {
var img = new Image(); //创建一个Image对象,实现图片的预下载
img.src = url;
if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
callback.call(img);
return; // 直接返回,不用再处理onload事件
}
img.onload = function () { //图片下载完毕时异步调用callback函数。
callback.call(img);//将回调函数的this替换为Image对象
};
}; 

 

经过这么一番折腾,总算是让各个浏览器都能满足我们的目标了。虽然代码很简单,但是却把图片浏览器中最核心的问题解决掉了,接下来你所要做的,仅仅是图片如何呈现的问题了接下来看看另外一种方法:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>js 实现图片预加载 加载完后执行动作</title>
</head>
<style type="text/css">
<!--
*html{
margin:0;
padding:0;
border:0;
}
body{border:1px solid #f3f3f3; background:#fefefe}
div#loading{
width:950px;
height:265px;
line-height:265px;
overflow:hidden;
position:relative;
text-align:center;
}
div#loading p{
position:static;
+position:absolute;
top:50%;
vertical-align:middle;
}
div#loading p img{
position:static;
+position:relative;
top:-50%;left:-50%;
vertical-align:middle
}
-->
</style>
<div id="loading">
<p><img src="http://www.baidu.com/img/baidu_logo.gif" /></p>
</div>
<script>
var i=0;
var c=3;
var imgarr=new Array
imgarr[0]="http://www.baidu.com/img/baidu_logo.gif";
imgarr[1]="http://img.baidu.com/img/logo-img.gif";
imgarr[2]="http://img.baidu.com/img/logo-zhidao.gif";
var Browser=new Object();
Browser.userAgent=window.navigator.userAgent.toLowerCase();
Browser.ie=/msie/.test(Browser.userAgent);
Browser.Moz=/gecko/.test(Browser.userAgent);
function SImage(url,callback)
{
var img = new Image();
if(Browser.ie){
img.onreadystatechange =function(){
if(img.readyState=="complete"||img.readyState=="loaded"){
ii=i+1;
callback(i);
}
}
}else if(Browser.Moz){
img.onload=function(){
if(img.complete==true){
ii=i+1;
callback(i);
}
}
}
img.src=url;
}
function icall(v)
{
if(v<c){
SImage(""+imgarr[v]+"",icall);
}
else if(v>=c){
i=0;
//location.replace('banner.html');//这里写自己的动作吧,
}
} 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    js实现图片预加载.tx

    预加载的关键在于预测用户下一步可能访问的图片,并提前加载这些图片到本地缓存中,以便于当用户实际访问时能够立即展示,无需等待网络传输时间。 #### 二、JavaScript实现图片预加载的技术原理 在JavaScript中...

    图片预加载js

    本文将深入探讨“图片预加载js”这一主题,包括预加载的原理、实现方式以及如何使用JavaScript来优化这个过程。 一、图片预加载的原理 图片预加载是指在用户实际看到图片之前,提前将图片数据加载到浏览器的缓存中...

    图片预加载学习(三):无序加载之图片切换

    预加载使得用户在查看图片时无需等待,从而提升页面的响应速度。 首先,让我们理解什么是图片预加载。预加载是一种策略,通过在用户实际点击或滚动到图片之前提前下载图片,来减少加载时间。这尤其适用于那些在用户...

    【JavaScript源代码】javascript实现图片预加载和懒加载.docx

    ### JavaScript 实现图片预加载与懒加载技术解析 #### 一、引言 在现代Web开发中,优化页面加载速度及提升用户体验是非常重要的环节。图片作为网页内容的重要组成部分,其加载方式直接影响着整个页面的性能表现。...

    图片预加载、占位背景图jquery plugin

    jQuery预加载插件的工作原理是,创建`&lt;img&gt;`元素并设置其`src`属性为需要加载的图片URL,浏览器会自动开始下载图片,而无需等待其他脚本执行完毕。 这个特定的jQuery插件可能提供了以下特性: 1. **批量预加载**:...

    图片预加载的js

    在网页设计中,图片预加载是一项重要的优化...通过以上方法,你可以有效地使用JavaScript和jQuery实现图片预加载,并监控加载状态,为用户提供更流畅、快速的浏览体验。在实际项目中,可以根据具体需求进行调整和优化。

    javascript简单实现图片预加载

    在网页设计中,图片预加载是一项重要的技术,它允许开发者在用户查看页面之前预先加载一些关键的图片资源,从而提高用户体验,减少用户等待时间。在JavaScript中,我们可以使用简单的代码来实现这一功能。这里我们将...

    jquery.LoadImage图片预加载.zip

    无需对HTML代码进行任何改动,只需在JavaScript中调用LoadImage函数,即可实现图片的预加载。这为开发者提供了极大的便利,尤其适用于那些已经有大量HTML代码的项目,不需要进行大规模重构。 以下是使用jQuery ...

    jQuery页面区域预加载布局代码

    3. **页面逻辑脚本**:可能包含处理页面交互和预加载逻辑的自定义JavaScript代码,如监听页面加载事件,控制预加载进度等。 **fonts**文件夹通常包含页面所需的字体资源,可能是Web字体,使得网页可以使用特殊字体...

    struts 预加载数据demo

    Struts预加载数据的实现是Web开发中一种提高用户体验的技术,尤其在大数据量或复杂页面加载时,可以分批次提前获取部分数据,减轻用户等待时间。在这个“struts 预加载数据demo”中,我们将深入探讨如何使用Struts2...

    解析javascript图片懒加载与预加载的分析总结

    2. JavaScript预加载:通过JavaScript动态创建图片元素,并设置其src属性值。图片加载完成后再将图片元素添加到页面中。 3. HTML预加载:通过在HTML中添加img标签,但不设置其src属性,然后通过JavaScript设置src来...

    纯CSS图片预加载实例 摆脱Javascript预载的束缚

    传统的预加载方式通常依赖于JavaScript,但今天我们将探讨如何利用纯CSS实现图片预加载,从而摆脱对JavaScript的依赖。 ### 为什么需要图片预加载? 在网页中,当用户滚动页面时,如果图片没有预先加载,可能会...

    利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    纯JavaScript预加载方法可以更灵活控制预加载过程。例如,可以创建一个Image对象数组,然后遍历预加载的图片URL列表,如下所示: ```javascript var images = []; function preload() { for (i = 0; i ; i++) { ...

    JS图片预加载插件详解

    预加载可以分为无序预加载和有序预加载,无序预加载需要等待所有图片加载完成后才能进行后续操作,而有序预加载则允许加载完第一张图片后就立即加载第二张、第三张等,使图片的加载更加顺畅。 文章还提到了进度条的...

    jquery.LoadImage图片预加载

    `jQuery LoadImage`插件就是为了解决这个问题而诞生的,它提供了一种简单易用的方法来预先加载网页中的图片资源,确保用户在浏览时无需等待图片加载,从而提升网站的响应速度和交互体验。 `jQuery LoadImage`的核心...

    CSS3预加载Loading动画特效.zip

    开发者可以根据实际需求,选择适合的预加载动画,并通过JavaScript(标签中提到的JS特效)来控制加载动画的显示和隐藏,确保在页面内容完全加载后自动消失。 总的来说,CSS3预加载Loading动画特效是提升网页性能和...

    ajax页面预加载

    1. **JavaScript实现**:使用 Ajax 请求提前加载数据,或者使用 `link` 标签预加载图片、CSS、字体等资源。 2. **HTML5 Prefetch 和 Prerender**:`&lt;link rel="prefetch"&gt;` 提前获取资源,`&lt;link rel="prerender"&gt;` ...

    纯CSS3实现圆球弹性预加载动画特效代码.zip

    【描述】中的"圆球弹性预加载动画特效"意味着这个代码实现了由多个圆形元素组成的动态加载效果,这些圆形元素具有弹性的运动轨迹,为用户提供一种动态且引人入胜的等待体验。CSS3是层叠样式表(Cascading Style ...

Global site tag (gtag.js) - Google Analytics