前端优化方法集锦--bigrender

- 如何加快首屏内容展现速度

思路是一次性读出所有文档,但是将不需要第一屏展现的内容放在textarea标签中,判断屏幕滚动,当该内容的容器出现在可视范围,则取出textarea标签中的内容,渲染到dom树中。

   var topics = {};
jQuery.Topic = function(id) {
    var callbacks,
        method,
        topic = id && topics[id];
    if (!topic) {
        callbacks = jQuery.Callbacks();
        topic = {
            publish: callbacks.fire,
            subscribe: callbacks.add,
            unsubscribe: callbacks.remove
        };
        if (id) {
            topics[id] = topic;
        }
    }
    return topic;
};


(function($) {
    $.fn.bigrender = function(opts) {

        var winHeight = document.documentElement.clientHeight;
        var sum = 0;
        var count = 0;
        var flash = [];

        // 'class' 是textarea父节点的类;'textarea' 是textarea标签的类;'threshold'是距离进入屏幕还有150像素就开始渲染;'remove'是否删除textarea标签       
        options = $.extend({
            'class': '.render',
            'textarea': 'textarea',
            'threshold': 150,
            'remove': true
        }, opts);

        $brenders = $(options['class']);
        // 渲染首屏的内容
        initBigrender();
        // 绑定滚动条事件
        scrollDisplay();


        // 函数定义
        function initBigrender() {
            $brenders.each(function(n, object) {
                sum++;
                if (isRender($(this))) {
                    display($(this));
                    count++;
                    flash[n] = true;
                } else {
                    flash[n] = false;
                }
            });
        }

        // 判断时候需要渲染
        function isRender(object) {
            offsetTop = object.offset().top;
            ojh = object.outerHeight(true);
            st = Math.max(document.body.scrollTop || document.documentElement.scrollTop);

            if (offsetTop + ojh + options.threshold >= st && offsetTop - options.threshold < (st + winHeight)) {
                return true;
            } else return false;

        }

        // 渲染textarea内的html代码
        function display(object) {
            $display = object.find(options.textarea).eq(0);
            if (options.remove) {
                object.append($display.val());
                $display.remove();
            } else {
                object.append($display.val());
            }
            $.Topic('dom_render').publish(object);
        }

        // 屏幕绑定滚动条事件,当待渲染的内容进入可视屏幕就触发isRender函数
        function scrollDisplay() {
            $(window).scroll(function(event) {
                event.preventDefault();
                if (count < sum) {
                    $brenders.each(function(n, object) {
                        if (flash[n] === false) {
                            if (isRender($(this))) {
                                display($(this));
                                count++;
                                flash[n] = true;
                            } else {
                                flash[n] = false;
                            }
                        }
                    });
                }
            });
        }
    };
})(jQuery);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值