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

javascript图片浏览器的核心——图片预加载

阅读更多
http://www.blogjava.net/sinoly/archive/2007/09/14/145161.html
   javascript图片浏览器的核心——图片预加载
网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考虑流量的话,大可以像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对象
    };
};
经过这么一番折腾,总算是让各个浏览器都能满足我们的目标了。虽然代码很简单,但是却把图片浏览器中最核心的问题解决掉了,接下来你所要做的,仅仅是图片如何呈现的问题了。
分享到:
评论

相关推荐

    图片浏览器——JS

    【图片浏览器——JS】是一种基于JavaScript技术实现的用于展示和浏览图片的应用程序。在网页设计中,图片浏览器常被用来创建交互式的图片展示效果,如幻灯片展示、图片轮播等,为用户提供友好的浏览体验。在这个项目...

    js浏览器可视范围图片加载.rar

    这种技术允许网页只在用户实际看到的区域,即浏览器可视范围内加载图片,而不是一次性加载所有图片。这样可以显著减少初次页面加载时的数据量,提高页面加载速度,进而改善用户浏览体验。 图片懒加载的核心原理是...

    图片浏览器DEMO

    在性能方面,考虑到大量图片的处理可能会消耗大量系统资源,DEMO可能采用了内存管理和图片预加载策略。对于大图,可能使用了分块加载技术,只加载当前显示部分,其余部分在需要时再加载。这样的设计有助于减少内存...

    jquery图片加载动画——queryloader2

    QueryLoader2的主要功能是通过预加载页面上的图片,并在加载过程中显示自定义的加载动画。这不仅能够告知用户页面正在加载,还能避免用户看到未完全加载的页面,从而提高网站的专业性和用户体验。 使用QueryLoader2...

    js 利用image对象实现图片的预加载提高访问速度

    一些浏览器试图通过在本地缓存中保存这些图片来解决此问题。这样一来可以顺序调用这些图片——但对于首次使用这些图片的时候仍然会存在延时。预装载就是一种在需要图片之前就将图片下载到缓存的技术。采用这样的...

    网页模板——javascript 图片查看器(可缩放、旋转、翻转).zip

    2. **图片加载与显示**:JavaScript 可以通过`&lt;img&gt;`标签或者创建`Image`对象来加载图片,并根据需要显示或隐藏。在图片查看器中,通常会预先加载图片,以便在用户请求时快速响应。 3. **DOM操作**:Document ...

    如何关闭浏览器的资代码——世界之窗

    5. **调整图片和多媒体设置**:在浏览器设置中,可以控制是否加载图片和视频等多媒体内容。禁用这些可以加快页面加载速度,但可能导致部分功能无法正常使用。 6. **使用开发者工具**:"世界之窗"提供开发者工具,...

    jQuery图片预加载代码ydxLazyLoad.js插件

    本文将详细介绍基于jQuery的图片预加载插件——ydxLazyLoad.js。 ### 1. 图片延迟加载(懒加载) 懒加载(Lazy Load)是一种优化网页性能的技术,它只加载视窗内或接近视窗的图片,当用户滚动页面时,再加载其他...

    网页模板——纯javascript仿做土豆网豆单列表载入图片特效.zip

    此外,可能还涉及到图片的预加载技术,确保图片在用户滚动到视窗范围内时已经准备就绪,避免延迟和卡顿。 土豆网的“豆单”是一个视频集合的概念,这里的“豆单列表”可能是指一系列包含图片和标题的条目,每个条目...

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

    而现代Web 2.0应用倾向于使用JavaScript预加载图片,利用浏览器缓存机制提前下载图片,并在需要时直接显示,避免等待时间。 在实现图片预加载的JavaScript代码中,通常会使用Image对象,这是一个内置的JavaScript...

    imagesee

    **JavaScript的图片浏览器——深入解析"imagesee"** 在当今互联网世界中,图像处理和展示是不可或缺的一部分。JavaScript,作为浏览器端最常用的脚本语言,为开发者提供了丰富的功能来实现各种交互式的图像浏览体验...

    图片懒加载

    1. **预加载**:对于关键的图片,如首屏图片,可以在页面加载时预先加载。 2. **使用WebP或JPEG 2000格式**:这些格式能提供更好的压缩效果,减小图片大小,进一步提高加载速度。 3. **异步加载**:避免阻塞主线程,...

    javascript经典特效---广告图片的放置.rar

    通过JavaScript,我们可以实现广告图片的自动化管理,例如自动轮播、手动点击切换、预加载下一张图片等功能,从而提高网页的互动性和视觉吸引力。 【标签】:“Javascript” 【知识点】: 1. **DOM操作**:...

    MovingBoxes实现汽车图片展示,键盘方向键也可以操作左右切换,兼容主流浏览器.rar

    4. 图片加载优化:可能涉及预加载技术,以确保图片在切换时能够快速显示,减少延迟感。 5. 响应式设计:为了兼容不同尺寸的屏幕和浏览器,可能采用了媒体查询或Flexbox/Gird布局等技术。 6. 浏览器兼容性:可能使用...

    基于移动浏览器的HTML5核心技术的研究及其应用

    这种离线存储对于教育领域的e-learning应用特别有益,学生可以在没有网络的环境下继续学习,如观看预加载的视频教程,访问离线阅读材料等。 3. 应用场景与优势 HTML5的离线存储技术提高了移动应用的可用性和用户...

    Android源码——网页浏览器源码.zip

    11. **性能优化**:包括预加载技术、资源加载优先级设定、内存管理等,都是提升浏览器性能的关键。 12. **第三方库集成**:为了增强功能,如广告拦截、下载管理等,开发者可能会集成第三方库,如AdBlocker或...

    增加在天猫商品评价页显示原图及图片旋转操作功能

    2. **图片预加载(Preloading)**:当用户需要查看原图时,可以先预加载图片,减少点击后等待的时间。预加载可以通过JavaScript的`Image`对象实现,创建一个新的`Image`实例并设置其`src`属性为原图URL,这样图片就...

    安卓Android源码——DroidBrowser浏览器.zip

    8. **性能优化**:如缓存机制、内存管理、页面预加载等,这些都是提高浏览器性能的重要方面。 9. **用户交互**:如手势操作、下拉刷新、滑动切换页面等,这些都需要通过监听器和触摸事件来实现。 10. **安全考虑**...

    js中Image对象以及对其预加载处理示例

    预加载图片时,需要注意浏览器缓存的影响。某些浏览器可能会缓存图片,使得一旦加载过的图片再次请求时不会再发起新的HTTP请求,而是直接从缓存中取。因此,需要一种方法判断图片是否真的被加载到浏览器中。可以使用...

    VR探索之——aframe框架 在浏览器显示全景照片

    【标题】"VR探索之——aframe框架 在浏览器显示全景照片"揭示了如何利用Web技术展示虚拟现实(VR)内容,特别是通过aframe框架在浏览器上实现全景照片的展示。aframe是Mozilla开源的一个WebVR框架,它基于HTML,使得...

Global site tag (gtag.js) - Google Analytics