Ajax动态滚动加载数据

摘要:
看看新浪微博,人人网有这样一个效果:当滚动条滚动到底时,新数据会自动加载。今天,我个人试图达到这个效果。用户单击“继续查看”,然后继续滚动。看看实现:更新核心滚动代码:$。scroll(function()){//当滚动到底部上方n个像素时,加载新内容if($(document).height()-$(this).sollTop()-$(this).heith()滚动测试.mainDiv{width:800px;border:solid1px#f00;padding:10px;}项{width:600px;height:50px;border:solid1px#00ff90;font size:12px;margin:10px;}.title{font size:16px;line height:20px;}.content{line-height:14px;}滚动测试class=“mainDiv”˃˂!

看新浪微博,人人网都有这样的效果:滚动条滚动到最下面的时候,新的数据就被自动加载出来了,今天亲自尝试了一下这个效果的实现。

最开始在CSDN上写了一版,功能比较简单,今天又增加了一个小功能:翻页到指定页数后,自动停止。用户点击继续查看后,再继续滚动。看看实现吧:

更新核心滚动代码:

复制代码
    $(window).scroll(function(){
        // 当滚动到最底部以上n像素时, 加载新内容
        if ($(document).height() - $(this).scrollTop() - $(this).height()<1) {
            if (!gDataGetAll) {
                getData(gCurrentPage, gLongitude, gLatitude);
            }
        }
    });
复制代码

首先,准备一个分页的存储过程:

复制代码
CREATE PROCEDURE proctest
@pagesize INT,
@pagenumber INT
AS 

SELECT  *
FROM    ( SELECT ROW_NUMBER()OVER (ORDER BY userid)AS ROWNUM,c_name,user_email FROM ehrusers WHERE c_name<>''
        ) AS products
WHERE   ROWNUM BETWEEN @pagesize*(@pagenumber-1)+1 and @pagesize*@pagenumber

EXEC dbo.proctest 20, 1
复制代码

接着,写一个取数据的C#方法:

复制代码
        //Test
        public static DataTable GetTable(int pagesize, int pagenum)
        {
            string sql = string.Format(@"EXEC dbo.proctest {0}, {1}", pagesize, pagenum);
            DataSet ds = SqlHelper.ExecuteDataset(ConnString.GetConString, CommandType.Text, sql);
            if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                return ds.Tables[0];
            }
            else
            {
                return null;
            }
        }        
复制代码

Ajax请求数据的逻辑,调用刚才的方法,返回JSON:

复制代码
protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["pagesize"] != null && Request.QueryString["pagenumber"] != null)
            {
                int pagesize = int.Parse(Request.QueryString["pagesize"].ToString());
                int pagenumber = int.Parse(Request.QueryString["pagenumber"].ToString());
                System.Data.DataTable dt = DB.GetTable(pagesize, pagenumber);
                string json = Tools.CreateJsonParameters(dt);
                Response.Write(json);
            }

        }
复制代码

其中用到了一个aspx页面作为controller。

接下来,就是比较重要的页面和js代码了:

页面:

复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>滚动测试</title>
    <style>
        .mainDiv {
            width: 800px;
            border: solid 1px #f00;
            padding: 10px;
        }

        .item {
            width: 600px;
            height: 50px;
            border: solid 1px #00ff90;
            font-size: 12px;
            margin: 10px;
        }

        .title {
            font-size: 16px;
            line-height: 20px;
        }

        .content {
            line-height: 14px;
        }
    </style>
    <script src="Scripts/jquery-1.7.1.js"></script>
   
</head>
<body>
    <h1>滚动测试</h1>
    <div class="mainDiv">
        <!--<div class="item">
            <div class="title">title</div>
            <div class="content">content content content content content content content</div>
        </div>
        -->
    </div>

</body>
</html>
复制代码

JS:

复制代码
  <script type="text/javascript">
        var gPageSize = 10;
        var i = 1; //设置当前页数,全局变量
        $(function () {
            //根据页数读取数据
            function getData(pagenumber) {
                i++;//页码自动增加,保证下次调用时为新的一页。
                $.get("Ajax.aspx", { pagesize: gPageSize, pagenumber: pagenumber }, function (data) {
                    if (data.length > 0) {
                        var jsonObj = JSON.parse(data);

                        insertDiv(jsonObj.Head);

                    }
                });
            }
            //初始化加载第一页数据
            getData(1);

            //生成数据html,append到div中
            function insertDiv(json) {
                var $mainDiv = $(".mainDiv");
                var html = '';
                for (var i = 0; i < json.length; i++) {
                    html += '<div class="item">';
                    html += ' <div class="title">' + json[i].ROWNUM + '   ' + json[i].c_name + '</div>';
                    html += '<div class="content">' + json[i].user_email.replace('lightinthebox', 'sina') + '</div>';
                    html += '</div>';
                }
                $mainDiv.append(html);
            }

            //==============核心代码=============
            var winH = $(window).height(); //页面可视区域高度 

            var scrollHandler = function () {
                var pageH = $(document.body).height();
                var scrollT = $(window).scrollTop(); //滚动条top 
                var aa = (pageH - winH - scrollT) / winH;
                if (aa < 0.02) {//0.02是个参数
                    if (i % 10 === 0) {//10页做一次停顿!
                        getData(i);
                        $(window).unbind('scroll');
                        $("#btn_NextPage").show();
                    } else {
                        getData(i);
                        $("#btn_NextPage").hide();
                    }

                }
            }
            //定义鼠标滚动事件
            $(window).scroll(scrollHandler);
            //==============核心代码=============

            //继续加载按钮事件
            $("#btn_NextPage").click(function () {
                getData(i);
                $(window).scroll(scrollHandler);
            });
        });
    </script>
复制代码

最终效果:

滚动前:

Ajax动态滚动加载数据第13张

滚动自动刷新,到第10页后自动停止,出现链接:

Ajax动态滚动加载数据第14张

大功告成!

免责声明:文章转载自《Ajax动态滚动加载数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇rgba alpha 透明度的转换计算request请求地址下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VUE 进阶

4. 通过axios实现数据请求vue.js默认没有提供ajax功能的。 所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互。 注意,axios本质上就是javascript的ajax封装,所以会被同源策略限制。 下载地址: https://unpkg.com/axios@0.18.0/dist/axios.js ht...

goahead3.6.3就基本使用(后台上传信息到html页面),高手请忽略

声明:这里面的代码均为网上找的然后有小小的改动,并非原创。但文章为原创 一、.编译 1.1,、下载:进入http://embedthis.com/goahead/下载goahead3.6.3(2017年9月12日还是这版本) 1.2、解压 , 然后进入goahead-3.6.3-rc目录,进入后为这样 , 然后在进入goahead-3.6.3 然后在终端...

elementui源码解析markdown处理

一些参考网址: markdown-it官网:markdown-it | markdown-it 中文文档 (docschina.org) markdown-it插件的分析和源码分析参考地址:https://zhuanlan.zhihu.com/p/64290806 参考例子:https://gitee.com/springliuliu/mdToHtm...

JavaScript异步仿同步(控制流)的实现

在前端开发中尤其是在nodejs开发中经常会遇到这样的场景(以ajax为例):有3个(或者更多个)Ajax请求,并且第2个请求依赖于第1个,第3个请求依赖于第2个,那我们可能就会在发第一个Ajax后回调再执行第二个Ajax,第二个执行后再在回调里面执行第三个,如此就形成了回调金字塔了,也显得复杂,当然这种问题也有许多插件,如:Promise、async等。...

关于.net调用com组件将word或exce转为pdf或html进行预览的问题整理

1.先贴代码(dll地址自己百度下载,名字叫做Microsoft.Office.Interop.Word.dll) / // <summary> /// 将word文档转换成PDF格式 /// </summary> /// <param name="source...

迷你MVVM框架 avalonjs 入门教程

新官网请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-controller, ms-important) 忽略扫描绑定(ms-skip) 模板绑定(ms-include) 数据填充(ms-text, ms-htm...