Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
jQuery Mobile逆引きリファレンス

jQuery Mobile逆引きリファレンス

スクロール時に追加的にコンテンツを読み込むには?

2014年10月9日

スクロールの開始/終了のタイミングで発生するscrollstart/scrollstopイベントの基本的な使い方を説明。また、画面を縦方向にスクロールするためのsilentScrollメソッドについても紹介する。

  • このエントリーをはてなブックマークに追加

jQuery Mobileとは?

 jQuery Mobileは、jQueryを拡張するライブラリ(プラグイン)の一種で、名前の通り、スマホ/タブレットに代表されるモバイル対応アプリを開発するための機能を提供します。jQuery Mobileの導入方法や使い方、jQuery Mobileが提供する主要機能については、「jQuery Mobile逆引きリファレンス: jQuery Mobileを利用するには?」を参照してください。

 jQuery Mobileでは、スクロールの開始/終了を検知するために、以下のようなイベントが用意されています。

イベント発生タイミング
scrollstart スクロールを開始したとき
scrollstop スクロールを終了したとき
スクロール関連のイベント

 以下では、scrollstopイベントを利用して、スクロールによってコンテンツの末尾まで到達すると、追加のコンテンツを動的に取得し、ページに反映する例を示します。これによって、最初から全てのコンテンツをロードしなくて済むので、通信量の節減になります。

HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>jQuery Mobile</title>
<link rel="stylesheet"
  href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css" />
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js">
</script>
<script>
$(document).on('pagecreate', function(e, d) {
  // 追加コンテンツを読み込み済みか(フラグ変数)
  var read = false;

  // 1スクロール終了時にページ末尾に到達していたら、追加コンテンツをロード
  $(window).on('scrollstop', function(e) {

    // 追加コンテンツを読み込み済みであれば、処理を終了
    if (read) { return; }

    // 2ページ末尾に到達しているかを判定
    if ($(this).scrollTop() + $(this).height() > $(document).height() - 50) {

      // 3「現在のページ.dat」を取得&ページ末尾に追加
      $.get($.mobile.path.parseLocation()['filename'] + '.dat')
        .done(function(data){
          $('#page_main').append(data);
          // フラグをtrueに反転
          read = true;
        });
    }
  });
});
</script>
</head>
<body>
<div data-role="page" data-title="jQuery Mobile">
  <div data-role="header">
    <h1>jQuery Mobile</h1>
  </div>
  <div id="page_main" role="main" class="ui-content">
    <p>ほげほげほげほげ</p>
    <p>ほげほげほげほげ</p>
    ……中略……
    <p>ほげほげほげほげ</p>
  </div>
  <div data-role="footer">
    Copyright 1998-2014, YAMADA.Yoshihiro
  </div>
</div>
</body>
</html>
ページ末尾までスクロールすると、追加のコンテンツを読み込むコード(scroll.html)
HTML
<p>HogeHogeHogeHoge</p>
<p>HogeHogeHogeHoge</p>
……中略……
<p>HogeHogeHogeHoge</p>
追加で読み込まれる予定のコンテンツ(scroll.html.dat)
下にスクロールすると……

下にスクロールすると……

スクロールによって続きのコンテンツが読み込まれた

 ページ本体のスクロールを検知したいので、scrollstart/scrollstopイベントは、$(window)に対してひも付けます(1)。

 ページ末尾に到達しているかどうかを判定しているのは2のコードです。$(this)は、この場合、イベント発生元である$(window)を表していますので、$(this).scrollTop()は現在のスクロール位置を、$(this).height()は現在の表示領域の高さを、それぞれ表します。つまり、これらを合算したものが、ページで現在表示している領域の下位置を意味します(次の図の左側で説明している部分)。そして、この値を仮に「a」とします。

スクロール位置の判定

 一方、$(document).height()はドキュメント全体の高さを表しますので、「そこから50を引いたものが先ほど求めた値aよりも小さい」とは、現在の表示位置がページ末尾から50px上の部分まで到達している、ことを意味します。

 50pxはいわゆる先読みのための“あそび”です。コンテンツの読み込みにはいくらかの時間がかかるため、ユーザーにとってはそこにもたつきを感じてしまいます。よって、末端に行き着く直前に読み込みを開始することで、スムーズなスクロールを実現しているのです。

 あとは、現在のファイル名を基に追加のコンテンツをロードするだけです(3)。現在のページが「scroll.html」であれば、「scroll.html.dat」をロードします。現在のファイル名を取得するparseLocationメソッドについては、別稿「$.mobile.pathオブジェクトでパス/URLの情報を取得/操作するには?」を参照してください。

 $.getメソッドで取得したコンテンツは、appendメソッドでページの末尾に追加します。また、同じコンテンツを重複して読み込まないよう、フラグ変数readを「true」に反転しておきます。以降、フラグ変数readが「true」の場合は、読み込みの処理をスキップします。

補足:JavaScriptコードからスクロールする

 jQuery Mobileでは、画面を縦方向にスクロールするためのsilentScrollメソッドがあります。

[構文]silentScrollメソッド

$.mobile.silentScroll([yPos])

  • yPos:スクロール先のY座標
JavaScript
$('#btn').click(function(e) {
  $.mobile.silentScroll(0);
});
ボタンクリックでページ先頭に移動するコード

 引数yPosが「0」であるとは、「ページの先頭に移動しなさい」という意味です。デフォルト値も「0」なので、サンプルのコードは単に「$.mobile.silentScroll();」としても同じ意味です。

 なお、silentScrollメソッドはスクロールイベントを発生しません。つまり、scrollstart/scrollstopなどのイベントは、silentScrollメソッドによって発生しないということです。「silent」(無音の)という名前のゆえんです。

※以下では、本稿の前後を合わせて5回分(第35回~第39回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

jQuery Mobile逆引きリファレンス
35. ページのロード/切り替え時に初期化/後処理を実行するには?

ページを表示/切り替えするタイミングで発生するイベントにはどのようなものがあるのか。ページイベントの基本的な利用方法を説明する。

jQuery Mobile逆引きリファレンス
36. ページレイアウトが変更したときに処理を実行するには?

ウィジェットのレイアウト状態が変化したとき(例えば開閉パネルが開いた/閉じたときなどに)、処理を実行する方法を説明する。

jQuery Mobile逆引きリファレンス
37. data-defaults/data-enhanced属性でページの描画を高速化するには?

jQuery Mobileでパフォーマンスを改善する方法を解説。ウィジェットの動作パラメーターをデフォルト設定して解釈処理をスキップする方法と、文書ツリーの一部を手書きして自動生成をスキップする方法について紹介する。

jQuery Mobile逆引きリファレンス
38. 【現在、表示中】≫ スクロール時に追加的にコンテンツを読み込むには?

スクロールの開始/終了のタイミングで発生するscrollstart/scrollstopイベントの基本的な使い方を説明。また、画面を縦方向にスクロールするためのsilentScrollメソッドについても紹介する。

jQuery Mobile逆引きリファレンス
39. モバイル端末を縦横回転させたときにレイアウトを調整するには?

端末の回転を検知できるorientationchangeイベントを説明して、端末が縦置きの場合は縦並びに、横置きの場合は横並びに表示する方法を説明する。

サイトからのお知らせ

Twitterでつぶやこう!