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
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/ZheOneAndOnly/p/10704434.html
Copyright © 2011-2022 走看看