javascript图片加载---加载大图的一个解决方案

网页在加载一张大图片时,往往要加载很久;

而且,在加载过程中,无法很好地控制图片的样式,容易造成错位等显示错误;

如果能够在加载大图时,先使用一张较小的loading图片占位,然后后台加载大图片,当大图片加载完成后,自动替换占位图,

这样能提供更好的用户体验;

由于,我在开发一个图片查看器时,遇到这样的需求,所以我写了个angular服务,来解决这个问题,效果还不错;

虽然是angular服务,当是把里面核心代码抽出来也可以单独使用;

来分享下源代码:

一:

    var imgloader = new Object();
        imgloader.placeholder = new Image();

imgloader是主要的对象

placeholder 用于存储占位图片

二:

        imgloader.init = function(placeholderPath,width,height){
            imgloader.placeholder.src = placeholderPath;
            imgloader.placeholder.width = width;
            imgloader.placeholder.height = height;
        }

init是imgloader的初始化方法,主要指定了占位图片的文件,已经它的宽高;

设置宽高的目的是为了在占位图还未加载完成时也能进行布局

三:

imgloader.load = function(imgElem,imgSrc,callback){
        //清除之前的onload函数
        if(imgElem.lastload){
            imgElem.lastload.onload = function(){};
        }
        loadok = false;
        var testImg = new Image();
            testImg.src = imgSrc;
        if(testImg.complete == true){
           imgElem.src = testImg.src;
           imgElem.width = testImg.naturalWidth;
           if(imgElem.hasAttribute("height")){
               imgElem.removeAttribute("height");
           }
        }else{
           imgElem.src = imgloader.placeholder.src;
           imgElem.width = imgloader.placeholder.width;
           imgElem.height = imgloader.placeholder.height;
           //只读属性
//               imgElem.naturalWidth = imgElem.width;
//               imgElem.naturalHeight = imgElem.height;
//               console.log(imgElem.naturalWidth+"|"+imgElem.naturalHeight);
           //绑定onload函数
           testImg.onload = function(){
               imgElem.src = testImg.src;
               imgElem.width = testImg.naturalWidth;
               if(imgElem.hasAttribute("height")){
                   imgElem.removeAttribute("height");
               }
                if(callback){
                    callback();
                }
           };

           imgElem.lastload = testImg;
//           imgloader.loadingArray.push(imgElem);
        }
    };

1.一开始,如果对同一个图片元素设置了多个load,则只有最后一个生效,之前的都会被替换;

2.使用大图的src设置一个img做测试,如果这张图片已经加载过了,那就直接设置上这张大图;

3.注意这里我还原了被设置元素的宽高,为的是避免被设置元素的宽高收到占位符宽高的影响;

4.小技巧:设置完width后,把height属性移除的话,height会自适应width

5.如果testImg(大图)未加载完成,则先用占位图代替,注意被设置图片的宽高被修改成与占位图相同的大小;

6.为testImg(大图)绑定onload函数,当大图加载完成后,被设置元素的src替换成大图的src,并恢复大图的框高;

7.有设置回调的,可以在回调中再做些事情;

8.设置这个imgElem已经绑定一个大图(再次绑定的话,这个会被消去)

9.小技巧:naturalWidth与naturalHeight是只读属性

四:

一个例子:

<html>
    <head>
        <meta charset="utf-8">
		<meta name="viewport" content="width=device-width,initial-scale=1.0">
        <style>
            img{
                max-width: 100%;
            }
            #img1{
                width:  200px;
                height: 200px;
            }
            #img2{
                width: 200px;
                height: 200px;
            }
        </style>
    </head>
    <body>
        <img id="img1">
        <img id="img2">
        <script src="mikuImgLoader3.0.js"></script>
        <script>
            imgloader.init("dokidoki.gif",200,200);
            imgloader.load(img1,"001.jpg");
            imgloader.load(img2,"002.jpg");
        </script>
    </body>
</html>

例子中可以看出:还可以用css控制被设置图片的大小

五:

完整代码:

//miku图片加载器3.0
var imgloader = new Object();
    imgloader.placeholder = new Image();
//    imgloader.loadingArray = new Array();

    imgloader.init = function(placeholderPath,width,height){
        imgloader.placeholder.src = placeholderPath;
        imgloader.placeholder.width = width;
        imgloader.placeholder.height = height;
    };
    imgloader.load = function(imgElem,imgSrc,callback){
        //清除之前的onload函数
        if(imgElem.lastload){
            imgElem.lastload.onload = function(){};
        }
        var testImg = new Image();
            testImg.src = imgSrc;
        if(testImg.complete == true){
           imgElem.src = testImg.src;
           imgElem.width = testImg.naturalWidth;
           if(imgElem.hasAttribute("height")){
               imgElem.removeAttribute("height");
           }
        }else{
           imgElem.src = imgloader.placeholder.src;
           imgElem.width = imgloader.placeholder.width;
           imgElem.height = imgloader.placeholder.height;
           //只读属性
//               imgElem.naturalWidth = imgElem.width;
//               imgElem.naturalHeight = imgElem.height;
//               console.log(imgElem.naturalWidth+"|"+imgElem.naturalHeight);
           //绑定onload函数
           testImg.onload = function(){
               imgElem.src = testImg.src;
               imgElem.width = testImg.naturalWidth;
               if(imgElem.hasAttribute("height")){
                   imgElem.removeAttribute("height");
               }
                if(callback){
                    callback();
                }
           };

           imgElem.lastload = testImg;
//           imgloader.loadingArray.push(imgElem);
        }
    };
