AutoPager的简单实现

Firefox有个自动翻页的插件AutoPager,使用起来非常的方便。腾讯微博也有相同的功能,当鼠标滑动到底部时会自动展开下一页,如下图所示:

 

展开后如下所示:

这个功能虽然比较小,但是实现起来是非常有意思的事情,我们可以选择多种方法达到目的。下面我介绍一种简单的实现方式。

1、首先移动滚动条会触发window.onscroll事件。

2、我们可以根据滚动条滚动时屏幕位置和页面底部的距离来判断是否需要翻页。

需要用到三个函数:

1、pageHeight:页面总高度。

2、windowHeight:屏幕高度。

3、ScollY:页面滚动的高度。

pageHeight减去windowHeight减去ScollY即为当前屏幕底部到页面底部的距离,如下图所示:

下面我们可以来实现这个功能了,我们设置一个阈值来设定页面加载的次数。

[javascript]  view plain copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  2. <html xmlns="http://www.w3.org/1999/xhtml">   
  3. <head>   
  4. <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>   
  5. </head>   
  6. <body>   
  7. <ul id="ul-list">  
  8. </ul>  
  9. <mce:script type="text/javascript"><!--  
  10. var UI = {  
  11.     pageHeight: function() {  
  12.         return document.body.scrollHeight || document.documentElement.scrollHeight  
  13.     },  
  14.     windowHeight: function () {  
  15.         var a = document.documentElement;  
  16.         return self.innerHeight || a && a.clientHeight || document.body.clientHeight  
  17.     },  
  18.     scrollY: function (a) {  
  19.         var b = document.documentElement;  
  20.         if (a) {  
  21.             var c = a.parentNode,  
  22.                 e = a.scrollTop || 0;  
  23.             if (a == b) e = UI.scrollY();  
  24.             return c ? e + UI.scrollY(c) : e  
  25.         }  
  26.         return self.pageYOffset || b && b.scrollTop || document.body.scrollTop  
  27.     }  
  28. };  
  29.   
  30. var Utils = {  
  31.     randomChar: function(l)  {  
  32.         var x = "0123456789qwertyuioplkjhgfdsazxcvbnm";  
  33.         var tmp = "";  
  34.         for(var i=0; i < l; i++)  {  
  35.             tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);  
  36.         }  
  37.         return tmp;  
  38.     }  
  39. };  
  40.   
  41. var ul = document.getElementById('ul-list');  
  42. for(var i = 0; i < 50; i++) {  
  43.     var li = document.createElement("li");  
  44.     li.innerHTML = 'hfahe';  
  45.     ul.appendChild(li);  
  46. }  
  47.   
  48. var scoll_time = 0;  
  49.   
  50. window.onscroll = function() {  
  51.     if(scoll_time < 10 & UI.pageHeight() - UI.scrollY() - UI.windowHeight() < 60) {  
  52.         var ul_list = document.getElementById('ul-list');  
  53.         var new_li = document.createElement('li');  
  54.         new_li.innerHTML = Utils.randomChar(5);  
  55.         ul_list.appendChild(new_li);  
  56.   
  57.         scoll_time++;  
  58.     }  
  59. }  
  60. // --></mce:script>  
  61. </body>   
  62. </html>  

这样,我们就实现了AutoPager的功能。

剩下一个很有意思的问题,window.onscroll按照道理会在滚动条的每次移动时触发,那么在我们设定触发的高度内(例子里是60个像素),它会不会频繁的调用我们的方法呢?例如像腾讯微博一样的Ajax调用会不会多次出现呢?又该如何解决此问题呢?读者有空的话可以思考思考。





解决方案很简单,使用 setTimeout 延迟出发,当频繁出发onscroll 事件时,总是取消上次的setTimeout,当然,要注意如果函数已经执行ajax请求了,那么这个时候就不需要再触发加载事件了
Re:  hfahe 2010-08-28 16:06发表 [回复] [引用] [举报]
回复 MIMORay:嗯 腾讯微博就是用clearTimeout来解决的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值