欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS(二十三)懒加载

程序员文章站 2022-04-17 08:13:23
...
/*

 * jQuery plugin: Lazy ajax loader.

 * Updated: 2017.10.25

 */

(function ($, window) {

    if (!$.fn.LazyAjax) {

        /*

         * url: ajax 发送请求的地址

         * param: 发送到服务器的JSON数据, 将转换为字符串格式。

         * successFunc: 请求成功返回的回调函数。

         * errorFunc: 请求出错时的回调函数。

         */

        $.fn.LazyAjax = function (url, param, successFunc, errorFunc) {

            var _self = $(this);



            /// 判断元素是否在窗口中

            var insideWindow = function ($el) {

                var scrollTop = $(window).scrollTop();

                var windowHeight = $(window).height();



                return (scrollTop < $el.offset().top + $el.outerHeight() && scrollTop + windowHeight > $el.offset().top);

            };



            /// 如果元素在窗口中且尚未载入数据则调用ajax载入数据

            var loadElement = function () {

                _self.each(function () {

                    if (insideWindow($(this))) {

                        if (!$(this).attr('data-status') || $(this).attr('data-status') === 'failed') {

                            var _this = $(this);



                            $.ajax({

                                url: url,

                                type: 'POST',

                                contentType: 'application/json',

                                dataType: 'json',

                                data: JSON.stringify(param),

                                beforeSend: function () {

                                    _this.attr('data-status', 'loading');

                                },

                                success: function (response) {

                                    if (response.result === 0) {

                                        _this.attr('data-status', 'loaded');

                                        successFunc.call(this, response);

                                    }

                                    else {

                                        _this.attr('data-status', 'failed');

                                        errorFunc.call(this);

                                    }

                                },

                                error: function () {

                                    _this.attr('data-status', 'failed');

                                    errorFunc.call(this);

                                }

                            })

                        }

                    }

                })

            };



            var debounce = function (func, wait, immediate) {

                var timeout;

                return function () {

                    var context = this, args = arguments;

                    var later = function () {

                        timeout = null;

                        if (!immediate) {

                            func.apply(context, args);

                        }

                    };

                    if (immediate && !timeout) {

                        func.apply(context, args);

                    }

                    clearTimeout(timeout);

                    timeout = setTimeout(later, wait);

                };

            };



            loadElement();

            $(window)

                .on('scroll', debounce(loadElement, 300, !1))

                .on('resize', debounce(loadElement, 300, !1));

        };

    }

})(jQuery, window);

相关标签: javascript 前端