ホームページ  >  記事  >  ウェブフロントエンド  >  AJAX を使用してウォーターフォール フローを実装する方法

AJAX を使用してウォーターフォール フローを実装する方法

php中世界最好的语言
php中世界最好的语言オリジナル
2018-04-03 13:43:481866ブラウズ

今回は、AJAX を使用してウォーターフォール フローを実装する方法と、AJAX を使用してウォーターフォール フローを実装する際の注意事項について説明します。以下に実際のケースを示します。

ウォーターフォール フローは、現在人気のある Web サイト インターフェイスのレイアウト方法であり、不均等な複数列のレイアウトと、最下部に到達したときの

自動読み込み メソッドにより、Web サイトの視覚的およびユーザー エクスペリエンスが大幅に向上します。このレイアウトを最初に使用したのは、海外の写真ウェブサイトである Pinterest でした。その後、Huaban.com、写真コミュニティの Lofter、Meilishuo、Mogujie など、いくつかの国内の写真ウェブサイトも 滝の流れのレイアウト を使用し始めました。ピンタレストに似ています。

滝の流れのレイアウトは、ほとんどの人にとって非常にシンプルで、列が数本しかないはずです。ウォーターフォール フローで最も重要なことは、データの非同期読み込みです。

まず、この例で使用されているウォーターフォール フロー手法について説明します。ウォーターフォール フロー レイアウトの実装方法については、Baidu で検索していただければさまざまな方法があるため、ここでは詳しく説明しません。この記事でのウォーターフォールフローの実装方法は4列レイアウト(li*4)で、各ピクチャは背景からデータを読み込んでから要素に割り当てます。ボックスを使用して、現時点で最も高さが小さい列 (li) を決定し、対応する列 (li) にボックスを追加して、次の判断を行います。このページ上のすべてのデータがロードされるまで、これが繰り返されます。

コード部分:

html+css

<!DOCTYPE html> 
<html> 
  <head> 
    <meta charset="UTF-8"> 
    <title>瀑布流布局</title> 
    <style type="text/css"> 
      *{ 
        margin: 0; 
        padding: 0; 
      } 
      ul{ 
        width: 1200px; 
        margin: 0 auto; 
      } 
      ul li{ 
        float: left; 
        width: 250px; 
        list-style: none; 
        margin: 20px; 
      } 
      ul li p{ 
        width: 250px; 
        margin-bottom: 20px; 
        padding: 10px; 
        box-sizing: border-box; 
        border-radius: 5px; 
        box-shadow: 2px 2px 10px #919B9C; 
      } 
      ul li img{ 
        width: 100%; 
        margin-bottom: 10px; 
      } 
      ul li p{ 
        font-family: "microsoft yahei"; 
        font-size: 14px; 
      } 
    </style> 
    <script src="ajax.js" type="text/javascript" charset="utf-8"></script> 
    <script src="pubuliu.js" type="text/javascript" charset="utf-8"></script> 
  </head> 
  <body> 
    <ul id="ul1"> 
      <li></li> 
      <li></li> 
      <li></li> 
      <li></li> 
    </ul> 
  </body> 
</html>
javascript部分:ajax部分と実装部分

/** 
 * 
 * @param {Object} method get和post方式 
 * @param {Object} url 文件路径 
 * @param {Object} data 页码 
 * @param {Object} success 成功的函数 
 */ 
function ajax(method, url, data, success) { 
  var xhr = null; 
  try { 
    xhr = new XMLHttpRequest(); 
  } catch (e) { 
    xhr = new ActiveXObject('Microsoft.XMLHTTP'); 
  } 
   
  if (method == 'get' && data) { 
    url += '?' + data; 
  } 
   
  xhr.open(method,url,true); 
  if (method == 'get') { 
    xhr.send(); 
  } else { 
    xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); 
    xhr.send(data); 
  } 
   
  xhr.onreadystatechange = function() { 
     
    if ( xhr.readyState == 4 ) { 
      if ( xhr.status == 200 ) { 
        success && success(xhr.responseText); 
        console.log(xhr.responseText); 
      } else { 
        alert('出错了,Err:' + xhr.status); 
      } 
    } 
     
  } 
}
ajax部分はAjaxの動作原理と以前に書いた関数の単純なカプセル化を理解した上で変更しています。基本的にこれを見るのは難しくありません。それと比較して、これにはデータ パラメーターが 1 つ増えています。データは、データの読み取りに使用されるページ番号です。

window.onload = function() { 
  //获取界面节点 
  var ul = document.getElementById('ul1'); 
  var li = document.getElementsByTagName('li'); 
  var liLen = li.length; 
  var page = 1; 
  var bool = false; 
  //调用接口获取数据 
  loadPage();//首次加载 
  /** 
   * 加载页面的函数 
   */ 
  function loadPage(){ 
    ajax('get', 'getPics.php', 'cpage='+page, function(data) { 
      //将数据库中获取的数据转换成数组形式,这里要根据数据库中的数据形式来写,这里我获取到的是json形式 
      var data = JSON.parse(data); 
      //将数据写入到p中 
      for(var i = 0; i < data.length; i++) { 
        var index = getShort(li);//查找最短的li 
        //创建新的节点:p>img+p 
        var p = document.createElement('p'); 
        var img = document.createElement('img'); 
        img.src = data[i].preview;//img获取图片地址 
        img.alt = "等着吧..." 
        //根据宽高比计算img的高,为了防止未加载时高度太低影响最短Li的判断 
        img.style.height = data[i].height * (230 / data[i].width) + "px"; 
        p.appendChild(img); 
        var p = document.createElement('p'); 
        p.innerHTML = data[i].title;//p获取图片标题 
        p.appendChild(p); 
        //加入到最短的li中 
        li[index].appendChild(p); 
      } 
      bool = true;//加载完成设置开关,用于后面判断是否加载下一页 
    }); 
  } 
   
  window.onscroll = function (){ 
    var index = getShort(li); 
    var minLi = li[index]; 
    var scrollTop = document.documentElement.scrollTop||document.body.scrollTop; 
     
    if(minLi.offsetHeight+minLi.offsetTop<scrollTop+document.documentElement.clientHeight){ 
      //开关为开,即上一页加载完成,才能开始加载 
      if(bool){ 
        bool = false; 
        page++; 
        loadPage(); 
      } 
    } 
  } 
 
} 
/** 
 * 获取数组中高度最小的索引 
 * @param {Object} li 数组 
 */ 
function getShort(li) { 
  var index = 0; 
  var liHeight = li[index].offsetHeight; 
  for(var i = 0; i < li.length; i++) { 
    if(li[i].offsetHeight < liHeight) { 
      index = i; 
      liHeight = li[i].offsetHeight; 
    } 
  } 
  return index; 
}
この部分の機能は主に、生成された p をページに動的に書き込むことであり、これにはボックスのスタイルの変更とデータの書き込みが含まれます。データは ajax 関数を通じてサーバーから取得されます。

このインスタンスの動作はサーバーに依存するため、簡単なサーバーをローカルに構築する必要があることに注意してください。

以下はデータ ソースの PHP コードです:

<?php 
header('Content-type:text/html; charset="utf-8"'); 
 
/* 
API: 
  getPics.php 
 
    参数 
    cpage : 获取数据的页数 
*/ 
$cpage = isset($_GET['cpage']) ? $_GET['cpage'] : 1; 
 
$url = 'http://www.wookmark.com/api/json/popular?page=' . $cpage; 
 
$content = file_get_contents($url); 
$content = iconv('gbk', 'utf-8', $content); 
 
echo $content;
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

Ajax + PHP データ相互作用の実装

Ajax ループの実装方法

以上がAJAX を使用してウォーターフォール フローを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。