首先建立数据库,数据关系图如下:
本文要实现的效果就是在评论别人文章时,如果文章内容过长或者评论内容过长,实现的一个评论分段延迟加载的效果,即每页可显示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 > |