zoukankan      html  css  js  c++  java
  • 服务器代理+jQuery.ajax实现图片瀑布流

    • 服务器代理机制破解浏览器的同源策略
    • 瀑布流功能实现分析
    • 具体实现代码及业务实现分析

     一、服务器代理机制破解浏览器同源策略

    由于浏览器的同源策略无法请求不同域名下的资源,但是服务器的后台程序并不受同源策略的限制,所以就可以通过服务器的后台程序获取其他域名下的资源,然后再发送给浏览器,本质上还是在同源策略下实现的,毕竟服务器没有跨域这一说法,这种机制叫做服务器代理。(这篇博客不是为了解析服务器代理,所以不对服务器代理的实现做什么分析,只简单的描述浏览器在同源基础上获取其他域名下的资源)。

     二、瀑布流功能实现分析

     

    1.初始加载页面时获取一次服务器资源,将获取的资源根据每列的高度以最小原则添加图片。

    2.当滚动条下滑时,出现空白区域时,即滚动条滚动的位置加上视窗的高度大于最小高度列的高度。触发加载资源,再添加图片。

    需要的数据:

    视窗高度:window.innerHeight(原生BOM属性);$(window).height();(jQuery方法)。

    滚动条的位置:

    谷歌浏览器和未声明DTD <! DOCTYPE>获取滚动条的位置:document.body.scrollTop; 

    火狐和其他浏览器:document.bodyElement.scrollTop;

    IE9+ 和 最新浏览器都支持:window.pageXOffset;     pageYOffset(scrollTop);

    兼容: var scrollTop = window.pageYOffset ||document.documentElement.scrollTop || document.body.scrollTop || 0;

    jQuery:$(window).scrollTop();

     三、具体实现代码及业务实现分析

     

    web层:这里我使用了百度的资源,data数据能获取,但是由于百度图片有保护措施,最后获取的都是一张替代图片,但是不影响我们实现瀑布流功能。下面是实现服务器代理机制的PHP内容:(rn是一次请求数据的个数,可自己根据需求设置,其他数据大家自己去查吧,方正都没啥用,因为图片都是那张替代图片,但是连接是真实的)

    图片API 通用接口

    <?php
    header('Content-type:text/html; charset="utf-8"');
    $url = 'http://image.baidu.com/data/imgs?col=美女&tag=小清新&sort=10&pn=1&rn=20&p=channel&from=1';
    $content = file_get_contents($url);
    echo $content;
    ?>

    通讯层:

     1 function getData(){
     2     if(!flag){
     3         flag = true;
     4         $.ajax({
     5             type:'GET',
     6             url:'http://localhost/jy_11_12_13/11_1/src/getPics.php?',
     7             success:addDom,
     8             beforeSend:function(){
     9                 $('.loading').show();//请求成功前显示loading
    10             },
    11             error:function(){
    12                 console.log('error');
    13             }
    14         });
    15     }
    16 }

    根据数据-插入结构:

     1 function addDom(data){
     2     $('.loading').hide();//请求成功后隐藏loading
     3     // var oJSON = (new Function('return ' + data))();//标准JSON数据格式解释方法
     4     var oJSON = eval("(" + data + ")");//数据不是标准JSON格式,只能采用eval来解析
     5     var dataList = oJSON.imgs;
     6     dataList.pop();//清除最后一个空数据
     7     console.log(dataList);//在控制台打印数据,查看数据是否跟需求一致
     8     if(dataList.length > 0){
     9         //拿到数据后,遍历数据插入结构
    10         dataList.forEach(function(ele,index){
    11             var iDiv = $('<div class="item"></div>');
    12             var imgBox = $('<div class="image"></div>');
    13             var oImg = new Image();
    14             var oP = $('<p></p>');
    15             oP.text(ele.title);
    16             oImg.src = ele.imageUrl;
    17             //当图片获取到了以后插入页面
    18             oImg.onload = function(){
    19                 imgBox.append(oImg);
    20                 iDiv.append(imgBox).append(oP);
    21                 //获取最短的li的索引
    22                 var index = getMinList(oLi);
    23                 $(oLi[index]).append(iDiv);
    24             }
    25         });
    26     }
    27     num ++;//这个数据是用来记录页的,之前的一个数据可以实现分页请求,
    28     flag = false;//结构添加完成后将锁开启
    29 }

    滚动操作:

     1 //获取最短li的索引函数
     2 function getMinList(dom){
     3     var minHeight = parseInt($(dom[0]).css('height'));
     4     var index = 0;
     5     for(var i = 1; i < oLi.length; i++){
     6         var height = parseInt($(dom[i]).css('height'));
     7         if(height < minHeight){
     8             minHeight = height;
     9             index = i;
    10         }
    11     }
    12     return index;
    13 }
    14 //往下滑动时
    15 //当滚动条的位置加上窗口高度大于最短的li,再次加载
    16 $(window).scroll(function() {
    17     var scrollHeight = $(window).scrollTop();//获取滚动条位置
    18     var clientHeight = $(window).height();//获取视窗高度
    19     var minLiH = parseInt($(oLi[getMinList(oLi)]).css('height'));//获取最短列的高度
    20     if(scrollHeight + clientHeight > minLiH){//当出现空白区域时调用网络请求加载数据
    21         getData();
    22     }
    23 });

    最后全部代码(折叠);

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     6     <title>jQuery瀑布流(服务器代理)</title>
     7     <link rel="stylesheet" href="./css/index.css">
     8 </head>
     9 <body>
    10     <div class="wrapper">
    11         <ul>
    12             <li>
    13                 <div class="item">
    14                     <div class="image">
    15                         <img src="./image/0.png" alt="">
    16                         <p>我是title</p>
    17                     </div>
    18                 </div>
    19             </li>
    20             <li>
    21                 <div class="item">
    22                     <div class="image">
    23                         <img src="./image/1.png" alt="">
    24                         <p>我是title</p>
    25                     </div>
    26                 </div>
    27             </li>
    28             <li>
    29                 <div class="item">
    30                     <div class="image">
    31                         <img src="./image/2.png" alt="">
    32                         <p>我是title</p>
    33                     </div>
    34                 </div>
    35             </li>
    36             <li>
    37                 <div class="item">
    38                     <div class="image">
    39                         <img src="./image/3.png" alt="">
    40                         <p>我是title</p>
    41                     </div>
    42                 </div>
    43             </li>
    44         </ul>
    45         <div class="loading">Loading...</div>
    46     </div>
    47     <script type="text/javascript" src="./js/jquery-2.0.3.js"></script>
    48     <script type="text/javascript" src="./js/index.js"></script>
    49 </body>
    50 </html>
    HTML
     1 *{
     2     margin: 0;
     3     padding: 0;
     4     list-style: none;
     5 }
     6 .wrapper{
     7     /* 最小宽度 */
     8     min-width: 930px;
     9     margin: 0 auto;
    10     text-align: center;
    11 }
    12 .wrapper ul{
    13     display: inline-block;
    14 }
    15 .wrapper ul::after{
    16     content: "";
    17     clear: both;
    18     display: block;
    19 }
    20 .wrapper li{
    21     float: left;
    22 }
    23 .wrapper li .item{
    24     width: 200px;
    25     margin: 0 5px 10px;
    26     padding: 10px;
    27     border: 1px solid #ccc;
    28 }
    29 .wrapper li .item .image{
    30     width: 200px;
    31 }
    32 .wrapper li .item .image img{
    33     width: 200px;
    34 }
    35 .wrapper .loading{
    36     font-size: 30px;
    37     font-weight: bolder;
    38     color: #ccc;
    39 }
    CSS
     1 var num = 1;
     2 var flag = false;//加锁
     3 var oLi = $('li');
     4 getData();
     5 function getData(){
     6     if(!flag){
     7         flag = true;
     8         $.ajax({
     9             type:'GET',
    10             url:'http://localhost/jy_11_12_13/11_1/src/getPics.php?',
    11             success:addDom,
    12             beforeSend:function(){
    13                 $('.loading').show();//请求成功前显示loading
    14             },
    15             error:function(){
    16                 console.log('error');
    17             }
    18         });
    19     }
    20 }
    21 function addDom(data){
    22     $('.loading').hide();//请求成功后隐藏loading
    23     // var oJSON = (new Function('return ' + data))();//标准JSON数据格式解释方法
    24     var oJSON = eval("(" + data + ")");//数据不是标准JSON格式,只能采用eval来解析
    25     var dataList = oJSON.imgs;
    26     dataList.pop();//清除最后一个空数据
    27     console.log(dataList);//在控制台打印数据,查看数据是否跟需求一致
    28     if(dataList.length > 0){
    29         //拿到数据后,遍历数据插入结构
    30         dataList.forEach(function(ele,index){
    31             var iDiv = $('<div class="item"></div>');
    32             var imgBox = $('<div class="image"></div>');
    33             var oImg = new Image();
    34             var oP = $('<p></p>');
    35             oP.text(ele.title);
    36             oImg.src = ele.imageUrl;
    37             //当图片获取到了以后插入页面
    38             oImg.onload = function(){
    39                 imgBox.append(oImg);
    40                 iDiv.append(imgBox).append(oP);
    41                 //获取最短的li的索引
    42                 var index = getMinList(oLi);
    43                 $(oLi[index]).append(iDiv);
    44             }
    45         });
    46     }
    47     num ++;//这个数据是用来记录页的,之前的一个数据可以实现分页请求,
    48     flag = false;//结构添加完成后将锁开启
    49 }
    50 //获取最短li的索引函数
    51 function getMinList(dom){
    52     var minHeight = parseInt($(dom[0]).css('height'));
    53     var index = 0;
    54     for(var i = 1; i < oLi.length; i++){
    55         var height = parseInt($(dom[i]).css('height'));
    56         if(height < minHeight){
    57             minHeight = height;
    58             index = i;
    59         }
    60     }
    61     return index;
    62 }
    63 //往下滑动时
    64 //当滚动条的位置加上窗口高度大于最短的li,再次加载
    65 $(window).scroll(function() {
    66     var scrollHeight = $(window).scrollTop();//获取滚动条位置
    67     var clientHeight = $(window).height();//获取视窗高度
    68     var minLiH = parseInt($(oLi[getMinList(oLi)]).css('height'));//获取最短列的高度
    69     if(scrollHeight + clientHeight > minLiH){//当出现空白区域时调用网络请求加载数据
    70         getData();
    71     }
    72 });
    JS
  • 相关阅读:
    Linux系统:Centos7搭建Redis单台和集群环境
    Linux系统:Centos7安装Jdk8、Tomcat8、MySQL5.7环境
    Linux系统:常用Linux系统管理命令总结
    转--->svn的使用
    开发中常见的问题
    1.NSThread
    用NSOperation和NSOperationQueue实现多线程编程
    很实用的时间比对算法
    简单的IOS6和IOS7通过图片名适配
    nginx完美支持tp框架
  • 原文地址:https://www.cnblogs.com/ZheOneAndOnly/p/10704434.html
Copyright © 2011-2022 走看看