主页 > 前端 > javascript >
来源:自学PHP网 时间:2016-05-02 11:18 作者: 阅读:次
[导读] 图片预加载有点像lightbox类的效果,会自动在图片没有宽度与高度自动加载,这样等你要查看图片是就自动设置图片大小,这样可以让人感觉速度快了,下面我来介绍一下图片预加载...
项目开发中时常需要用 JS 判断一张图片是否加载成功,如果图片加载成功,则执行其相应的 onload 绑定事件, 这个就是我们所说的图片预加载技术,先上最终版代码: function loadImage(url, callback) { var img = new Image(); img.onload = function () { img.onload = null; callback(img); } img.src = url; } 经测试发现 IE6、IE7、IE8: 如果图片已经存于浏览器缓存中,那么再次对该图片发起请求时,浏览器就会直接从缓存中加载,这样就无法触发其 onload 事件。 而在 IE9、Chrome、FireFox: 无论图片是否存于浏览器缓存中,都会触发其 onload 事件。 所以上述代码中我们先要为 img 绑定 onload 事件,再为其赋值 src 地址! 上面的代码我们还可以进行优化,实际中会有一些兼容陷阱,如width与height检测各个浏览器的不一致,还有webkit new Image()建立的图片会受以处在加载进程中同url图片影响,经过反复测试后的最佳处理方式: // 更新: // 05.27: 1、保证回调执行顺序:error > ready > load;2、回调函数this指向img本身 // 04-02: 1、增加图片完全加载后的回调 2、提高性能 /** * 图片头数据加载就绪事件 - 更快获取图片尺寸 * @version 2011.05.27 * @author TangBin * @param {String} 图片路径 * @param {Function} 尺寸就绪 * @param {Function} 加载完毕 (可选) * @param {Function} 加载错误 (可选) * @example imgReady('hlogo_cn.png', function () { alert('size ready: width=' + this.width + '; height=' + this.height); }); */ var imgReady = (function () { var list = [], intervalId = null, // 用来执行队列 tick = function () { var i = 0; for (; i < list.length; i++) { list[i].end ? list.splice(i--, 1) : list[i](); }; !list.length && stop(); }, // 停止所有定时器队列 stop = function () { clearInterval(intervalId); intervalId = null; }; return function (url, ready, load, error) { var onready, width, height, newWidth, newHeight, img = new Image(); img.src = url; // 如果图片被缓存,则直接返回缓存数据 if (img.complete) { ready.call(img); load && load.call(img); return; }; width = img.width; height = img.height; // 加载错误后的事件 img.onerror = function () { error && error.call(img); onready.end = true; img = img.onload = img.onerror = null; }; // 图片尺寸就绪 onready = function () { newWidth = img.width; newHeight = img.height; if (newWidth !== width || newHeight !== height || // 如果图片已经在其他地方加载可使用面积检测 newWidth * newHeight > 1024 ) { ready.call(img); onready.end = true; }; }; onready(); // 完全加载完毕的事件 img.onload = function () { // onload在定时器时间差范围内可能比onready快 // 这里进行检查并保证onready优先执行 !onready.end && onready(); load && load.call(img); // IE gif动画会循环执行onload,置空onload即可 img = img.onload = img.onerror = null; }; // 加入队列中定期执行 if (!onready.end) { list.push(onready); // 无论何时只允许出现一个定时器,减少浏览器性能损耗 if (intervalId === null) intervalId = setInterval(tick, 40); }; }; })(); 调用方法 imgReady('hlogo_cn.png', function () { alert('size ready: width=' + this.width + '; height=' + this.height); }); 这样性能比第一个要好几十倍,大家不信可测试。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com