js滚动加载

背景

移动web开发中,为了加快响应速度,通常在服务端输出首屏页面,动态异步加载listview。而对于包含大量图片的listview,一起加载将耗费大量http请求,进而影响响应速度。滚动加载这时就可以成为一种可选的优化方案。

要点

  • 生成的img标签用一个属性存储图片地址而不是用src
  • document.images 获取当前img标签
  • isInSight: 是否有元素处于当前可视区域内
  • window.addEventListener(‘scroll‘, lazyLoad, false); 监听滚动事件

代码

<!-- lang: js -->
_initScrollEvent: function() {
        var self = this;
        var lazyLoad = self.lazyLoad = function() {

            var imgs = self._getLazyLoadImages();

            imgs.forEach(function(img) {

                if (self._isInSight2(img)) {                        
                    //图片如果出错,则用默认图代替
                    img.addEventListener(‘error‘, function() {
                        img.src = ‘http://cache.500boss.com/mobile/touch/images/leyuan/no_img.png‘
                    })
                    img.src = img.getAttribute(‘osrc‘)
                }
            })
        }
        window.addEventListener(‘scroll‘, lazyLoad, false);
        //try load first page of  imgs
        self._initFirstLoad();
    },

    _initFirstLoad: function() {
        //标签如果附加到body上面,子节点可能对应属性没有添加进来
        //默认执行一次,延迟
        var self = this;
        var interval = setInterval(function() {
            var imgs = self._getLazyLoadImages();
            if (imgs.length) {
                clearInterval(interval);
                self.lazyLoad();
            }
        }, 1)
    },

    _isInSight2: function(el) {
        var top = el.offsetTop;
        var left = el.offsetLeft;
        var width = el.offsetWidth;
        var height = el.offsetHeight;

        while (el.offsetParent) {
            el = el.offsetParent;
            top += el.offsetTop;
            left += el.offsetLeft;
        }

        return (
        top < (window.pageYOffset + window.innerHeight) &&
        left < (window.pageXOffset + window.innerWidth) &&
        (top + height) > window.pageYOffset &&
        (left + width) > window.pageXOffset
        );
    },

    //得到未加载的待lazy图片
    _getLazyLoadImages: function() {
        var self = this;

        var lazyImages = [].filter.call(document.images, function(img) {
            return !!img.getAttribute(‘osrc‘) && img.getAttribute(‘osrc‘).length && (!img.getAttribute(‘src‘) || img.getAttribute(‘src‘).length == 0);
        });
        return lazyImages;
    }

补充

如果在图片未加载成功的时候有一个类似“加载中”的默认图,可以把img包在div,div设置背景加载图作为默认图,等真正图片加载成功就刚好覆盖刚才的背景加载图

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。