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)をつけて判別するようにしています。
コメントが承認されるまで時間がかかります。