设计模式(节流模式-----图片懒加载)

昨天把节流模式写了下,今天来个节流模式的应用----图片懒加载(图片延迟加载)

废话不多说,直接懒加载代码吧!哈哈

 1            //创建懒加载对象 @id是将要获取外部容器的id               var Lazyload = function(id) {
 2                 this.container = document.getElementById(id);
 3                 this.imgs = this.getImgs();
 4                 this.init();//初始化
 5             }
 6             Lazyload.prototype = {
 7                 //初始化
 8                 init: function() {
 9                     this.update(); //进行首次图片位置判断
10                     this.bindEvent(); //添加事件
11                 },
12                 //获取图片数据
13                 getImgs: function() { //获取到的图片对象放入数组中
14                     var arr = [];
15                     var imgs = this.container.getElementsByTagName(‘img‘);
16                     for(var i = 0, len = imgs.length; i < len; i++) {
17                         arr.push(imgs[i]);
18                     }
19                     return arr;
20                 },
21                 //对图片进行处理操作
22                 update: function() {
23                     if(!this.imgs.length) return;
24                     var i = this.imgs.length;
25                     for(i--; i >= 0; i--) {
26                         if(this.shouldShow(i)) {
27                             this.imgs[i].src = this.imgs[i].getAttribute("data-src");
28                             this.imgs.splice(i, 1);//获取后删除数组中的图片
29                         }
30                     }
31                 },
32                 //判断图片位置
33                 shouldShow: function(i) {
34                     var img = this.imgs[i];
35                     scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//滚动高度
36                     scrollBottom = scrollTop + document.documentElement.clientHeight; //获取页面底部高度
37                     imgTop = this.pageY(img);
38                     imgBottom = imgTop + img.offsetHeight;
39                     if((imgTop > scrollTop && imgTop < scrollBottom) || (imgBottom > scrollTop && imgBottom < scrollBottom)) {
40
41                         return true;
42                     } else {
43                         return false;
44                     }
45                 },
46                 //获取图片距离页面顶部距离
47                 pageY: function(ele) {
48                     if(ele.offsetParent) {
49                         return ele.offsetTop + this.pageY(ele.offsetParent);
50                     } else {
51                         return ele.offsetTop;
52                     }
53                 },
54                 //绑定事件
55                 bindEvent: function() {
56                     var that = this;
57                     that.on(window, "scroll", function() {
58                         //that.update();
59                         throttle(that.update, {
60                             context: that
61                         })
62                     });
63                     that.on(window, function() {
64                         //that.update();
65                         throttle(that.update, {
66                             context: that
67                         })
68                     })
69                 },
70                 //监听
71                 on: function(ele, type, fn) {
72                     if(ele.addEventListener) {
73                         ele.addEventListener(type, fn, false)
74                     } else {
75                         ele.attachEvent("on" + type, fn)
76                     }
77                 }
78             }

结果展示:

延迟前显示默认图片

延迟结果

完整代码:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #con div {
                width: 300px;
                height: 200px;
                overflow: hidden;
                margin: auto;
            }

            img {
                width: 100%;
                height: 100%;
            }
        </style>
    </head>

    <body>
        <div id="con">
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img5.imgtn.bdimg.com/it/u=2033765348,1346395611&fm=206&gp=0.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1209/10/c1/13758581_1347257278695.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img5.imgtn.bdimg.com/it/u=2033765348,1346395611&fm=206&gp=0.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img5.imgtn.bdimg.com/it/u=2033765348,1346395611&fm=206&gp=0.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://pic32.nipic.com/20130814/13162234_111708002000_2.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img5.imgtn.bdimg.com/it/u=3704303780,566844591&fm=206&gp=0.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img5.imgtn.bdimg.com/it/u=2033765348,1346395611&fm=206&gp=0.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://www.bz55.com/uploads/allimg/141202/139-141202103039.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1209/10/c1/13758581_1347257278695.jpg" /></div>
            <div><img src="https://placeholdit.imgix.net/~text?txtsize=28&txt=300×200&w=300&h=200" data-src="http://pic32.nipic.com/20130814/13162234_111708002000_2.jpg" /></div>
        </div>
        <div style="height: 500px;background: red;position: relative;padding:1px;display: block;">
            <div id="a" style="margin-top: 10px;background: yellow; height: 100px;"></div>
        </div>
        <script>
            var extend = function(olds, news) {
                for(var index in news) {
                    olds[index] = news[index];
                }
                return olds;
            }
            var throttle = function() {
                var isClear = arguments[0],
                    fn;
                if(typeof isClear === "boolean") {
                    fn = arguments[1];
                    fn.__throttleID && clearTimeout(fn.__throttleID);
                } else {
                    fn = isClear;
                    param = arguments[1] || [];
                    var p = extend({
                        context: null,
                        args: [],
                        time: 300
                    }, param);
                    arguments.callee(true, fn);
                    fn.__throttleID = setTimeout(function() {
                        fn.apply(p.context, p.args)
                    }, p.time)
                }
            }
            var Lazyload = function(id) {
                this.container = document.getElementById(id);
                this.imgs = this.getImgs();
                this.init();
            }
            Lazyload.prototype = {
                //初始化
                init: function() {
                    this.update(); //进行首次图片位置判断
                    this.bindEvent(); //添加事件
                },
                //获取图片数据
                getImgs: function() {
                    var arr = [];
                    var imgs = this.container.getElementsByTagName(‘img‘);
                    for(var i = 0, len = imgs.length; i < len; i++) {
                        arr.push(imgs[i]);
                    }
                    return arr;
                },
                //对图片进行处理操作
                update: function() {
                    if(!this.imgs.length) return;
                    var i = this.imgs.length;
                    for(i--; i >= 0; i--) {
                        if(this.shouldShow(i)) {
                            this.imgs[i].src = this.imgs[i].getAttribute("data-src");
                            this.imgs.splice(i, 1);
                        }
                    }
                },
                //判断图片位置
                shouldShow: function(i) {
                    var img = this.imgs[i];
                    scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
                    scrollBottom = scrollTop + document.documentElement.clientHeight;
                    imgTop = this.pageY(img);
                    imgBottom = imgTop + img.offsetHeight;
                    if((imgTop > scrollTop && imgTop < scrollBottom) || (imgBottom > scrollTop && imgBottom < scrollBottom)) {

                        return true;
                    } else {
                        return false;
                    }
                },
                //获取图片距离页面顶部距离
                pageY: function(ele) {
                    if(ele.offsetParent) {
                        return ele.offsetTop + this.pageY(ele.offsetParent);
                    } else {
                        return ele.offsetTop;
                    }
                },
                //绑定事件
                bindEvent: function() {
                    var that = this;
                    that.on(window, "scroll", function() {
                        //that.update();
                        throttle(that.update, {
                            context: that
                        })
                    });
                    that.on(window, function() {
                        //that.update();
                        throttle(that.update, {
                            context: that
                        })
                    })
                },
                //监听
                on: function(ele, type, fn) {
                    if(ele.addEventListener) {
                        ele.addEventListener(type, fn, false)
                    } else {
                        ele.attachEvent("on" + type, fn)
                    }
                }
            }
            window.onload = function() {
                new Lazyload("con")
            }
        </script>
    </body>

</html>
时间: 2024-12-13 03:53:46

设计模式(节流模式-----图片懒加载)的相关文章

图片懒加载库echo.js源码学习

最近不是在学习设计模式吗,然后就看到了代理模式加载图片的样例,然后自己实现了一下,就发现,自己写的这货每次就只能加载一张图片,而且图片要放在哪也是个很严重的问题 然后就去了 gayhub 找了找了找流行的图片懒加载库,这一找,就找到了一个echo.j是,打开一看,源码只有100多行吧,震惊..,看完源码,哎,木有上代理模式呀 仔细学习了下源码:觉得这种做法比较适合图片位置确定场景的吧,比如文章啊,一篇文章老长了,里面有蛮多图片散落在不同的地方,这样就比较合适,有可能有很多图片读者都不会翻到哪里,

js图片懒加载

<script type="text/javascript"> var lazyLoad = { // 获取元素到页面顶部的距离 getoffsetTop: function(elem){ var offTop = 0; while(elem != null){ offTop += elem.offsetTop; // 获取元素到其上一级元素顶部的距离 elem = elem.offsetParent; // 元素的上一级元素 } return offTop; }, //

原生js实现图片懒加载

原理: 将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自定义命名,我自己用data-src)属性指向真实的图片. src指向一张默认的图片,否则当src为空时也会向服务器发送一次请求.可以指向loading的地址. 代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title&

Python网络爬虫之图片懒加载技术、selenium和PhantomJS

一.什么是图片懒加载? - 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agen

爬虫之图片懒加载技术、selenium和PhantomJS

图片懒加载 selenium phantomJs 谷歌无头浏览器 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmei

爬虫之 图片懒加载, selenium , phantomJs, 谷歌无头浏览器

一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

爬虫学习 08.Python网络爬虫之图片懒加载技术、selenium和PhantomJS

爬虫学习 08.Python网络爬虫之图片懒加载技术.selenium和PhantomJS 引入 今日概要 图片懒加载 selenium phantomJs 谷歌无头浏览器 知识点回顾 验证码处理流程 今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import

实现图片懒加载(lazyload)

本文标题:实现图片懒加载(lazyload)文章作者:Jake发布时间:2016-11-26, 18:46:34最后更新:2016-11-28, 17:12:59原始链接:http://i.jakeyu.top/2016/11/26/实现图片懒加载/许可协议: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者. 懒加载的意义(为什么要使用懒加载) 对页面加载速度影响最大的就是图片,一张普通的图片可以达到几M的大小,而代码也许就只有几十KB.当页面图片很多时,页面的加载速