Asp.net使用JQuery实现评论的无刷新分页及分段延迟加载效果

首先建立数据库,数据关系图如下:

本文要实现的效果就是在评论别人文章时,如果文章内容过长或者评论内容过长,实现的一个评论分段延迟加载的效果,即每页可显示30条评论,可每隔10条延迟加载一次以提高网页传输显示效率。

 

我所实现的页面延迟的原理如下图,就是求出X的距离小于100时进行加载延迟的评论,然后又设置了一个标记位,用来判断延迟加载了多少次,每页仅能加载30条评论记录。

 

 

然后再评论末端加载上页码实现无刷新进行分页的效果。

分页的方法也是比较简单的,这里自己实现了一个存储过程,使用到row_number()函数:

 

1
2
3
4
5
6
7
8
9
10
11
12
ALTER PROCEDURE ps_getpageandload
    @aid int,
    @startindex int,
    @endindex int
AS
    select  * from
    (
        select Row_Number() over(order by CID) as rownum,Username,Comment
        from T_Comments where AID=@aid
    ) as T
    where T.rownum>=@startindex and T.rownum<=@endindex
    RETURN

 

就是输入一个起始位置的参数和结束位置的参数,取出中间的数据。

这样,在程序中就好取出数据了,比如:我第一页就是要1-30的数据,就让startindex=1,endindex=30就行了;第二页就是31-60的数据,同理。

 

LoadArticle.ashx:一个一般处理程序,用来加载文章内容,源代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using System.Data;
using System.Text;
 
namespace AJAXPagingTest
{
    /// <summary>
    /// Summary description for LoadArticle
    /// </summary>
    public class LoadArticle : IHttpHandler
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
 
            //获取连接字符串
            String connString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
             
            //获取所要读取的文章编号
            String aid = context.Request["article"];
            SqlParameter[] sp=new SqlParameter[1];
            sp[0]=new SqlParameter("@aid",aid);
 
            SqlDataReader dr = SqlHelper.ExecuteReader(connString,
                CommandType.Text,
                "select Title,Article from T_Articles where AID=@aid",
                sp);
 
            StringBuilder sb = new StringBuilder();
 
            while (dr.Read())
            {
                sb.Append(dr.GetString(dr.GetOrdinal("Title")));
                sb.Append("|");
                sb.Append(dr.GetString(dr.GetOrdinal("Article")));
            }
 
            context.Response.Write(sb.ToString());
 
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

 

LoadCommentAndPaging.ashx:也是一个一般处理程序,用于加载评论,源代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using System.Configuration;
using System.Web.Script.Serialization;
 
 
namespace AJAXPagingTest
{
    /// <summary>
    /// Summary description for LoadCommentAndPaging
    /// </summary>
    public class LoadCommentAndPaging : IHttpHandler
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
 
            String connStr = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
            List<Comment> Comments = new List<Comment>();
            String result = String.Empty;
 
            //获取页面的动作
            String action = context.Request["action"];
             
            //页面第一加载的时候
            if (action=="load")
            {
                DataTable dt = SqlHelper.ExecuteDataset(connStr,
                    CommandType.Text,
                    "select top(10) * from T_Comments where AID=1").Tables[0];
 
                foreach (DataRow dr in dt.Rows)
                {
                    Comment comment = new Comment();
                    comment.Username = dr["Username"].ToString();
                    comment.Commentz = dr["Comment"].ToString();
                    Comments.Add(comment);
                }
                JavaScriptSerializer jss = new JavaScriptSerializer();
                result = jss.Serialize(Comments);
                context.Response.Write(result);
                return;
            }
 
            //获取当前页码
            String pageString = context.Request["page"];
 
            //处理延时或分页加载评论
            if (action=="pageOrlazy")
            {
                //获取当前延时加载的次数
                String countString = context.Request["count"];
 
                int page, count;
 
                //判断参数是否正确
                if (int.TryParse(pageString, out page) && int.TryParse(countString, out count))
                {
                    //计算需要加载评论的起始索引
                    int startindex = (page - 1) * 30 + count * 10 + 1;
 
                    //计算需要加载评论结束索引
                    int endindex = startindex + 9;
 
                    SqlParameter[] sp = new SqlParameter[3];
                    sp[0] = new SqlParameter("@aid", 1);
                    sp[1] = new SqlParameter("@startindex", startindex);
                    sp[2] = new SqlParameter("@endindex", endindex);
 
                    DataTable dt = SqlHelper.ExecuteDataset(connStr,
                        CommandType.StoredProcedure,
                        "ps_getpageandload",
                        sp).Tables[0];
 
                    foreach (DataRow dr in dt.Rows)
                    {
                        Comment comment = new Comment();
                        comment.Username = dr["Username"].ToString();
                        comment.Commentz = dr["Comment"].ToString();
                        Comments.Add(comment);
                    }
 
                    JavaScriptSerializer jss = new JavaScriptSerializer();
                    result = jss.Serialize(Comments);
                    context.Response.Write(result);
                    return;
 
                }
                else
                {
                    throw new Exception("参数传递错误");
                }
 
            }
 
