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 相关文章推荐
用jscript实现新建和保存一个word文档
Jun 15 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
Oct 02 Javascript
window.print打印指定div指定网页指定区域的方法
Aug 04 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
Node.js创建Web、TCP服务器
Dec 05 Javascript
浅谈Vue2.0父子组件间事件派发机制
Jan 08 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
Jan 12 Javascript
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 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代码质量36计
2012/09/05 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
替换python字典中的key值方法
2018/07/06 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
详解Python绘图Turtle库
2019/10/12 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
古驰英国官网:GUCCI英国
2020/03/07 全球购物
自我鉴定怎么写
2014/01/12 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
优秀大学生申请书
2019/06/24 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