AJAX实现瀑布流触发分页与分页触发瀑布流的方法


Posted in Javascript onMay 23, 2016

所谓的瀑布流效果就正如轻图床首页效果那样,多个内容相近的栏目紧密排列,尽量使到栏目间的间隙最小(即流体布局),并且随着页面滚动条向下滚动,新的数据会追加至当前页面的尾部直到所有数据加载完毕(滚动触发的 Ajax 翻页)。

瀑布流触发分页

这里说一下思路,虽然下面的实例中不能全都用到:
1.当进入屏幕时,判断内容是否为空,如果不为空,开始初始化数据。
2.当往屏幕下拉时,判断数据的最底部与屏幕高度+滚动的高度的大小。如果最底部小于上面两者之和,重新请求接口,即加载数据。
3.当遇到数据超过某个页数时,停止加载或者用分页的形式显示,点击再显示内容。

var intf_url="http://3water.com/intf";
var pathUrl = "http://3water.com/";
var page=1;
var isLoadRB=false; 
var ul_select=$("#fansList");
var btn_more=$("#loading");
if(ul_select.length <1) return ;
var is_more =true;
//跨域请求接口
function loadjs(src,callback){
 var js= document.createElement('script');
 js.src = src;
 js.onreadystatechange = js.onload =function(){
 if(!js.readyState || js.readyState=='loaded'
  || js.readyState=='complete'){
  if(callback){callback()||callback};
 }
};
js.charset="utf-8";
document.getElementsByTagName('head')[0].appendChild(js);
}
//回调函数
function fill(data){
if(data.pageCount==data.pageNo){
 is_more=false;//如果数据全部加载完毕,取消加载
    $("#loading").html("加载完毕");
}
}
//解析接口
function queryIntf(){
var url=page==1?intf_url+".json":intf_url+"_page"+page+".json";
loadJs(url,callback);
}
function callback(){
page++;
}
/*判断是否要加载接口*/
function needtoloadRB(){
 var btn_top=btn_more.offset().top;
 var window_height=$(window).height();
 var scroll_Top=$(window).scrollTop();
 return btn_top<scroll_Top+window_height?true:false;
}
$(window).scroll(function(){
 var _needload=needtoloadRB();
 if(_needload && isLoadRB==false &&is_more){isLoadRB=true;queryintf();}
})
window.onload = function(){
 queryintf(); 
}

以上就是比较简单的随着下拉内容不断加载的思路代码。

JSON格式类似于(如果是动态接口,可以通过callback函数,则这里不用加fill()):

