1. 程式人生 > >JavaScript實現懶載入

JavaScript實現懶載入

常用的懶載入是圖片懶載入,jquery提供了很好的實現

本例要講的是對某一類進入【可視區域】的元素,進行懶載入

這裡的懶載入可以是載入一張圖片,也可是ajax非同步載入內容

比如:頁面如果非常豐富並且很長,需要使用者翻頁瀏覽的情況下

如果要對若干板塊進行懶載入,可以按照本例的思路簡單實現一個

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript">
	
	//dom載入完之後獲取各個容器距離容器頂部的高度
	var asyncOffsets = [];
	$(function(){
		asyncOffsets = getOffset();
		
		// 頁面載入完畢之後就主動觸發一次scroll事件,因為頁面頂部可能存在已經進入【可視區域】的元素
		$(window).trigger('scroll');
	});
	
	// 獲取每個div元素的偏移量
	function getOffset(){
		var offsets = [];
		$("div[async=async]").each(function(){
			offsets.push($(this).offset().top);
		});
		return offsets;
	}
	
	// 監聽視窗滾動事件
	$(window).scroll(function(){
		// 可視區域高度
		var see = $(this).height();
		// 當前文件整體高度
		var scroll = $(document).scrollTop();
		// 列印
		//console.info("可視區域高度:" + see + ";滾動條到頂部的高度:" + scroll);
		
		// 如果 (瀏覽器可視高度 + 當前滾動條高度 > 元素的offsetTop) 
		// 說明當前元素已經進入【可視區域】
		// 對當前進入可視區域的元素:觸發一些事件,比如是img標籤實現懶載入
		// 或者非同步載入一些區域的內容
		
		// 遍歷需要監聽【是否已進入可視區域的元素】,據此來觸發事件
		var current;
		for(var i=0;i<asyncOffsets.length;i++){
			if(see+scroll>asyncOffsets[i]){
				current = $("div[idx=" + (i+1) +"]");
				
				// 已經載入過的不再載入
				if("true"==current.attr("isloaded")){
					continue;
				}
				
				// 控制檯列印除錯資訊
				console.info(current.html());
				
				// 觸發非同步事件載入內容
				loading(i+1);
				
				
				// 一旦被載入過,就不再載入
				current.attr("isloaded","true");
				
			}
		}
			
	});
	
	// idx 為當前進入可視區域的物件,本例中就是一個div標籤
	// 可以在初始化整個頁面時就為每個div初始化一些引數,這樣div在進入可視區域時可以用到這些引數
	function loading(idx){
		$.ajax({
			type:'POST',
			url:'http://localhost/ServletJs/LoadServlet',
			data:{"idx":idx},
			dataType: 'html',
			async:true,
			success:function(msg){
				$("div[idx=" + idx +"]").html(msg);
			}
		});
	}
	
	
</script>
</head>
<body>
	<div idx="1" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 1</div>
	<div idx="2" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 2</div>
	<div idx="3" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 3</div>
	<div idx="4" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 4</div>
	<div idx="5" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 5</div>
	<div idx="6" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 6</div>
	<div idx="7" async="async" style="height:400px;width:400px;border:1px solid #CCC;float:left;">area 7</div>
	<div idx="8" async="async" style="height:400px;width:400px;border:1px solid #CCC;float:left;margin-left:20px;">area 8</div>
	<div idx="9" async="async" style="height:400px;width:800px;border:1px solid #CCC;clear:both;">area 9</div>
	<div idx="10" async="async" style="height:400px;width:800px;border:1px solid #CCC;">area 10</div>
</body>
</html>