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 相关文章推荐
js弹出层之1:JQuery.Boxy (二)
Oct 06 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
php读取sqlite数据库入门实例代码
Jun 25 Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 Javascript
Node.js获取前端ajax提交的request信息
Feb 20 Javascript
微信小程序 MD5的方法详解及实例代码
Mar 10 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
javascript 缓冲运动框架的实现
Sep 29 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 Javascript
生成无限制的微信小程序码的示例代码
Sep 20 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
最省空间的计数器
2006/10/09 PHP
用php过滤危险html代码的函数
2008/07/22 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
深入理解Django中内置的用户认证
2017/10/06 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python批量创建指定名称的文件夹
2019/03/21 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
学校献爱心活动总结
2014/07/08 职场文书
水利水电专业自荐信
2014/07/08 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
旷课检讨书
2015/01/26 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL