向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)

/****
desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码
ajaxdata_url    ajax异步的URL 如data.php
page_val_name   ajax异步的URL中的页码参数名 如pageno
page_no         初始加载页码,默认1  [如2,则与前面两参数结合为data.php?pageno=2]
is_lazyload     是否开启懒加载
page_count      总页数
empty_msg       没有数据的时候提示(可传输图片)
ending_msg      最大页码显示提示
***/
$.fn.list_data = function (options) {
    //参数
    var This = $(this);
    var flag = false;//flag为false时为初次加载,防止不断加载
    var defaults = {
        ajaxdata_url: ‘‘,
        page_val_name: ‘current‘,
        page_no: 1,
        page_count: ‘‘,
        is_lazyload: true,
        loading_msg: ‘加载中...‘,
        empty_msg: ‘没有相关数据!‘,
        ending_msg: ‘没有更多数据了!‘
    };
    var opt = $.extend(defaults, options)

    //没有数据的提示语
    if (opt.page_count <= 0) {
        This.html("<div class=‘ui-no-msg‘>" + opt.empty_msg + "</div>");
        return true;
    }

    //获取页码,暂时不会用到
    var get_return_page = function () {
        /*var url = location.href;
        var page = ‘‘;
        if (url.indexOf("#") > 0) {
            var arr = url.split("#");
            var pagestr = arr[1];
            if (pagestr.indexOf("_") > 0) {
                var arr2 = pagestr.split("_");
                var page = arr2[0];
            }
        }
        if (page == ‘‘ || page == undefined) {
            return 1;
        } else {
            return page;
        }*/
        return opt.page_no;
    }

    //基础参数
    var page = get_return_page() * 1;
    var page_up = page;
    var page_down = page;

    //异步加载数据
    var loadmore = function (page, pos) {
        var loading = "<div class=‘ajax-loading‘>" + opt.loading_msg + "</div>";
        $.ajax({
            type: "GET",
            url: opt.ajaxdata_url + "&" + opt.page_val_name + "=" + page,
            beforeSend: function () {
                $(".ajax-loading").remove();
                $(".ui-no-msg").remove();
                if (pos == ‘before‘) {
                    $(loading).insertBefore(This);
                } else {
                    $(loading).insertAfter(This);
                }
                $(".ajax-loading").show();
                flag = true;
            },
            dataType: "html",
            error: function () {
                //This.html("<div class=‘ui-no-msg‘>数据异常,请刷新重试!</div>");
                $("<div class=‘ui-no-msg‘>数据异常,请刷新重试!</div>").appendTo(This);
                $(".ajax-loading").remove();
            },
            success: function (content) {
                flag = false;
                content = $.parseHTML(content);
                if (pos == ‘before‘) {
                    $(content).prependTo(This);
                } else {
                    $(content).appendTo(This);
                }
                $(".ajax-loading").remove();
                $(".ui-no-msg").remove();

                //是否开启懒加载
                if (opt.is_lazyload == true) {
                    lazyLoadImgs(This);
                }
            }

        });
    }

    //懒加载
    function lazyLoadImgs(e) {
        e.find("img").lazyload({
            effect: "show",
            event: "sporty"
        });
        var timeout = setTimeout(function () { e.find("img").trigger("sporty") }, 500);
    }

    //初始加载
    if (flag == false) {
        loadmore(page, ‘after‘);

        $(window).scroll(function () {
            var scrollTop = $(this).scrollTop();
            var scrollHeight = $(document).height();
            var windowHeight = $(this).height();

            //滚动到顶部
            if (scrollTop == 0) {
                if (page_up > 1) {
                    page_up--;
                    loadmore(page_up, ‘before‘);//如不需要向上滚动加载,则注释掉此行
                }
            } else {
                //滚动到底部
                if (scrollTop + windowHeight >= (scrollHeight - 200)) {
                    if (page_down < opt.page_count) {
                        page_down++;
                        loadmore(page_down, ‘after‘);
                    } else {
                        $(".ajax-ending").remove();
                        $("<div class=‘ajax-ending‘>" + opt.ending_msg + "</div>").appendTo(This);
                        $(".ajax-ending").delay(2000).hide();
                    }
                }
            }
        });
    }

}

使用方法

    $("#obj").list_data({
        ajaxdata_url    : data.php,
        page_count      : 100,
        page_val_name: ‘current_page‘,
        page_no: 2,
    });
时间: 2024-11-08 16:03:43

向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)的相关文章

iScroll.js 向上滑动异步加载数据回弹问题

iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ 下面是按照官网给的Demo,写的一个异步加载数据实例: 1 <title>iScroll demo: click</title> 2 <script src="~/Scripts/iscroll5/jquery-1.10.2.js"></scrip

淘宝购物车页面 智能搜索框Ajax异步加载数据

如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区非常的活跃,许多朋友都在不同地方分享了很多优秀的插件.我在相关的网站上找过想实现类似功能的插件,但是没有找到.于是乎,自己动手丰衣足食.自己来搭建智能搜索框下拉列表.当然,如果有类似功能并且常维护Bug的插件,望留言交流. 源码地址: 淘宝购物车页面--PC端和移动端项目实战 首先需要先给大家打一根

Android-搭建简单服务端+ListView异步加载数据

Android-搭建简单服务端+ListView异步加载数据 2014年5月6日 本篇博文带给大家的是教大家如何在MyEclipse中搭建一个服务端,并通过手机端与其通信,异步加载数据. 笔者使用的是MyEclipse,各位也可以直接用Eclipse创建Java Web项目,谷歌提供的ADT Bundle是不能创建Web项目,读者可以下载Eclipse For JaveEE Developer这个IDE. 下面来介绍如何在MyEclipse创建一个Web项目,并部署到Tomcat当中,关于Tom

SpringMVC+Jquery -页面异步加载数据

背景: 做项目时涉及到页面,当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新,这都是几百年前使用的技术了.你用post实现异步加载数据.然后就...... ResultUtil.java 工具类: package com.sgcc.uds.fs.config.web.util; import java.util.HashMap; import java.util.Map; import net.sf.json.JSO

jQuery异步加载数据添加事件

几个月前在一个项目中涉及到树形栏,然后看了很多插件,觉得有点麻烦,于是自己写了一个,写着写着就出问题了.当时项目是通过树形栏进行权限控制的,管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作,可是用$(".XX").click();方法是不行的.1.之前用的是jq1.4.3 ,jq1.7一下都可以使用live()方法,来实现该功能 $('#div').live('click',function(){ //do stuff }); 但是live方法也有不支持的事件,例如:togg

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ

Loader异步加载数据

在android3.0开始,新增了Loader.  Loader加载数据的方式是异步的.Loader的特点: 1.适合于activity和fragment 2.提供了异步加载数据机制 3.监控数据源,当数据源发生改变时,会传递新结果 4.自动重连到最后一个数据加载器游标,不需要重新查询数据 使用情况:对数据源监控,比如contentProvider.     CursorLoader是AsyncTaskLoader的子类,AsyncTaskLoader会提供AsynTask去操作.故不会阻塞UI

iOS中异步加载数据效率更高

在开发中有得时候虽然也能从服务器返回来数据,但是我们要根据实际情况,加快数据的显示,所以我们使用异步加载数据. 下面我们看一下如何异步加载数据 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //下载数据(这里写的是使用AFNetWorking请求的数据) dispatch_async(dispatch_get_main_queue(), ^{ //更新视图(这里写的是,要把数据显示出来) }); });