fill({"fans":[{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"},{"nickname":"蔡宝坚","website":"3water.com","youzhi":"2.5","time":"3分钟前"}],"pageCount":2,"pageNo":1,"pageSize":10,"totalSize":20
});

原来静态也可以做接口回调。通过静态处理,则大大缓解了服务器压力和加速生成内容,是大流量网站必备的处理方式。

jQuery的ajax方法实现分页触发瀑布流

1.通过 Ajax 的方式获取下一页的内容
我们需要网页中具有如下 HTML 结构的导航, next_link 为下一页的 url。

<div id="page_nav">
  <a href="next_link">下一页</a>
</div>

相应的 css

#page_nav {clear: both; text-align: center; }

以下这段代码为通过 Ajax 的方式获取下一页的内容,并追加到当前内容的末尾。

nextHref = $("#next_page a").attr("href");
// 给浏览器窗口绑定 scroll 事件
$(window).bind("scroll",function(){
  // 判断窗口的滚动条是否接近页面底部
  if( $(document).scrollTop() + $(window).height() > $(document).height() - 10 ) {
    // 判断下一页链接是否为空
    if( nextHref != undefined ) {
      // Ajax 翻页
      $.ajax( {
        url: $("#page_nav a").attr("href"),
        type: "POST",
        success: function(data) {
          result = $(data).find("#thumbs .imgbox");
          nextHref = $(data).find("#page_nav a").attr("href");
          $("#page_nav a").attr("href", nextHref);
          $("#thumbs").append(result);
        }
      });
    } else {
      $("#page_nav").remove();
    }
  }
});

2.对追加的内容进行流体布局
熟悉 jQuery 的童鞋应该会了解 js 对于通过 Ajax 方式插入到页面中的元素并不起作用,但在这里并不需要作出如使用 live() 等处理,因为 Masonry 已经在内部作出类似的处理并且默认起效,因此只需在 Ajax 成功执行后的回调函数中调用 masonry() 方法即可。

$newElems = $result;
$newElems.imagesLoaded(function(){
  $container.masonry( 'appended', $newElems, true );
});

3.对 Ajax 翻页过程作出修饰
在上面的过程中已经有完整的瀑布流布局,但是翻页过程中并没有任何提示,而且直接插入多张图片可能会影响用户体验,因此需要对翻页过程作出一些修饰,下面给出完整代码。
这里需要增加一个如下的元素,用于提示正在加载新内容或提示已到了最后一页。

<div id="page_loading">
  <span>给力加载中……</span>
</div>

相应的 css

#page_loading {display: none; background: #111111; opacity: 0.7; height: 60px; width: 220px;  padding: 10px; position: absolute; bottom: -50px; left: 330px; }

下面是完整的 Ajax 翻页代码
nextHref = $("#next_page a").attr("href");
// 给浏览器窗口绑定 scroll 事件
$(window).bind("scroll",function(){
  // 判断窗口的滚动条是否接近页面底部
  if( $(document).scrollTop() + $(window).height() > $(document).height() - 10 ) {
    // 判断下一页链接是否为空
    if( nextHref != undefined ) {
      // 显示正在加载模块
      $("#page_loading").show("slow");
      // Ajax 翻页
      $.ajax( {
        url: $("#page_nav a").attr("href"),
        type: "POST",
        success: function(data) {
          result = $(data).find("#thumbs .imgbox");
          nextHref = $(data).find("#page_nav a").attr("href");
          $("#page_nav a").attr("href", nextHref);
          $("#thumbs").append(result);
          // 把新的内容设置为透明
          $newElems = result.css({ opacity: 0 });
          $newElems.imagesLoaded(function(){
            $container.masonry( 'appended', $newElems, true );
            // 渐显新的内容
            $newElems.animate({ opacity: 1 });
            // 隐藏正在加载模块
            $("#page_loading").hide("slow");              
          });
 
        }
      });
    } else {
      $("#page_loading span").text("木有了噢,最后一页了!");
      $("#page_loading").show("fast");
      setTimeout("$('#page_loading').hide()",1000);
      setTimeout("$('#page_loading').remove()",1100);
    }
  }
});
Javascript 相关文章推荐
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
js 页面元素的几个用法总结
Nov 18 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
jquery让指定的元素闪烁显示的方法
Mar 17 Javascript
javascript实现查找数组中最大值方法汇总
Feb 13 Javascript
vue-router 学习快速入门
Mar 01 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
Sep 25 Javascript
如何根据业务封装自己的功能组件
Apr 19 Javascript
js 判断当前时间是否处于某个一个时间段内
Sep 19 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
jQuery Mobile中的button按钮组件基础使用教程
May 23 #Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
May 23 #Javascript
jQuery插件formValidator实现表单验证
May 23 #Javascript
超链接怎么正确调用javascript函数
May 23 #Javascript
以WordPress为例讲解jQuery美化页面Title的方法
May 23 #Javascript
jQuery中选择器的基础使用教程
May 23 #Javascript
基于BootStrap的图片轮播效果展示实例代码
May 23 #Javascript
You might like
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
python清除字符串里非数字字符的方法
2015/07/02 Python
Python 的描述符 descriptor详解
2016/02/27 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
学校百日安全生产活动总结
2014/07/05 职场文书
民族精神月活动总结
2014/08/28 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
Go语言grpc和protobuf
2022/04/13 Golang