看完了曼联与曼城的同城德比,还有漫长的两个小时,才能看到期待中的国家德比。无聊的很,左右无事,便来论坛闲逛。看到了一章关于图片预加载的博文,其代码如下:
function loadImage(url, callback) {
var img = new Image(); //创建一个Image对象,实现图片的预下载
img.src = url;
if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
callback(img);
return; // 直接返回,不用再处理onload事件
}
img.onload = function () { //图片下载完毕时异步调用callback函数。
callback(img);
};
};
在网上搜索了一下相关文章,大体上都是这个思路。
这个方法功能是ok的,但是有一些隐患。
1 创建了一个临时匿名函数来作为图片的onload事件处理函数,形成了闭包。
相信大家都看到过ie下的内存泄漏模式的文章,其中有一个模式就是循环引用,而闭包就有保存外部运行环境的能力(依赖于作用域链的实现),所以img.onload这个函数内部又保存了对img的引用,这样就形成了循环引用,导致内存泄漏。(这种模式的内存泄漏只存在低版本的ie6中,打过补丁的ie6以及高版本的ie都解决了循环引用导致的内存泄漏问题)。
2 只考虑了静态图片的加载,忽略了gif等动态图片,这些动态图片可能会多次触发onload。
要解决上面两个问题很简单,其实很简单,代码如下:
img.onload = function () { //图片下载完毕时异步调用callback函数。
img.onload = null;
callback(img);
};
这样既能解决内存泄漏的问题,又能避免动态图片的事件多次触发问题。
在一些相关博文中,也有人注意到了要把img.onload 设置为null,只不过时机不对,大部分文章都是在callback运行以后,才将img.onload设置为null,这样虽然能解决循环引用的问题,但是对于动态图片来说,如果callback运行比较耗时的话,还是有多次触发的隐患的。
隐患经过上面的修改后,就消除了,但是这个代码还有优化的余地:
if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数
callback(img);
return; // 直接返回,不用再处理onload事件
}
关于这段代码,看相关博文里的叙述,原因如下:
经过对多个浏览器版本的测试,发现ie、opera下,当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图
片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于 firefox和safari,它们试图使这两种加载方式对用户透明,同样
会引起图片的onload事件,而ie和opera则忽略了这种同一性,不会引起图片的onload事件,因此上边的代码在它们里边不能得以实
现效果。
确实,在ie,opera下,对于缓存图片的初始状态,与firefox和safari,chrome下是不一样的(有兴趣的话,可以在不同浏览器下,测试一下在给img的src赋值缓存图片的url之前,img的状态),但是对onload事件的触发,却是一致的,不管是什么浏览器。产生这个问题的根本原因在于,img的src赋值与 onload事件的绑定,顺序不对(在ie和opera下,先赋值src,再赋值onload,因为是缓存图片,就错过了onload事件的触发)。应该先绑定onload事件,然后再给src赋值,代码如下:
function loadImage(url, callback) {
var img = new Image(); //创建一个Image对象,实现图片的预下载
img.onload = function(){
img.onload = null;
callback(img);
}
img.src = url;
}
这样内存泄漏,动态图片的加载问题都得到了解决,而且也以统一的方式,实现了callback的调用。
转自:http://www.cnblogs.com/rt0d/archive/2011/04/17/2018646.html#2087382
分享到:
相关推荐
**jQuery图片预加载技术详解** 在网页开发中,图片预加载是一种优化用户体验的重要技术,尤其在Web和移动端,用户往往期望页面能快速显示并流畅运行。`jQuery`库以其简洁的API和强大的功能,成为实现图片预加载的...
图片预加载技术是一种优化网页性能的方法,特别是在网页中包含大量图片或者动态展示图片时尤为重要。它的主要目的是在用户浏览页面之前提前加载图片,减少用户等待时间,提高用户体验。本篇文章将详细探讨图片预加载...
本话题主要围绕"jQuery 预加载图片"这一主题展开,我们将深入探讨jQuery库如何帮助开发者实现图片预加载功能。 jQuery是一个强大的JavaScript库,它简化了DOM操作、事件处理、动画制作以及Ajax交互等多个方面的工作...
《jQuery LazyLoad 图片预加载技术详解》 在网页设计中,图片的加载速度往往直接影响着用户体验。当页面中包含大量图片时,如果一次性全部加载,可能会导致页面加载时间过长,用户需要等待,这无疑降低了网站的可用...
综上所述,图片预加载js是提升网页性能的重要手段,通过合理的预加载策略和JavaScript技巧,我们可以优化用户体验,减少用户等待时间,同时兼顾服务器负载。在实际项目中,应根据具体需求和场景选择合适的方法来实现...
图片预加载技术是一种优化网页性能的方法,主要用于提升用户体验,尤其是对于图像密集型的网站或应用。当用户浏览网页时,预加载技术会提前加载部分或全部未来可能需要的图片资源,这样在用户实际查看这些图片时,...
**jQuery实现图片预加载** 在Web开发中,用户体验是一个至关重要的因素,而图片加载速度直接影响着用户对网站的第一印象。为了提升用户体验,开发者通常会采用图片预加载技术,确保图片在用户需要时能够快速显示。...
在微信小程序开发中,图片预加载是一个非常关键的优化步骤,尤其对于图片密集型的应用,如电商、社交或媒体类应用。预加载技术允许开发者在用户实际需要之前提前下载图片资源,减少用户等待时间,提升用户体验。本篇...
"JS实现图片预加载" 图片预加载是指在浏览器中预先加载图片,以提高用户体验和减少流量消耗的一种技术。JS 实现图片预加载可以通过使用 Image 对象来实现图片的预下载,并且可以结合容器的宽和高,按照一定的缩放...
在网页设计和开发中,图片预加载和延迟加载是两种重要的优化策略,它们可以显著提升网站性能和用户体验。本文将详细探讨使用jQuery实现这两种技术,以及它们如何协同工作以优化页面打开速度。 首先,让我们理解预...
在网页设计中,图片预加载是一项重要的优化技术,它的目的是提前加载用户可能需要的图片,以提高用户体验,减少页面加载时间。"图片预加载loading"就是这个概念的具体应用,它通常会在页面的主要内容加载之前,预先...
**jQuery图片预加载技术详解** 在网页设计中,图片预加载是一种优化用户体验的重要技术,它使得用户在浏览页面时能够快速地看到图片,避免了图片加载过程中出现的空白或者闪烁现象。本文将深入探讨如何使用jQuery来...
在本文中,我们将深入探讨“图片预加载学习”的第三部分,重点关注无序加载以及如何实现图片切换。在网页设计和开发中,图片预加载是一项重要的技术,它可以帮助提高用户体验,尤其是当网页包含大量图片时。预加载...
JavaScript图片预加载是一种优化网页性能的技术,特别是在网页中包含大量图片或者有动态加载图片需求时。这种方法通过在用户实际查看图片之前,提前加载图片资源,减少用户等待时间,提升用户体验。这里我们将深入...
为了提高页面加载效率和用户浏览的流畅性,我们可以采用图片预加载技术。jQuery作为一个强大的JavaScript库,提供了丰富的API和插件,可以帮助我们实现这一目标。本篇文章将深入探讨如何使用jQuery实现图片预加载,...
**preloadjs 图片预加载插件详解** 在Web开发中,图片预加载是一项重要的优化技术,它可以提升用户体验,确保图片在需要时能够迅速显示。preloadjs 是一款强大的JavaScript库,专为实现资源预加载而设计,包括图片...
5. 使用预加载特效插件:如果你需要更复杂的效果,可以考虑使用现成的jQuery预加载插件,例如"图片预加载特效"这个文件可能就是一个这样的插件。安装和使用这类插件通常只需要引入插件文件,然后按照文档配置即可。 ...
在IT行业中,图片预加载是一项重要的前端技术,它主要用于优化用户体验,确保图片在用户需要时能够快速显示。本文将深入探讨“图片预加载学习(一):无序加载之图片切换”的主题,主要涵盖以下几个方面: 1. **图片...
在微信小程序的开发中,图片预加载是一种优化用户体验的重要技术,尤其对于图片密集型的应用,如电商、社交或游戏类小程序。"wxapp-preload"是专门为微信小程序设计的一个图片预加载解决方案,它能帮助开发者在用户...
tempImg.src属性可以在后台加载这张图片到本地缓存实现预加载