[JavaScript] google reader load on scroll

google reader load on scroll
捲軸拉到底部之後才載入接下來的資料。

有時候沒事做想寫寫程式,但又不是每次都有靈感,漸漸覺得自己的想像力愈來愈貧乏了…ㄟ,離題了,總之,沒有靈感就上 google瞧瞧吧,十之八九會找到某些有趣的功能。

google reader是我最常使用的 google服務之一,這次自己找的作業是動態載入:捲軸拉到底部之後才載入接下來的資料。想了一下會遇到什麼問題:

  • 怎麼判斷拉到底部
  • 用 AJAX去要資料
  • 把資料塞進頁面之後(DOM),如果要掛 JavaScript事件上去應該要注意一下

codes speak louder than words. XD

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
	<style>
	.testScroll{width:200px; height:100px; border:1px solid blue;overflow-y:scroll;}
	</style>
  </head>
  <body>
	<div class='testScroll'>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	<div>test</div>
	</div>
	<div class='testScroll'></div>
  </body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	$.fn.scrollLoad=function(url, preLoad){
		var preLoad=preLoad || true;
		return this.each(function(){
			var $panel=$(this);

			//若 scrollHeight < panel 初始高度 → 載入資料,撐高 scrollHeight;
			//避免意外,最多載入五次。
			var loadTimes=5, initHeight=this.scrollHeight;
			while(preLoad && loadTimes-- && initHeight<=$panel.height()){
				initHeight=load($panel);
			}
			
			//綁 scroll事件
			/*
			很單純……?我本來也是這麼想的,firefox寫完很正常;
			手癢開了 IE8……發現捲一下 會觸發個好幾次scroll = =a
			*/
			$(this).scroll(function(){
				if(this.scrollTop+$panel.height()>=(this.scrollHeight-10)){
					//load($panel);
					laterCall(load,50,$panel);
				}
			});
			
			//內部使用
			var loadTimes=1;
			function load($pan){
				$.get(url,function(data,status){
					if(status=='success'){
						$pan.append('<div style="background:#cff">loadTimes:'+(loadTimes++)+'</div>');
						$pan.append($(data)).find('div')
						.click(function(){
							alert('kk');
							//這算作弊嗎?科科…jQuery的selector太隨性了…
							//當然請記得產生了太多匿名函數會影響效率
						});
					}
					else alert('error while loading');

					return $pan[0].scrollHeight;
				});
			}
			
			//短時間( < delayTime )觸發太多次,只執行最後一次
			var laterCall=(function(){
				var timer=null;
				return function(fn, delayTime){
					var arg=Array.prototype.slice.call(arguments,2);
					if(timer!=null){
						clearTimeout(timer);
						timer=null;
					}
					timer=setTimeout(function(){
						fn.apply(null,arg);
					}, delayTime)
				}
			})()
		})
	};
	$('.testScroll').scrollLoad('sampleData.txt');
/* sampleData.txt:
<div style='background:#cfc'>test1</div>
<div>test</div>
<div>test</div>
<div>test</div>
<div style='background:#fcc'>test2</div>
<div>test</div>
<div>test</div>
<div>test</div>
<div style='background:#ccf'>test3</div>
*/
	
/*	寫成 extend之前的寫法
	$('.testScroll').scroll(function(){
		if(this.scrollTop+$(this).height()>=(this.scrollHeight-5)){
			$div=$(this);
			$.get('sampleData.txt',function(data,status){
				$div.append(data);
			});
		}
	});
//*/
});
</script></html>
測試檔案 scrollLoad.rar