看来 lazyload.js 不能真正的实现数据动态加载了,只是一个样子,其实我们实现动态加载不过是为了减轻服务器的压力而已,lazyload.js 显示是个花架子,如何实现真正的动态加载,需要对lazyload.js做改装。
我认为,动态加载本质上都是一样的,即: 图片或者数据一开始不会被加载,当你触发了滚动条(说明你想继续看这个网站)那么图片或者数据开始加载。 那么实现的方法其实有很多,但是基本上都是通过替换的方式来实现的。
1. 土豆:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 能看的见到图片: <img src="http://at-img4.tdimg.com/board/2010/5/tylc-115X55.jpg"/> <div id="lazyBox" style="margin-top:100px;"> 一开始看不到的图片: <img width="120" height="90" style="border:1px solid blue;" class="lazyImg" alt="http://i01.img.tudou.com/data/imgs/i/051/720/095/p.jpg" src="http://css.tudouui.com/skin/__g/img/sprite.gif" coords="_DAA"/> <img width="120" height="90" style="border:1px solid blue;" class="lazyImg" alt="http://i01.img.tudou.com/data/imgs/i/051/871/396/m20.jpg" src="http://css.tudouui.com/skin/__g/img/sprite.gif" coords="_DBA"/> </div> <div style="height:1000px;"> </div> <script type="text/javascript"> var hasShow = false; $(window).bind("scroll",function(){ if(hasShow==true){ $(window).unbind("scroll"); return; } var t = $(document).scrollTop(); if(t>100){ // 滚动高度超过100时,加载图片 hasShow = true; $("#lazyBox .lazyImg").each(function(){ $(this).attr("src",$(this).attr("alt")); }); } }); </script>
2. 微博 ajax提取数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>图片动态加载示例</title> <style type="text/css"> img{border:0;} a{cursor:pointer;color:#014ccc;text-decoration:underline;} a:hover{text-decoration:none;} .clear{clear:both;height:0px;overflow:hidden;} .img_list{margin:0 auto;} .img_list li{list-style:none} .img_list .items{width:300px;margin:0 auto;} .img_list .item{float:left;margin-bottom:5px;font-size:14px;} .img_list .item .order{display:inline-block;*display:inline;*zoom:1;width:28px;color:#f30;} .img_list .item .i_thumb{width:300px;height:280px;} .img_list .item .i_title{width:100%;height:20px;} .showmore{height:35px;background:#f8f8f8;border-bottom:1px solid #cccccc;cursor:pointer;tetx-align:center;margin-bottom:25px;} .showmore .handle{display:block;height:35px;text-align:center;color:#909090;font-size:14px;text-decoration:none;line-height:35px;} .showmore .handle:hover{text-decoration:none;background:#e6e6e6;} </style> <script type="text/javascript" src="images_test/jquery-1.4.4.min.js"></script> </head> <body> <center><h1>图片动态加载示例</h1></center> <div class="img_list" id="img_list"> <div class="items" id="items"> <ul class="item"> <li class="i_thumb"><a href="http://www.xuekaifa.com" target="_blank" ><img src="images_test/1.jpg" /></a></li> <li class="i_title"><span class="order">1</span><a href="http://www.xuekaifa.com" target="_blank" >图片</a></li> </ul> <ul class="item"> <li class="i_thumb"><a href="http://www.xuekaifa.com" target="_blank" ><img src="images_test/2.jpg" /></a></li> <li class="i_title"><span class="order">2</span><a href="http://www.xuekaifa.com" target="_blank" >图片</a></li> </ul> <ul class="item"> <li class="i_thumb"><a href="http://www.xuekaifa.com" target="_blank" ><img src="images_test/3.jpg" /></a></li> <li class="i_title"><span class="order">3</span><a href="http://www.xuekaifa.com" target="_blank" >图片</a></li> </ul> <ul class="item"> <li class="i_thumb"><a href="http://www.xuekaifa.com" target="_blank" ><img src="images_test/4.jpg" /></a></li> <li class="i_title"><span class="order">4</span><a href="http://www.xuekaifa.com" target="_blank" >图片</a></li> </ul> <div class="clear"></div> </div> <div class="showmore" id="showmore" ><a class="handle" href="javascript:show()">显示更多结果</a></div> </div> <script type="text/javascript"> var iHeight = 0; var iTop = 0; var clientHeight = 0; var iIntervalId = null; var itemsSize = 0; var pageNo = 1; // 当前页数,默认设为第 1 页 var pageSize = 4; // 每页显示的数量 getPageHeight(); // 添加定时检测事件,每2秒检测一次 iIntervalId = setInterval("_onScroll();", 2000); // 取得当前页面显示所占用的高度 function getPageHeight() { if(document.body.clientHeight && document.documentElement.clientHeight) { clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight; } else { clientHeight = (document.body.clientHeight > document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight; } iHeight = Math.max(document.body.scrollHeight,document.documentElement.scrollHeight); } // 调用ajax取服务端数据 function show() { pageNo++; $.ajax({ url: 'img.php?p='+pageNo+'&r='+Math.random(), type: 'GET', dataType: 'text', timeout: 4000, beforeSend: showLoadingImg, error: showFailure, success: showResponse }); } function showLoadingImg() { $('#showmore').html('<a class="handle" href="javascript:show()"><img src="images_test/loading.gif" height="32px" />显示更多结果</a>'); } function showFailure() { $('#showmore').html('<font color=red> 获取查询数据出错 </font>'); } // 根据ajax取出来的json数据转换成html function showResponse(responseData) { var returnjson = eval("("+responseData+")"); itemsSize = returnjson.items.length; var nextpagehtml = ''; var pageOffset = (pageNo-1)*pageSize + 1; for(i=0; i<itemsSize; i++) { nextpagehtml += '<ul class="item">'; nextpagehtml += '<li class="i_thumb"><a href="http://www.xuekaifa.com" target="_blank" title="'+ returnjson.items[i].name +'"><img src="'+ returnjson.items[i].pic +'" alt="'+ returnjson.items[i].name +'" /></a></li>'; nextpagehtml += '<li class="i_title"><span class="order">'+ (pageOffset + i) +'</span><a href="http://www.xuekaifa.com" target="_blank" title="'+ returnjson.items[i].name +'">'+ returnjson.items[i].name +'</a></li>'; nextpagehtml += '</ul>'; } nextpagehtml += '<div class="clear"></div>'; $('#items').html($('#items').html() + nextpagehtml); // 当前页码数小于3页时继续显示更多提示框 if(pageNo < 3) { $('#showmore').html('<a class="handle" href="javascript:show()">显示更多结果</a>'); } else { clearInterval(iIntervalId); $('#showmore').hide(); } } // 判断滚动条是否到达底部 function reachBottom() { var scrollTop = 0; if(document.documentElement && document.documentElement.scrollTop) { scrollTop = document.documentElement.scrollTop; } else if (document.body) { scrollTop = document.body.scrollTop; } if((scrollTop > 0) && (scrollTop + clientHeight == iHeight)) { return true; } else { return false; } } // 检测事件,检测滚动条是否接近或到达页面的底部区域,0.99是为了更接近底部时 function _onScroll() { iTop = document.documentElement.scrollTop + document.body.scrollTop; getPageHeight(); if(((iTop+clientHeight)>parseInt(iHeight*0.99))||reachBottom()) { if(pageNo >= 3) { clearInterval(iIntervalId); $('#showmore').hide(); return; } show(); } }; </script> </body> </html>
img.php
<?php if($_GET['p'] == 2) { echo '{"items":[{"name":"新加载 图片 1","pic":"images_test/5.jpg"},{"name":"新加载 图片 2","pic":"images_test/6.jpg"}, {"name":"新加载 图片 3","pic":"images_test/7.jpg"}, {"name":"新加载 图片 4","pic":"images_test/8.jpg"}]}'; } elseif($_GET['p'] == 3) { echo '{"items":[{"name":"新加载 图片 5","pic":"images_test/9.jpg"},{"name":"新加载 图片 6","pic":"images_test/10.jpg"}, {"name":"新加载 图片 7","pic":"images_test/11.jpg"}, {"name":"新加载 图片 8","pic":"images_test/12.jpg"}]}'; } ?>
3. 淘宝产品介绍 支持垂直、水平或同时两个方向的延迟。
兼容:ie6/7/8, firefox 3.5.5, opera 10.10, safari 4.0.4, chrome 3.0
演示:http://www.cnblogs.com/cloudgamer/archive/2010/03/03/ImagesLazyLoad.html
下载:http://dl.iteye.com/topics/download/a9fe3611-6ce9-3013-a425-32c107d04451
4. 滚动显屏加载
demo 您可以狠狠地点击这里:jQuery滚动加载图片等demo
转:http://www.zhangxinxu.com/wordpress/?p=1259
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> <script type="text/javascript" src="http://www.zhangxinxu.com/study/js/mini/jquery.scrollLoading-min.js"></script> <script> $(function() { $(".scrollLoading").scrollLoading();}); </script>
表示所有class为scrollLoading的元素绑定了滚动加载的方法。
当然,不可能真的就如此简单,我们还需要做点小动作的。元素默认是不加载的,那么真正的加载地址显然要预先在元素上放置的,例如新浪微博默认把头像地址绑在了一个自定义的”dynamic-src”属性上,见下图:
在HTML5中,以data-开头的自定义属性都是合法的,且地址可以是图片,页面等。所以,我设定了绑定地址的自定义属性为”data-url”,此属性值设为真实的图片(或页面)地址就可以了。例如下面:
<div class="scrollLoading" data-url="loaded.html">加载中...</div>
会在滚动时加载名为loaded.html的页面,并自动替换里面的内容。
对于常用的图片,还有一点小问题,就是其默认的src图片地址。其src地址不能是真实的图片地址(否则会直接一次性全部加载),也不能是空地址或是坏地址,否则IE浏览器下会出现很惊悚的红叉叉。 。我的做法是默认链接的是一个1px * 1px的gif透明图片(大小很小),同时可以透出后面加载中gif动画图片,当滚动加载的时候直接把此gif图片替换掉。于是,对于图片,可能就有类似下面的代码:
<img class="scrollLoading" data-url="http://image.zhangxinxu.com/image/study/head/s180/1.jpeg" src="http://www.zhangxinxu.com/study/image/pixel.gif" width="180" height="180" style="background:url(http://www.zhangxinxu.com/study/image/loading.gif) no-repeat center;" />
scrollLoading是个很简单很小的插件(无注释YUI compressor min版仅508B),所以参数也很少,就一个,见下表:
attr | data-url | 获取元素加载地址的属性名 |
就这些了。此插件只适用于页面默认滚动条的动态加载。对于内部div之类的滚动加载不支持。
5. KISSY 库
主页: http://docs.kissyui.com/
淘宝
附件