`
liboxlu
  • 浏览: 65072 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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对象
     };
};

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

相关推荐

    jquery图片预加载

    **jQuery图片预加载技术详解** 在网页开发中,图片预加载是一种优化用户体验的重要技术,尤其在Web和移动端,用户往往期望页面能快速显示并流畅运行。`jQuery`库以其简洁的API和强大的功能,成为实现图片预加载的...

    JS实现图片预加载

    "JS实现图片预加载" 图片预加载是指在浏览器中预先加载图片,以提高用户体验和减少流量消耗的一种技术。JS 实现图片预加载可以通过使用 Image 对象来实现图片的预下载,并且可以结合容器的宽和高,按照一定的缩放...

    图片预加载插件preloadjs

    **preloadjs 图片预加载插件详解** 在Web开发中,图片预加载是一项重要的优化技术,它可以提升用户体验,确保图片在需要时能够迅速显示。preloadjs 是一款强大的JavaScript库,专为实现资源预加载而设计,包括图片...

    图片预加载js

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

    JavaScript图片预加载代码,显示loading

    JavaScript图片预加载代码,显示loading! 值得下载看看!资源免费,大家分享!! 更多免费资源 http://ynsky.download.csdn.net/

    JavaScript图片预加载代码,显示loading.rar

    JavaScript图片预加载代码,显示loading.rarJavaScript图片预加载代码,显示loading.rarJavaScript图片预加载代码,显示loading.rarJavaScript图片预加载代码,显示loading.rarJavaScript图片预加载代码,显示...

    图片预加载特效

    图片预加载就是在用户看到图片前,利用JavaScript或其他技术提前下载图片,使得图片可以快速显示。 预加载主要有以下几种策略: 1. **同步预加载**:使用`&lt;img&gt;`标签的`src`属性预加载图片,这种方式是同步的,会...

    jquery.lazyload图片预加载效果 jquery预加载

    《jQuery LazyLoad 图片预加载技术详解》 在网页设计中,图片的加载速度往往直接影响着用户体验。当页面中包含大量图片时,如果一次性全部加载,可能会导致页面加载时间过长,用户需要等待,这无疑降低了网站的可用...

    jquery 预加载图片

    本话题主要围绕"jQuery 预加载图片"这一主题展开,我们将深入探讨jQuery库如何帮助开发者实现图片预加载功能。 jQuery是一个强大的JavaScript库,它简化了DOM操作、事件处理、动画制作以及Ajax交互等多个方面的工作...

    javascript图片预加载完整实例

    JavaScript图片预加载可以分为不同的方式,其中最常见的是使用JavaScript来创建一个Image对象,并将其src属性设置为要加载的图片地址,这种方式可以异步地下载图片而不会影响页面其他元素的加载。 在上述给出的实例...

    preload.js图片预加载插件

    图片预加载插件。包含有序加载和无序加载两种。具体使用方法,参考https://blog.csdn.net/yang1393214887/article/details/92582715

    图片预加载效果

    图片预加载技术是一种优化网页性能的方法,主要用于提升用户体验,尤其是对于图像密集型的网站或应用。当用户浏览网页时,预加载技术会提前加载部分或全部未来可能需要的图片资源,这样在用户实际查看这些图片时,...

    Jquery实例--图片预加载

    **jQuery图片预加载技术详解** 在网页设计中,图片预加载是一种优化用户体验的重要技术,它使得用户在浏览页面时能够快速地看到图片,避免了图片加载过程中出现的空白或者闪烁现象。本文将深入探讨如何使用jQuery来...

    js实现图片预加载.tx

    本文将详细探讨如何使用JavaScript实现图片预加载,并通过一个具体的示例代码来解析其实现过程。 #### 一、图片预加载的基本概念 图片预加载是指在用户请求页面时,预先加载页面中即将显示或可能需要的图片资源。...

    jQuery实现图片预加载

    **jQuery实现图片预加载** 在Web开发中,用户体验是一个至关重要的因素,而图片加载速度直接影响着用户对网站的第一印象。为了提升用户体验,开发者通常会采用图片预加载技术,确保图片在用户需要时能够快速显示。...

    理解Javascript图片预加载

    Javascript图片预加载的实现主要分为几种方法: 方法一:使用CSS和JavaScript实现预加载。此方法通过CSS的background属性将图片设置到屏幕外的背景中,利用浏览器缓存机制,实现图片的预加载。这种方法的优点是简单...

    JS图片预加载三种实现方法解析

    以下是三种常见的JS图片预加载方法的详细解析: 1. **基于事件监听的预加载** 这是最基础的预加载方法,通过创建`Image`对象并添加`load`事件监听器来实现。例如: ```javascript var img = new Image(); img....

    17行原生JS简洁图片预加载方案

    个人认为其实最初学习JavaScript最好找到简洁易懂的demo学习,但是往往搜索到一堆的插件,没有一定的js功底看的累,浪费时间,也很难学到什么干货。

Global site tag (gtag.js) - Google Analytics