js预载入和JavaScript Image()对象使用介绍


Posted in Javascript onAugust 28, 2011

预载入和JavaScript Image()对象

很多high-res图像真的可以使 Web 站点更加整洁。但是它们也会使站点的访问速度变慢——图像是文件,文件使用带宽,带宽直接与等待时间相关。是该了解如何通过一个叫做图像预载入(preloading)的技巧来提高 Web 站点的访问速度的时候了。
图像预载入
对于浏览器载入图像来说,只有在对图像发送一个 HTTP请求之后,它们才会被浏览器载入,对图像的 HTTP 请求要么使用 <img> 标记,要么通过方法调用实现。如果使用 JavaScript 脚本来处理在 mouseover 事件时交换图像,或者在一段时间之后自动更改图像,那么在从服务器获取图像时可能要等上几秒钟到几分钟的时间。如果使用一个慢速的 Internet 连接,或者要获取的图像非常大,或者其它一些情况,这种现象就特别明显;这样,延迟就造成你不能达到自己期望的效果。
一些浏览器采用一些措施来缓解这一问题,比如试图通过在本地缓存中存储图像,从而使随后对图像的调用能够立即被满足;但是在图像第一次被调用时依然会存在一些延迟。预载入是在需要图像之前将其下载到缓存的一种方法。通过这一措施,当真正需要图像时,它就可以被立即从缓存中取出,从而能够立即显示。
Image() 对象
预载入图像最简单的方法是在 JavaScript 中实例化一个新 Image() 对象,然后将需要载入的图像的 URL 作为参数传入。假设我们有一个图像叫做heavyimagefile.jpg,在用户的鼠标放到一个已经显示的图像之上时,我们希望显示这个图像。为了预载入这一图像从而得到较快的响应时间,我们简单地创建一个 Image() 对象 heavyImage,然后在 onLoad() 事件处理器中将其同时载入。

<html> 
<head> 
<script language = "JavaScript"> 
function preloader() 
{ 
heavyImage = new Image(); 
heavyImage.src = "heavyimagefile.jpg"; 
} 
</script> 
</head> 
<body onLoad="javascript:preloader()"> 
<a href="#" onMouseOver="javascript:document.img01.src='heavyimagefile.jpg'"> 
<img name="img01" src="justanotherfile.jpg"></a> 
</body> 
</html>

请注意,图像标记本身不能处理 onMouseOver() 和 onMouseOut() 事件,这就是上例中<img> 标记被包含在一个<a> 标记之中的原因,<a> 标记支持这两个事件类型。
使用数组载入多个图像
在实际应用中,我们可能需要预载入多个图像,而不止一个;例如,在一个包含多个图像翻卷的菜单栏中,或者在我们试图创建平滑效果时,都需要预载入多个图像。其实这并不困难,只要使用 JavaScript 的数组即可实现,如下例所示:
<script language="JavaScript"> 
function preloader() 
{ 
// counter 
var i = 0; 
// create object 
imageObj = new Image(); 
// set image list 
images = new Array(); 
images[0]="image1.jpg" 
images[1]="image2.jpg" 
images[2]="image3.jpg" 
images[3]="image4.jpg" 
// start preloading 
for(i=0; i<=3; i ) 
{ 
imageObj.src=images[i]; 
} 
} 
</script>

在上面的例子中,我们定义一个变量 i和一个 Image() 对象 imageObj。然后定义了一个新数组 images[],每个数组元素存储要被预载入的图像。最后,创建一个 for() 循环来处理整个数组,并将每个元素赋给 Image() 对象,这样将其载入到缓存中。
onLoad() 事件处理器
像很多 JavaScript 的其它对象一样,Image() 对象也有一些事件处理器。其中最有用的一个肯定是 onLoad() 处理器,它在图像完全载入之后调用。这个事件处理器可以与一个自定义函数联系起来,以在图像完全载入之后执行一些特定的任务。下面的例子说明了这一点,在这个例子中,首先在图像载入时显示一个“please wait”屏幕,然后在载入完成时将浏览器转到一个新的 URL。
<html> 
<head> 
<script language="JavaScript"> 
// create an image object 
objImage = new Image(); 
// set what happens once the image has loaded objImage.onLoad=imagesLoaded(); 
// preload the image file 
objImage.src='images/image1n.gif'; 
// function invoked on image load 
function imagesLoaded() 
{ 
document.location.href='index2.html'; 
} 
</script> 
</head> 
<body> 
Please wait, loading images... 
</body> 
</html>

