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 相关文章推荐
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
Sep 22 Javascript
JS中eval函数的使用示例
Jul 21 Javascript
jQuery中的$.ajax()方法应用
May 06 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
javascript文本模板用法实例
Jul 31 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
vue.js打包之后可能会遇到的坑!
Jun 03 Javascript
ES6的解构赋值实例详解
May 06 Javascript
JS apply用法总结和使用场景实例分析
Mar 14 Javascript
vue中移动端调取本地的复制的文本方式
Jul 18 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
Nov 10 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 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下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
php抓取页面的几种方法详解
2013/06/17 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
学术会议邀请函范文
2014/01/22 职场文书
校园安全标语
2014/06/07 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
经理岗位职责
2015/02/02 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
老人院义工活动感想
2015/08/07 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python