1.1.1 摘要

现在,我们经常使用的微博、微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据,这种方式加快了数据的加载速度,由于它每次只加载一部分数据,当我们有大量的数据,但不能显示所有,这时我们可以考虑使用异步方式加载数据。

数据异步加载可以发生在用户点击“查看更多”按钮或滚动条滚动到窗口的底部时自动加载;在接下来的博文中,我们将介绍如何实现自动加载更多的功能。

本文目录

  • 数据表
  • 数据对象模型
  • Web Service方法
  • Javascript
  • CSS样式

图1 微博加载更多功能

1.1.2 正文

假设,在我们的数据库中存放着用户的消息数据,现在,我们需要通过Web Service形式开放API接口让客户端调用,当然我们也可以使用一般处理程序(ASHX文件)让客户端调用(具体请参考这里)。

数据表

首先,我们在数据库中创建数据表T_Paginate,它包含三个字段ID、Name和Message,其中ID是自增值。

-- =============================================
-- Author:        JKhuang
-- Create date:      10/28/2013
-- Description:    A table stores the user information.
-- =============================================
CREATE TABLE [dbo].[T_Paginate]([ID] [int] IDENTITY(1,1) NOT NULL,[Name] [varchar](60) COLLATE Chinese_PRC_CI_AS NULL,[Message] [text] COLLATE Chinese_PRC_CI_AS NULL,CONSTRAINT [PK_T_Paginate] PRIMARY KEY CLUSTERED
([ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

图2 数据表T_Paginate

数据对象模型

我们根据数据表T_Paginate定义数据对象模型Message,它包含三个字段分别是:Id、Name和Comment,具体定义如下:

/// <summary>
/// The message data object.
/// </summary>
[Serializable]
public class Message
{public int Id { get; set; }public string Name { get; set; }public string Comment { get; set; }
}

Web Service方法

现在,我们需要实现方法GetListMessages(),它根据客户端传递来的分页数来获取相应的分页数据并且通过JSON格式返回给客户端,在实现GetListMessages()方法之前,我们先介绍数据分页查询的方法。

在Mysql数据库中,我们可以使用limit函数实现数据分页查询,但在SQL Server中没有提供类似的函数,那么,我们可以发挥人的主观能动——自己实现一个吧,具体实现如下:

-- =============================================
-- Author:        JKhuang
-- Create date:      10/26/2013
-- Description:   Creates a pagination function
-- =============================================
Declare @Start AS INT
Declare @Offset AS INT
;WITH Results_CTE AS (SELECT ID, Name, Message, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
FROM T_Paginate WITH(NOLOCK))
SELECT * FROM Results_CTE WHERE RowNum BETWEEN @Start AND @Offset

上面我们定义了公用表表达式Results_CTE,它获取T_Paginate表中的数据并且根据ID值由小到大排序,然后根据该顺序分配ROW_NUMBER值,其中@Start和@Offset是要查询的数据范围。

接下来,让我们实现方法GetListMessages(),具体实现如下:

/// <summary>
/// Get the user message.
/// </summary>
/// <param name="groupNumber">the pagination number</param>
/// <returns>the pagination data</returns>
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetListMessages(int groupNumber)
{string query = string.Format("WITH Results_CTE AS (SELECT ID, Name, Message, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum " +"FROM T_Paginate WITH(NOLOCK)) " +"SELECT * FROM Results_CTE WHERE RowNum BETWEEN '{0}' AND '{1}';",
(groupNumber - 1) * Offset + 1, Offset * groupNumber);var messages = new List<Message>();using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["RadditConn"].ToString()))using (var com = new SqlCommand(query, con)){con.Open();using (var reader = com.ExecuteReader(CommandBehavior.CloseConnection)){while (reader.Read()){var message = new Message{Id = (int)reader["ID"],Name = (string)reader["Name"],Comment = (string)reader["Message"]};messages.Add(message);}}// Returns json data.return new JavaScriptSerializer().Serialize(messages);}
}

上面,我们定义了GetListMessages()方法,为了简单起见,我们把数据库的操作直接写在Web Service上了请大家见谅,它通过调用公用表表达式Results_CTE来获取分页数据,最后,我们创建一个JavaScriptSerializer对象序列化数据成JSON格式返回给客户端。

Javascript

由于,我们调用的是本地Web Service API,所以,我们发送同源请求调用API接口(跨源请求例子),具体实现如下:

/**
* Sends same origin request with ajax and json.
* @param options
* The options need to send to server.
* For instance: url and groupNumber.
*/
$.getData = function(options) {var opts = $.extend(true, {}, $.fn.loadMore.defaults, options);$.ajax({url: opts.url,type: "POST",contentType: "application/json; charset=utf-8",dataType: "json",data: "{groupNumber:" + opts.groupNumber + "}",success: function(data, textStatus, xhr) {if (data.d) {// We need to convert JSON string to object, then// iterate thru the JSON object array.$.each($.parseJSON(data.d), function() {$("#result").append('<li id="">' +this.Id + ' - ' + '<strong>' +this.Name + '</strong>' + ' —?' + '<span class="page_message">' +this.Comment + '</span></li>');});$('.animation_image').hide();options.groupNumber++;options.loading = false;}},error: function(xmlHttpRequest, textStatus, errorThrown) {options.loading = true;console.log(errorThrown.toString());}});
};

上面,我们定义了getData()方法,它通过使用jQuery.ajax()方法,发送同源请求调用GetListMessages接口,当数据获取成功加载到result div中显示并且分页数量(groupNumber)加一。

现在,我们已经实现了getData()方法,每当用户把滚动条拖到最底端时,就调用getData()方法获取数据,那么,我们需要把getData()方法和滚动条事件进行绑定,具体实现如下:

// The scroll event.
$(window).scroll(function() {// When scroll at bottom, invoked getData() function.if ($(window).scrollTop() + $(window).height() == $(document).height()) {if (trackLoad.groupNumber <= totalGroups && !trackLoad.loading) {trackLoad.loading = true;      // Blocks other loading data again.$('.animation_image').show();$.getData(trackLoad);}}
});

上面,我们实现了jQuery的scroll事件,当滚动条滚动到最底部时,调用getData()方法获取服务器中的数据。

CSS样式

接下来,我们给程序添加CSS样式,具体定义如下:

@import url("reset.css");
body,td,th {font-family: 'Microsoft Yahei', Georgia, Times New Roman, Times, serif;font-size: 15px;}
.animation_image {background: #F9FFFF;border: 1px solid #E1FFFF;padding: 10px;width: 500px;margin-right: auto;margin-left: auto;}
#result{width: 500px;margin-right: auto;margin-left: auto;}
#result ol{margin: 0px;padding: 0px;}
#result li{margin-top: 20px;border-top: 1px dotted #E1FFFF;padding-top: 20px;}

图3 加载更多程序

上面,我们实现了jQuery自动加载更多程序,每当滚动条到底部时,发送异步请求获取服务器中的数据。

1.1.3 总结

我们通过一个Demo程序,介绍了通过jQuery实现异步加载数据,当然这里也涉及到数据的页面查询问题,这里我们使用了一个自定义的公用表表达式Results_CTE来获取分页数据,然后,通过$.ajax()方法发送同源请求调用Web Service API;当数据获取成功后,通过JSON格式返回数据,最后,我们把数据显示到页面当中。

[1]http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html

[2]http://www.saaraan.com/2013/05/auto-load-records-on-page-scroll

Demo

jQuery自动加载更多程序相关推荐

  1. 基于JQuery实现滚动到页面底端时自动加载更多信息

    基于JQuery实现滚动到页面底端时自动加载更多信息关键代码:代码如下: var stop=true; $(window).scroll(function(){ totalheight = parse ...

  2. php 实现自动加载更多,$.ajax+php实战教程之下拉时自动加载更多文章原理分析二...

    摘要: 继上一篇<$.ajax+php实战教程之下拉时自动加载更多文章原理分析>文章进行进一步讲解,完善之前的代码及引入ajax和php相关内容...... 上次留下的问题不知道看官们有没 ...

  3. 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

    在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...

  4. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  5. android音乐播放器音乐加载,Android开源音乐播放器之在线音乐列表自动加载更多...

    系列文章 前言 当咱们的ListView数据比较多时,咱们通常都会选择分页显示,而分页显示就须要一个动做触发加载更多操做,一般咱们会使用上拉加载更多,但我以为不够人性化,由于用户须要手动上拉,因此更加 ...

  6. 一个到顶部自动加载更多的ListView

    为什么80%的码农都做不了架构师?>>>    一个可以到顶自动加载更多的ListView,实现该控件的目的是用于im聊天页面场景,一些第三方实现的下拉加载更多也可以实现类似功能,但 ...

  7. html5到底部自动加载,列表滚动到底部自动加载更多

    列表滚动到底部自动加载更多 在移动端,经常会用到列表滚动到底部,拉一下加载更多,或者点一下加载更多等等,今天我说说我的一个实现的思路. 通过监听列表的滚动时间,当用户滚动到列表的底部,并停留一小段时间 ...

  8. JS滚动条到网页底部自动加载更多内容

    2019独角兽企业重金招聘Python工程师标准>>> <html> <head> <meta charset="gb18030"  ...

  9. 让AutoCAD启动时自动加载应用程序

    方法一: 1. 在AutoCAD安装目录找到c:\Program Files\AutoCAD 2006\Support\acad2006.lsp 用记事本打开,在最后加入(下段代码第二行即可,注意路径 ...

最新文章

  1. DNN3.0 beta 本地化初体验
  2. setTimeout延时0毫秒的作用
  3. php mysql.x86 64_centos7.2yum安装php70w.x86_64
  4. oracle中角色和用户权限,Oracle用户、角色、权限管理
  5. 盘点3个改变世界的AI项目,NLP/CV/BI,3个方向
  6. Syncd - 开源自动化部署工具
  7. React 18 RC 版本发布啦,生产环境用起来!
  8. 2019-03-22-算法-进化(环形链表)
  9. 万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别
  10. npm切换淘宝源,yarn切换淘宝源
  11. postman如何模拟Map参数请求呢?
  12. SpringBoot读取配置文件中的数据
  13. 2020 wps 免登录_电脑WPS2020永久会员版下载
  14. jQuery版本低引起的漏洞——CVE-2020-11022/CVE-2020-11023
  15. js控制页面只刷新一次
  16. 在VC++中的MFC利用一个dialoge对话框中按钮调用另一个dialoge对话框
  17. Win10 提示账户名与安全标识间无任何映射完成
  18. 第三部分 :简单句的补充(复合句/定语从句)
  19. BB8700 bowser net
  20. js动态修改path值 svg_svg关于animateMotion动态改变path路径来控制svg元素移动

热门文章

  1. 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理
  2. 下载输入python之小说下载器version2.0
  3. Elasticsearch的倒排索引是什么?
  4. ORACLE用SYS登录报ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER解决方法
  5. 游戏线程池的设计0-转自
  6. Java生产环境下性能监控与调优详解 第4章 基于Btrace的监控调试
  7. pyqt5搭建的简单的图像处理界面_PyQt5 布局浅析
  8. 领域驱动设计(DDD)相关架构介绍与演变过程分析(图文详解)
  9. 面试题之Java内存区域
  10. QEMU多进程(Multi-process QEMU)及vfio-user应用