当然,你还可以创建一个图像数组然后在其上进行循环操作,预载入每个图像,然后在每一阶段跟踪被载入图像的数目。一旦所有图像载入完毕,根据事件处理器的程序逻辑,它就可以将浏览器带入下一个页面(或者执行其它任务)。
预载入和多状态菜单
现在,如何在实际应用程序中使用所有你学到的理论?下面的这段代码是我最近偶尔编写的一个菜单栏,这个菜单栏由一些按钮(图像链接)组成,每个按钮具有三种状态:正常、悬停和点击。因为按钮具有多种状态,所以很有必要使用图像预载入,以保证菜单的状态能够快速地反应。清单A中的代码说明了实现方法。
清单A 中的HTML 代码设置了一个由四个按钮组成的菜单,每个按钮具有三种状态:正常、悬停和点击。需求如下:
# 当鼠标移动到一个正常状态下的按钮之上时,它变为悬停状态。在鼠标离开之后,按钮恢复为正常状态。
# 在鼠标点击一个按钮时,按钮变为点击状态。在其它按钮被点击之前,它将保留这一状态。
# 如果一个按钮被点击,其它按钮的状态都不能为点击状态。其它按钮只能为悬停状态或正常状态。
# 在同一时间只能有一个按钮被点击。
# 在同一时间只能有一个按钮处于悬停状态。
第一个任务是设置数组,用于保存菜单每个状态的图像。与这些数组元素对应的 <img> 也在 HTML 文档正文(body)中创建,并顺序地命名。请注意,数组值的索引是从0开始的,虽然对应的 <img> 元素的命名是从1开始的——这样就需要在脚本后面的部分进行计算调整。
函数 preloadImage() 负责将所有的图像存储到缓存中,以使鼠标运动的响应时间最小。for() 循环用于迭代第一步创建的图像,并在每次迭代中预载入一个图像。
Javascript 相关文章推荐
关于取不到由location.href提交而来的上级页面地址的解决办法
Jul 30 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
JavaScript实现按Ctrl键打开新页面
Sep 04 Javascript
JavaScript中getUTCMinutes()方法的使用详解
Jun 10 Javascript
jQuery实现自定义右键菜单的树状菜单效果
Sep 02 Javascript
jQuery增加与删除table列的方法
Mar 01 Javascript
如何实现星星评价(jquery.raty.js插件)
Dec 21 Javascript
js如何获取网页所有图片
May 12 Javascript
微信小程序定位当前城市的方法
Jul 19 Javascript
利用原生的JavaScript实现简单拼图游戏
Nov 18 Javascript
用vuex写了一个购物车H5页面的示例代码
Dec 04 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 #Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 #Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 #Javascript
JavaScript 原型继承之构造函数继承
Aug 26 #Javascript
JavaScript原型继承之基础机制分析
Aug 26 #Javascript
自己动手开发jQuery插件教程
Aug 25 #Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
Aug 23 #Javascript
You might like
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
详解Python中DOM方法的动态性
2015/04/11 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python实现微信打飞机游戏
2020/03/24 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
关于赌博的检讨书
2014/01/08 职场文书
初一地理教学反思
2014/01/16 职场文书
小学老师寄语大全
2014/04/04 职场文书
岗位聘任报告
2015/03/02 职场文书
初中美术教学反思
2016/02/17 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
MySQL时区造成时差问题
2022/04/13 MySQL
python标准库ElementTree处理xml
2022/05/20 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers