お寿司か焼き肉食べたい

まじめな事からしょーもない事まで
めにゅーを開く(投げやり)

続きが気になるでおじゃる

良くあるパターン、もっと見る
一回一回通信を行うのではなく、画像プリロードを随時かけていこうという
そんな手法です。

デモっぽいもの

違いがよく分かるデモを用意しました。
※キャッシュが入ってしまうので、表示後スーパーリロード(Ctrl+F5)またはキャッシュをクリアしてリロードしてください。

  1. プリロード有りのスライド
  2. プリロード無しのスライド
  3. 全部一気に表示させてしまう

2と3は正直そこまで変わらないとは思いますが
1は断然早いです。ふふふ。

どうやってしてんねん!の簡単な解説

どうしてるって、もうこんな感じでimgタグを生成してます。

<img src="./img/dummy.png" data-imgSrc="./img/aircraftCarrier-001.jpg" width="218" height="300">

imgタグってのはdisplay:noneしようが、visibility: hiddenしようが
問答無用でリクエストを投げてロードするわけです
なので、デフォルトのsrcには1x1の透明pngを読ませています。
1つ読めば終わりなので最初の読み込みはこれで終わり。簡単軽いですね
で、本命の画像はdata-imgSrcという所に書いています。
必要なときにここから取ってきて、本来のsrc部分に埋め込んでいくってわけです。

htmlソース

一部抜粋です。

<div id="imgList">
  <div>
    <!-- コンテンツ1 -->
  </div>
  <div>
    <!-- コンテンツ2 -->
  </div>
  <div>
    <!-- コンテンツ3 -->
  </div>
</div>
<div class="moreBtn">
  <p><a href="javascript:void(0);" id="newMore">もっと見る</a></p>
  <p><a href="#" id="newMore">一覧へ</a></p>
</div>

#imgListを親として、その子供のdiv要素を1コンテンツとして順番に出しています。
1ブロック=1コンテンツで考えていますのでdivです。
そして、レガシーブラウザの事をきちんと考えてあげているのでdivです!!!!!

JSソース

$(function(){

  var viewMoreCnt    = 0, // 新着用
      viewMoreMaxCnt = $('#imgList').children().length; // 新着用

  //-------------------------------------------
  // 新着用の初期動作
  //-------------------------------------------
  moreInit();

  /*--------------------------------------------
   *
   * イベントバインド
   * もっと見る
   *
   --------------------------------------------*/
  $('#newMore').on('click',function()
  {
    var thisCnt           = viewMoreCnt,
        nextElem          = $('#imgList').children().eq(viewMoreCnt),
        nextElemOffsetTop;

    //--------------------------------------------------
    // 次の要素の画像をセット
    // カウントが更新されるのでエレメント変数書き換え
    //--------------------------------------------------
    viewMoreCnt = viewImg(nextElem,viewMoreCnt);

    //-------------------------------------------
    // 次の要素を表示させる
    //-------------------------------------------
    nextElem.slideDown(400);
    nextElemOffsetTop = $('#imgList').children().eq(thisCnt).offset().top;
    $('body,html').animate({scrollTop:nextElemOffsetTop}, 400, 'swing');

    //-------------------------------------------
    // 次がもう無い場合は切替
    //-------------------------------------------
    if(viewMoreMaxCnt == viewMoreCnt)
    {
      $('.moreBtn').children().eq(0).hide();
      $('.moreBtn').children().eq(1).show();
    }
    else
    {
      //-------------------------------------------
      // 次の要素をプリロードしておく
      //-------------------------------------------
      nextElem    = $('#imgList').children().eq(viewMoreCnt);
      nextPreload(nextElem,viewMoreCnt);
    }
  });

  /**********************************************
   *
   * moreInit
   * もっと見る系の初期値設定
   *
   * @param none
   * @return none
   *
   **********************************************/
  function moreInit()
  {
    var thisElem = $('#imgList').children().eq(viewMoreCnt);

    //-------------------------------------------
    // 次に表示させる画像をプリロードする
    //-------------------------------------------
    nextPreload(thisElem,viewMoreCnt);

    //-------------------------------------------
    // 次に表示させる画像を表示させる
    //-------------------------------------------
    viewMoreCnt = viewImg(thisElem,viewMoreCnt);
    thisElem = $('#imgList').children().eq(viewMoreCnt);

    //-------------------------------------------
    // 次に表示させる画像をプリロードする
    //-------------------------------------------
    nextPreload(thisElem,viewMoreCnt);
  }

  /**********************************************
   *
   * nextPreload
   * 次表示予定の画像群を一括プリロード
   *
   * @paran nextCnt int 対象要素のカウント
   * @return none
   *
   **********************************************/
  function nextPreload(elememt,nextCnt)
  {
    var srcArr = new Array();
        i = 0;

    elememt.find('img').each(function()
    {
      srcArr.push($(this).attr('data-imgSrc'));
      i++;
    });
    preloadImages(srcArr);
  }

  /**********************************************
   *
   * viewImg
   * 画像自体はプリロード済なので
   * data-imgSrcをsrcに入れて実画像表示状態にする
   *
   * @paran nextCnt int 対象要素のカウント
   * @return nextCnt int 対象要素のカウント(カウントアップ済)
   *
   **********************************************/
  function viewImg(elememt,nextCnt)
  {
    elememt.find('img').each(function()
    {
      $(this).attr('src',$(this).attr('data-imgSrc'));
    });

    nextCnt++;
    return nextCnt;
  }

  /**********************************************
   *
   * preloadImages
   * プリロード本処理
   *
   * @param none
   * @return none
   *
   **********************************************/
  function preloadImages(srcArr)
  {
    for(var i = 0; i<srcArr.length; i++)
    {
      $("<img>").attr("src", srcArr[i]);
    };
  };
});

【preloadImages】【viewImg】【nextPreload】は本処理として
流用できるように作っているので、実際に複数の「もっとみる」が入る場合は
最初の変数定義の所とイベントバインドとinit関数をコピペして作って上げれば
他干渉はしないはずですので大丈夫だと思われます。

補足

もっと見るがない所には読み込ませないようにしてください。
また、不要なイベントバインドなどもさせないよう、他から丸コピする時は
ご注意ください!