            //获取页码
            if (action=="pagenumber")
            {
                int number = Convert.ToInt32(SqlHelper.ExecuteScalar(connStr,
                    CommandType.Text,
                    "select count(*) from T_Comments"));
 
                context.Response.Write((number/30).ToString());
                return;
            }
 
            
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
 
    public class Comment
    {
        public String Username {get;set; }
        public String Commentz {get;set; }
    }
}

CommnetPage.htm:最后是前台页面的JQuery代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
    <title></title>
    <link href="Style/StyleSheet1.css" rel="stylesheet" type="text/css" />
    <script src="JS/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
 
            //加载文章内容
            $.post("LoadArticle.ashx", { "article": "1" }, function (data, state) {
                if (state == "success") {
 
                    //利用"|"来分隔标题和正文
                    var article = data.split("|");
                    $("#article h3").text(article[0]);
                    $("#article").append(article[1]);
                }
            });
 
            //加载初始的10条评论条数
            $.post("LoadCommentAndPaging.ashx", { "action": "load" }, function (data, state) {
                if (state == "success") {
                    var comments = $.parseJSON(data);
 
                    for (var i = 0; i < comments.length; i++) {
                        var comment = "<tr><td>" + comments[i].Username + "说:</td><td>" + comments[i].Commentz + "</td></tr>";
                        $("#comment").append(comment);
                    }
                }
            });
        });
 
        //标记页面延迟数
        var flag = 1;
 
        //标记当前页面
        var currentpage = 1;
 
        //监测是否需要加载评论
        function check(n) {
 
            //监测浏览器的模式,根据不同的模式获取客户端高度会有不同
            var dom = document.compatMode == "CSS1Compat" ? document.documentElement : document.body;
            var pre = document.getElementById("preload");
 
            //获取滚动条离顶端的高度,用IE测试时是用
            //documentElement.scrollTop获取高度,
            //而在用chrome测试时是body.scrollTop获取高度
            var scrtop = dom.scrollTop || document.body.scrollTop;
 
            //传入的参数为当前页数,保存为全局变量
            currentpage = n;
 
            //当客户端显示窗口离标记的地方小于100距离时开始加载
            if (pre.offsetTop - (dom.clientHeight + scrtop) < 100) {
                $.post("LoadCommentAndPaging.ashx", { "action": "pageOrlazy", "page": currentpage, "count": flag }, function (data, state) {
                    if (state == "success") {
                        var comments = $.parseJSON(data);
                        for (var i = 0; i < comments.length; i++) {
                            var comment = "<tr><td>" + comments[i].Username + "说:</td><td>" + comments[i].Commentz + "</td></tr>";
                            $("#comment").append(comment);
                        }
                    }
                });
 
                flag = flag + 1;
 
                //如果加载多于3次了则不加载评论了,加载页码
                if (flag <= 2) {
                    setTimeout("check(currentpage)", 2000);
                }
                else {
                    //加载页码
                    $.post("LoadCommentAndPaging.ashx", { "action": "pagenumber" }, function (data, state) {
                        if (state == "success") {
                            var count = parseInt(data, 10);
 
                            for (var i = 1; i <= count + 1; i++) {
                                var control;
 
                                //等于当前页时则不显示超链接
                                if (i != currentpage) {
                                    control = "<td><a href=''>" + i + "</a></td>";
                                }
                                else {
                                    control = "<td>" + i + "</td>";
                                }
 
 
                                $("#anchorlink").append(control);
 
 
                            }
                            //加载分页点击时的事件
                            $("#anchorlink td").click(function (e) {
                                e.preventDefault();  //阻止超链接的转向
                                $("#comment").empty();  //将评论区清空
                                $("#anchorlink").empty();  //将页码清空
                                $("#preload").text("评论正在加载中..."); 
                                flag = 0;
                                var page = parseInt($(this).text());
                                check(page);
 
                            });
 
                        }
                    });
                    //去掉“评论加载中”的显示
                    $("#preload").text("");
                }
            }
            else {
                setTimeout("check(currentpage)", 2000);
            }
 
        }
 
        //每隔两秒检查一下页面是否需要加载评论
        setTimeout("check(currentpage)", 2000);
 
    </script>
</head>
<body>
    <div id="main">
        <div id="article">
            <h3>
            </h3>
        </div>
        <div>
            <table id="comment">
            </table>
            <p id="preload">
                评论正在加载中...</p>
            <table>
                <tr id="anchorlink">
                </tr>
            </table>
        </div>
    </div>
</body>
</html>
原文地址:https://www.cnblogs.com/yanergui/p/5014276.html