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 parseInt与Number函数的区别
Jan 21 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 Javascript
微信小程序 页面跳转传递值几种方法详解
Jan 12 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
vue-cli + sass 的正确打开方式图文详解
Oct 27 Javascript
基于Vue实现图片在指定区域内移动的思路详解
Nov 11 Javascript
微信小程序动态添加view组件的实例代码
May 23 Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 Javascript
jquery实现的放大镜效果示例
Feb 24 jQuery
vue数据更新UI不刷新显示的解决办法
Aug 06 Javascript
vue3中的组件间通信
Mar 31 Vue.js
深入探究使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 MemCached高级缓存配置图文教程
2010/08/05 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
实例讲解php实现多线程
2019/01/27 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
详解vue后台系统登录态管理
2019/04/02 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
python写一个随机点名软件的实例
2019/11/28 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
自我鉴定注意事项
2014/01/19 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
入股协议书
2014/04/14 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
中国合伙人观后感
2015/06/02 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers