jsonなどの情報を使って一覧表示をした際に、ページを分割してページャーで切り替えられるようにする処理をjQueryで実装してみます。
サンプルコード
今回はサンプルとしてこのようなjsonファイルを用意しました。
{ "data": [ { "title": "記事001", "body": "記事001の内容" }, { "title": "記事002", "body": "記事002の内容" }, 〜 略 〜 { "title": "記事100", "body": "記事100の内容" } ] }
一覧とページ送りを追加するエリアを用意します。
<div id="js-article"></div> <div id="js-pager"></div>
JavaScriptで記事やページ送りを表示する処理を記述します。
var pagerOptions = { paramKey: 'page', // 何ページ目かを示すパラメータのキー articleCount: 10, // 1ページあたりに表示させる記事の件数 pagerMaxCount: 5 // ページ送りの最大数 }; var jsonPath = 'data.json'; // 記事情報のjsonのパス var outputArticle = "#js-article"; // 記事一覧の出力先 var outputPager = "#js-pager"; // ページ送りの出力先 $(function(){ var currentNumber = get_current_page_number(pagerOptions['paramKey']); // ajaxで記事情報を取得 $.ajax({ url: jsonPath, cache: false }) .then( function (data) { generate_article_result(data, currentNumber); generate_pager(data, currentNumber); }, function () { console.log('取得に失敗しました。'); } ); }); /** * ページャーの現在のページ数を取得する * @param {string} key (required) パラメータのkey */ function get_current_page_number(key) { // URLからパラメータ取得 var params = []; var param = location.search.substring(1).split('&'); for(var i = 0; i < param.length; i++) { params[i] = param[i].split('='); } var current = 1; for(var i = 0; i < params.length; i++) { if(params[i][0] === key) { current = parseFloat(params[i][1]); break; } } return current; } /** * 記事の表示 * @param {object} articleData (required) 記事情報 * @param {array} current (required) 現在のページ数 */ function generate_article_result(articleData, current) { var data = articleData['data']; var first = (pagerOptions['articleCount'] * (current - 1)); var ins = ''; for (var i = first; i < Math.min(first + pagerOptions['articleCount'], data.length); i++) { ins += '<div class="article">'; ins += '<p class="article_ttl">'; ins += data[i]['title']; ins += '</p>'; ins += '</div>'; } $(outputArticle).html(ins); } /** * ページャーの表示 * @param {object} articleData (required) 記事情報 * @param {array} current (required) 現在のページ数 */ function generate_pager(articleData, current) { var data = articleData['data']; var articleCount = data.length; var pagerLength = Math.ceil(articleCount / pagerOptions['articleCount']); var pagerVisibleCount = pagerOptions['pagerMaxCount']; var baseUrl = './'; baseUrl += '?' + pagerOptions['paramKey'] + '='; // 記事が0件の場合またはページャーが1件のみの場合は表示しない if(pagerLength <= 1) { return; } // 現在のページが存在しない場合は1ページ目にリダイレクト if(current > pagerLength) { location.href = baseUrl + 1; } var startNumber = 1; if(pagerLength <= pagerOptions['pagerMaxCount']) { pagerVisibleCount = pagerLength; } else if(current <= Math.ceil(pagerOptions['pagerMaxCount'] / 2)) { } else if(current > pagerLength - Math.ceil(pagerOptions['pagerMaxCount'] / 2)) { startNumber = pagerLength - pagerOptions['pagerMaxCount'] + 1; } else { startNumber = current - Math.ceil(pagerOptions['pagerMaxCount'] / 2) + 1; } var ins = ''; ins += '<div class="pager">'; if(current !== 1) { ins += '<a class="pager_first" href="' + baseUrl + '1' + '">first</a>'; ins += '<a class="pager_prev" href="' + baseUrl + (current - 1) + '">prev</a>'; } ins += '<ol class="pager_list">'; for (var i = startNumber; i < startNumber + pagerVisibleCount; i++) { if(i === current) { ins += '<li class="pager_item is-current"><a href="' + baseUrl + i + '">' + i + '</a></li>'; } else { ins += '<li class="pager_item"><a href="' + baseUrl + i + '">' + i + '</a></li>'; } } ins += '</ol>'; if(current !== pagerLength) { ins += '<a class="pager_next" href="' + baseUrl + (current + 1) + '">next</a>'; ins += '<a class="pager_last" href="' + baseUrl + pagerLength + '">last</a>'; } ins += '</div>'; $(outputPager).html(ins); }
3行目のarticleCountで1ページに表示する記事数、pagerMaxCountでページ送りの最大数を設定できるようにしています。
ページ送りを実装するデモページ
現在何ページ目かはURLにパラメータ(?page=X)をつけて判別するようにしています。
コメントが承認されるまで時間がかかります。