rarala2020
@rarala2020 (ら らら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

下部までスクロールするたびに商品を追加表示させたい(楽天API)

プログラミング歴3ヶ月の初心者です。

楽天商品検索APIを活用し、商品リストを作成しているのですが
一度に大量の商品を取り込むと表示が遅いため、
下部までスクロールするたびに商品(ページ)を追加表示していくjs(jQuery)を書きたいのですが、
書き方が分からず苦戦しています。

どなたかご教示いただけませんでしょうか。

■やりたいこと
API取得時に、

・1ページあたりの取得件数(hits) ※1から30までの整数
・取得ページ数(page) ※1から100までの整数

の指定ができるため、一度に2ページ分の商品(60商品)を取り込み、
画面下部までスクロールすると追加で+2ページ分の商品を取り込むような処理を
js(jQuery)で書きたいです。

もしこれが複雑なようであれば、シンプルに1ページ(30商品)ずつ追加表示する方法でも良いです。

【参考】楽天商品検索API

スクロールイベントは下記のコードを参考に拝見していましたが、
このような処理をどこに記述すればよいかもわからない状態で、
現状のコード内にはスクロールイベントは記述していません。。
【参考】ページの下までスクロールしたときに何らかの処理を実行する例

■コード

index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="css/reset.css" />
    <link rel="stylesheet" href="css/style.css" />
    <script src="js/jquery-2.1.3.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <title>Document</title>
  </head>
  <body>

    <div class="cssgrid"> </div>


<script>
// ------------------
// グローバル変数
// ------------------
let APPID = "-------アプリID--------"; //アプリID *必須
let MAX_PAGE = 100; //最大取得ページ件数
let HITS = 30; //1ページ当たりの表示件数
let KEYWORD = encodeURIComponent("カラコン"); //絞り込みしたい単語

// ------------------
// 楽天API
// ------------------
$(function () {
  function put_item(item) {  
    let h = '<div>'
        + '<img src="'
        + item.mediumImageUrls[0].imageUrl.replace("?_ex=128x128","")
         + '" class="img">'
        + '<span><a href="'
        + item.affiliateUrl
        + '" target="_blank">●</a></span></div>';

    //ループで表示したいHTML部分を作成 
    $(".cssgrid").append(h);
  }

  //ajax
  function search_rakuten(page) {
    $.ajax({
      url:
        "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?format=json&applicationId=" +
        APPID +
        "&keyword=" +
        KEYWORD +
        "&page=" +
        page +
        "&hits=" +
        HITS,
      type: "get",
      dataType: "json",
      timeout: 10000,
      async: "true",
    })
      //読み込み成功時の処理
      .done(function (data) {
        // 1商品ずつhtml置く
        for (let i in data.Items) {
          put_item(data.Items[i].Item);
        }
        if (page < MAX_PAGE) {
            search_rakuten(page + 1);
        }
      })
      //読み込み失敗時の処理
      .fail(function (data) {
        console.log("読み込みエラー");
      });
  }
  search_rakuten(1);

});

</script>

</body>
</html>
0

1Answer

場所ですが、
$(function () {}の中に書けば動くと思います。
なので参考のスクロールのソースを例にすると


$(function () {

    $(window).bind("scroll", function () {
        scrollHeight = $(document).height();
        scrollPosition = $(window).height() + $(window).scrollTop();
        if ((scrollHeight - scrollPosition) / scrollHeight <= 0.05) {
            //スクロールの位置が下部5%の範囲に来た場合
            $('body').css('background', '#cc0000');
        } else {
            //それ以外のスクロールの位置の場合
            $('body').css('background', '#eeeeee');
        }
    });

    function put_item(item) {
        //省略
    }
});

これで動いたらあとは、ページ数を変数にもってスクロールの位置が下部5%の範囲に来た場合にsearch_rakuten()を実行するようにする感じでしょうかね。

1Like

Comments

  1. @rarala2020

    Questioner

    ありがとうございます!いただいた方法で実現することができました。

    ただAPIのリクエスト数が多すぎて読み込みエラーが起こるというあらたな問題に直面しました。。もしお時間があればこちらの投稿もご確認いただけますと幸いです。

    ■APIリクエスト数を抑えながら無限スクロールでコンテンツ追加を実現する方法
    https://qiita.com/rarala2020/questions/fd7172e36ce07c989b37

Your answer might help someone💌