国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

基于jquery實現頁面滾動到底自動加載數據的功能

2019-11-20 10:58:40
字體:
來源:轉載
供稿:網友

現在,我們經常使用的微博、微信或其他應用都有異步加載功能,簡而言之,就是我們在刷微博或微信時,移動到界面的頂端或低端后程序通過異步的方式進行加載數據,這種方式加快了數據的加載速度,由于它每次只加載一部分數據,當我們有大量的數據,但不能顯示所有,這時我們可以考慮使用異步方式加載數據。

數據異步加載可以發生在用戶點擊“查看更多”按鈕或滾動條滾動到窗口的底部時自動加載;在接下來的博文中,我們將介紹如何實現自動加載更多的功能。

圖1 微博加載更多功能

正文

假設,在我們的數據庫中存放著用戶的消息數據,現在,我們需要通過Web Service形式開放API接口讓客戶端調用,當然我們也可以使用一般處理程序(ASHX文件)讓客戶端調用(具體請參考這里)。

數據表
首先,我們在數據庫中創建數據表T_Paginate,它包含三個字段ID、Name和Message,其中ID是自增值。

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中沒有提供類似的函數,那么,我們可以發揮人的主觀能動――自己實現一個吧,具體實現如下:

Declare @Start AS INTDeclare @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接口(跨源請求例子),具體實現如下:

$.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自動加載更多程序,每當滾動條到底部時,發送異步請求獲取服務器中的數據。

我們通過一個Demo程序,介紹了通過jQuery實現異步加載數據,當然這里也涉及到數據的頁面查詢問題,這里我們使用了一個自定義的公用表表達式Results_CTE來獲取分頁數據,然后,通過$.ajax()方法發送同源請求調用Web Service API;當數據獲取成功后,通過JSON格式返回數據,最后,我們把數據顯示到頁面當中。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玛多县| 宿松县| 当雄县| 麦盖提县| 昆山市| 泌阳县| 漳平市| 马鞍山市| 沾化县| 乳源| 布拖县| 锦州市| 榆树市| 宁津县| 县级市| 阳新县| 威海市| 潮州市| 康平县| 长治县| 泸水县| 仪征市| 涞水县| 贞丰县| 泉州市| 日土县| 普格县| 湟源县| 嵊泗县| 泸州市| 中宁县| 扎兰屯市| 化州市| 绥芬河市| 阳新县| 长治县| 鄂托克旗| 新余市| 博爱县| 华坪县| 台东市|