//    //清除加载队列的所有onload函数
//    function clearOnload(loadingArray){
//        for(var i=0;i<loadingArray.length;i++){
//            var loading = loadingArray[i];
//            loading.onload = function(){};
//        }
//    };



时间: 2024-10-09 14:35:08

javascript图片加载---加载大图的一个解决方案的相关文章

Javascript图片的懒加载与预加载

1. 缓载.预载的概念 这些技术不仅限于图片加载,但我们首先讨论最常用的图片加载. 缓载:延迟加载图片或符合某些条件时才加载某些图片. 预载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载.缓载对服务器前端有一定的缓解压力作用,预载则会增加服务器前端压力. 2. 缓载的意义与实现 缓载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 主要体现在三种模式上: 第一种是纯粹的延迟加载,使用setTimeOut

Javascript图片轮播效果一秒换一个

/*增加一秒换一个的功能/运用定时器的用法. <html> <head> <meta charset="utf-8"> <style type="text/css"> body,div,ul,li,img{ margin: 0px; padding: 0px; } #menu{ width: 496px; margin: auto; } #head{ border: 1px solid blue; } #head im

再谈javascript图片预加载技术

图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展示出来,所以lightbox显示的图片的速度体验要比直接输出的差很多,而本文说提到的预加载技术主要针对获取图片尺寸. 一段典型的使用预加载获取图片大小的例子: var imgLoad = function (url, callback) {    var img = new Image();   

Javascript图片预加载详解

预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS.JavaScript及两者的各种组合.这些技术可根据不同设计场景设计出相应的解决方案,十分高效.

浅谈android中加载高清大图及图片压缩方式(二)

这一讲就是本系列的第二篇,一起来聊下关于android中加载高清大图的问题,我们都知道如果我们直接加载原图的话,一个是非常慢,需要等待一定时间,如果没有在一定的时间内给用户响应的话,将会极大影响用户的体验.另一个是如果你的手机内存小的话,可能会直接崩溃.这也就是直接加载高清原图问题.遇到这些问题很容易想到的一点就是图片压缩,本篇文章也就是讲述图片压缩方式来实现加载高清大图的效果.但是现在问题就来了,通过上篇博客我们知道,手机的分辨率有很多,如何保证我同一张图片在不同分辨率的手机上能适当的压缩比例

JavaScript判断图片是否已经加载完毕的方法汇总

在网上有很多关于判断图片是否已经加载完毕的文章,但是有的浏览器并不适合,下面小编给大家分享一些有关JavaScript判断图片是否已经加载完毕方法汇总,具体内容如下所示: 一.onload事件 通过监听图片的onload事件,可以判断图片是否已经加载完成,兼容所有的浏览器(w3c推荐方法),代码示例如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!DOCTYPE html> <html lang="en"> <

ViewPager做图片浏览器,加载大量图片OOM的问题修正

1 /** 2 * @author CHQ 3 * @version 1.0 4 * @date 创建时间: 2016/7/26 17:18 5 * @parameter 6 * @return 7 * 图片查看器 8 * //可以查看网络图片 9 * //可以查看本地图片 10 */ 11 public class PhotoScan extends Activity { 12 private PhotoViewPager mViewPager; 13 private List<View>

js效果笔记:怎样实现图片的懒加载以及jquery.lazyload.js的使用

在项目中有时候会用到图片的延迟加载,那么延迟加载的好处是啥呢? 我觉得主要包括两点吧,第一是在包含很多大图片长页面中延迟加载图片可以加快页面加载速度:第二是帮助降低服务器负担. 下面介绍一下常用的延迟加载插件jquery.lazyload.js以及怎样实现一个延迟加载的插件. 一:jquery.lazyload.js插件 lazyload是jQuery写的延迟加载插件,在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 实现原理 首

实现图片的预加载和懒加载

延迟加载也称为惰性加载,即在长网页中延迟加载图像.用户滚动到它们之前,视口外的图像不会加载.这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快.在某些情况下,它还可以帮助减少服务器负载. 那么延迟加载有什么好处:1.提升用户的体验,避免出现卡顿现象.2.有选择性地请求图片,减少服务器的压力和流量,减小浏览器的负担. 实现方式:1.首先将页面上的图片的 src 属性设为 loading.gif,而图片的真实路径则设置在 data-src 属性中,页面滚动的时候计算图片的位置与滚动的位置,当