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 相关文章推荐
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 Javascript
七个很有意思的PHP函数
May 12 Javascript
jQuery中[attribute]选择器用法实例
Dec 31 Javascript
jQuery内容过滤选择器用法分析
Feb 10 Javascript
js数组去重的5种算法实现
Nov 04 Javascript
js实现音频控制进度条功能
Apr 01 Javascript
BootStrap入门学习第一篇
Aug 28 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
D3.js实现简洁实用的动态仪表盘的示例
Apr 04 Javascript
微信小程序如何获取用户头像和昵称
Sep 23 Javascript
vue keep-alive 动态删除组件缓存的例子
Nov 04 Javascript
利用H5api实现时钟的绘制(javascript)
Sep 13 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
如何隐藏你的.php文件
2007/01/04 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
解析php中curl_multi的应用
2013/07/17 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
Python中正则表达式详解
2017/05/17 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
pycharm设置注释颜色的方法
2018/05/23 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
农民工创业典型事迹
2014/01/25 职场文书
岗位廉政承诺书
2014/03/27 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
2014年质检工作总结
2014/11/26 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
idea下配置tomcat避坑详解
2022/04/12 Servers