jQuery结合AJAX之在页面滚动时从服务器加载数据


Posted in Javascript onJune 30, 2015

 简介

文本将演示怎么在滚动滚动条时从服务器端下载数据。用AJAX技术从服务器端加载数据有助于改善任何web应用的性能表现,因为在打开页面时,只有一屏的数据从服务器端加载了,需要更多的数据时,可以随着用户滚动滚动条再从服务器端加载。
背景

是Facebook促使我写出了在滚动条滚动时再从服务器加载数据的代码。浏览facebook时,我很惊讶的发现当我滚动页面时,新的来自服务器的数据开始插入到此现存的数据中。然后,对于用c#实现同样的功能,我在互联网上了查找了相关信息,但没有发现任何关于用c#实现这一功能的文章或者博客。当然,有一些Java和PHP实现的文章。我仔细的阅读了这些文章后,开始用c#写代码。由于我的C#版本运行的很成功,所以我想我愿意分享它,因此我发表了这边文章。

代码

只需要很少的几行代码我们就能在滚动时完成加载。滚动页面时,一个WebMethod将被客户端调用,返回要插入客户端的内容,同时,在客户端,将把scroll事件绑定到一个客户端函数(document.ready),这个函数实现从服务器端加载数据。下面详细说说这两个服务器端和客户端方法。

服务器端方法:这个方法用来从数据库或者其他数据源获取数据,并根据数据要插入的控件的格式来生成HTML串。这里我只是加入了一个带有序列号的消息。
 
[WebMethod]

public static string  GetDataFromServer()

{

    string resp = string.Empty;

    for(int i = 0; i <= 10; i++)

    {

        resp += "<p><span>"  + counter++ +

          "</span> This content is dynamically appended " +

          "to the existing content on scrolling.</p>" ;

    }

    return resp;

}

若你要从数据库加载数据,可以如下修改代码:
 
[WebMethod]
public static string GetDataFromServer()

    {

        DataSet ds = new DataSet();

  

        // Set value of connection string here

        string strConnectionString = ""; // Insert your connection string value here

        SqlConnection con = new SqlConnection(strConnectionString);

  

        // Write the select command value as first parameter

        SqlCommand command = new SqlCommand("SELECT * FROM Person", con);

        SqlDataAdapter adp = new SqlDataAdapter(command);

int retVal = adp.Fill(ds);

  

        string resp = string.Empty;

for (int i = 1; i <= ds.Tables[0].Rows.Count; i++)

        {

            string strComment = string.Empty;

if (ds.Tables != null)

            {

if (ds.Tables[0] != null)

                {

if (ds.Tables[0].Rows.Count > 0)

                    {

if (ds.Tables[0].Rows.Count >= i - 1)

                        {

if (ds.Tables[0].Rows[i - 1][0] != DBNull.Value)

                            {

                                strComment = ds.Tables[0].Rows[i - 1][0].ToString();

                            }

                        }

                    }

                }

            }

            resp += "<p><span>" + counter++ + "</span> " + strComment + "</p>";

        }

return resp;

    }

客户端方法:在客户端,我使用了document.ready方法,并且把div的scroll事件绑定到了该方法上。我使用了两个div元素,mainDiv和wrapperDiv,并且给mainDiv注册了scroll事件,把动态数据插入到wrapperDiv中。
$(document).ready(
function()
{
$contentLoadTriggered = false;
$("#mainDiv").scroll(
function()
{
if($("#mainDiv").scrollTop() >= ($("#wrapperDiv").height() -
  $("#mainDiv").height()) &&
  $contentLoadTriggered == false)
  $contentLoadTriggered == false)
{
$contentLoadTriggered = true;
$.ajax(
{
type: "POST",
url: "LoadOnScroll.aspx/GetDataFromServer",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
async: true,
cache: false,
success: function (msg)
{
$("#wrapperDiv").append(msg.d);
$contentLoadTriggered = false;
},
error: function (x, e)
{
alert("The call to the server side failed. " +
x.responseText);
}
}
);
}
}
);
}
);

这里,为检查滚动条是否已经移动到了底部,使用了下面的条件判断,
 

if($("#mainDiv").scrollTop() >=
 ($("#wrapperDiv").height() - $("#mainDiv").height()) &&
  $contentLoadTriggered == false)

这个条件将判断滚动条是否已经到达了底部,当它已经移动到了底部,动态数据将从服务器端加载,并且插入wrapperDiv。把数据插入目标div元素的客户端脚本将在异步调用返回成功时执行。
 

success: function (msg)
{
$("#wrapperDiv").append(msg.d);
$contentLoadTriggered = false;
}

这里,你将注意到只有在用户移动滚动到了底部时,请求才会送到服务器端。

我粘贴了几个样图:
Output

jQuery结合AJAX之在页面滚动时从服务器加载数据

jQuery结合AJAX之在页面滚动时从服务器加载数据

Javascript 相关文章推荐
Exjs 入门篇
Apr 07 Javascript
js创建对象的几种常用方式小结(推荐)
Oct 24 Javascript
JQuery获取表格数据示例代码
May 26 Javascript
判断window.onload是否多次使用的方法
Sep 21 Javascript
jQuery类选择器用法实例
Dec 23 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
javaScript 逻辑运算符使用技巧整理
May 03 Javascript
原生js封装运动框架的示例讲解
Oct 01 Javascript
快速解决vue-cli不能初始化webpack模板的问题
Mar 20 Javascript
axios使用拦截器统一处理所有的http请求的方法
Nov 02 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
May 24 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 #Javascript
使用jQuery在对象中缓存选择器的简单方法
Jun 30 #Javascript
在Node.js应用中读写Redis数据库的简单方法
Jun 30 #Javascript
javascript日期计算实例分析
Jun 29 #Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 #Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 #Javascript
JavaScript实现级联菜单的方法
Jun 29 #Javascript
You might like
php中inlcude()性能对比详解
2012/09/16 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
event.X和event.clientX的区别分析
2011/10/06 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python实现批量下载新浪博客的方法
2015/06/15 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
Python读取yaml文件的详细教程
2020/07/21 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
收入证明申请书
2015/06/12 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
2015国庆节宣传语
2015/07/14 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis