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 相关文章推荐
javascript引导程序
Oct 26 Javascript
js限制文本框为整数和货币的函数代码
Oct 13 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
Jul 27 Javascript
全面解析Bootstrap弹窗的实现方法
Dec 01 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
Dec 14 Javascript
关于vue.js过渡css类名的理解(推荐)
Apr 10 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
jQuery 实现扁平式小清新导航
Jul 07 jQuery
结合axios对项目中的api请求进行封装操作
Sep 21 Javascript
微信小程序实现自定义底部导航
Nov 18 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 pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Python实现的knn算法示例
2018/06/14 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
python爬虫 requests-html的使用
2020/11/30 Python
python爬虫基础之urllib的使用
2020/12/31 Python
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
日语专业推荐信
2013/11/12 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
年终晚会主持词
2014/03/25 职场文书
十八大标语口号
2014/10/09 职场文书
交通事故被告代理词
2015/05/23 职场文书
淮海战役观后感
2015/06/11 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python