• dom元素分屏加载


      载入一个内容较多的页面的时候,如果不做任何处理,则会在一开始就把全部内容加载出来,影响了性能和体验,所以现在常用分屏加载的功能,就是dom内容出现在屏幕可视范围内的时候,再加载dom节点,起到优化的作用。

      我在项目中用的是textarea,原理就是把需要滚动加载的dom内容放进一个textarea里,然后用一个容器包裹住,当这部分内容高度出现在屏幕中的时候,就释放出textarea中的值append到容器中,实现滚动加载。

      代码不多,js部分就两个函数,直接上代码吧:

      完整版去github看: demo

    //定义空间命名
        var GLOBAL = {};  //window
        $(function () {
            GLOBAL.lazyLoad = {
                //循环每一个指定textarea,如果在可见区域就写入html,如果有回调函数执行回调函数
                eachElem: function ($elem, scollTop, windowH, callback) {
                    $elem.each(function (index, el) {
                        var $this = $(el);
                        var elemTop = $this.parent().offset().top;
                        var htmls = $this.text();
    
                        if ((elemTop > scollTop - 100) && (elemTop - scollTop < windowH)) {  //容器出现在屏幕可视范围的时候
                            if ($this.data("addYet") != 1) {
                                $this.parent().append((htmls));   //容器添加textarea释放出的html
                                $this.data("addYet", "1");
    
                                if (callback && $.type(callback) == "function") {  //如果该html是绑定了js功能的,则传入绑定函数名,比如轮播等,或者其他第三方插件等等
                                    callback(htmls, $this.parent());
                                }
                            }
                        }
                    });
                },
                //动态创建dom元素
                creatEle: function (targetElm, callback) {
                    var $elem = $.type(targetElm) == "string" ? $(targetElm) : $("textarea.js_addToDom"),
                            $window = $(window),
                            windowH = $window.height(),
                            that = this;
                    var _blank = null;
                    that.eachElem($elem, $window.scrollTop(), windowH, callback);
    
                    $window.scroll(function () {   //滚动时检测
                        var scrollTop = $(this).scrollTop();
    
                        if (_blank) {
                            clearTimeout(_blank);
                        }
                        _blank = setTimeout(function () {   //加载dom
                            that.eachElem($elem, scrollTop, windowH, callback);
                        }, 300);
                    });
                }
            }
            GLOBAL.lazyLoad.creatEle("textarea.img_load");   //绑定需要加载的内容
        });

    html部分:

    <img src="img/a1.jpg" alt=""/><br/>
    <img src="img/a1.jpg" alt=""/><br/>
    <img src="img/a1.jpg" alt=""/><br/>
    
    <div class="wrap">
        <textarea class="img_load none">
            <img src="img/a1.jpg" alt=""/><br/>
        </textarea>
    </div>

    当容器wrap出现在可视范围内后,则会释放textarea中的内容,添加进wrap,起到加载作用.

    GLOBAL.lazyLoad.creatEle("textarea.img_load");绑定,如果有js功能,则需要传入第二个参数绑定函数,比如轮播插件flexslider:

    function initBuyerShowImg(htmls, $warp) {
                $warp.flexslider({
                    namespace: "",
                    animation: "slide",
                    selector: ".slider > li",
                    pauseOnAction: false,
                    itemWidth: 150,
                    controlNav: false,
                    animationLoop: false
                });
            }
    
            GLOBAL.lazyLoad.creatEle("textarea.js_buyShowslide", initBuyerShowImg);

    html:

    <!--轮播-->
    <div class="buyer-show-slide">
        <a href="javascript:;" rel="nofollow" target="_blank" class="buyer-show-cover"></a>
        <textarea class="js_buyShowslide none">
            <ul class="slider">
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
                <li><a href="javascript:;"><img src="img/flower.jpg" height="210" rel="nofollow"/></a></li>
            </ul>
        </textarea>
    </div>

    差不多就这样啦,挺简单的。

  • 相关阅读:
    获取exe和dll里面的资源
    [C++] 反编译器
    再一次利用with as 优化SQL
    编码指南:寻找科学中的艺术
    对手机支付安全机制的思考
    用adblock过滤页面上固定位置的悬浮窗
    git卡在Resolving deltas 100%的解决办法
    十字路口的程序员
    hdu 2555
    hdu 1864
  • 原文地址:https://www.cnblogs.com/vvic/p/6567915.html
Copyright © 2020-2023  润新知