以前に「jQueryで外部HTML(JSON形式)化した要素を「もっと見る」ボタンで追加する方法」
と題して、JSON形式でで外部HTML化したコンテンツ要素を
「もっと見る」ボタンで追加するUIを紹介しました。
当時公開したスクリプトでは「もっと見る」動作は
ページ内で1つの設置のみの構成になっていたところ
1ページで複数設置を必要とした場面があったり、同様の要望もいただいたりしたので、
複数設置パターンのサンプルを再度紹介してみます。
jQueryで外部HTML(JSON形式)化した要素を「もっと見る」ボタンで追加する方法【複数設置対応パターン】
ページをスクロールしていくと現れる「もっと見る」をクリックすると
そのエリアの続きに追加で要素を読み込みます。
サンプルではページ内に2つの「もっと見る」エリアを設置しています。
左のエリアは28個、右のエリアは20個の要素を
5個ずつ追加表示しています。
全体構成についてまずはHTMLから。
◆HTML <div class="loadArea"></div> <div class="loadArea"></div>
HTMLには要素を追加させたい箇所に
任意のクラスを付けたブロック要素を配置するだけです。
(複数設置パターンなので基本的にはIDではなくクラスで)
そしてCSSは以下の様になります。
◆CSS
/* .loadArea
--------------------------- */
.loadArea {
margin: 0 auto 10px auto;
width: 300px;
text-align: left;
}
.loadSet1 {float: left;}
.loadSet2 {float: right;}
.loadArea .loadItem {
padding: 10px 0;
width: 300px;
line-height: 160%;
border-bottom: #666 1px dotted;
}
.loadArea #item1_1,
.loadArea #item2_1 {
border-top: #666 1px dotted;
}
.loadArea .loadItem img {
margin: 0 15px 0 0;
width: 100px;
height: 100px;
float: left;
}
/* .nowLoading
--------------------------- */
.nowLoading {
padding: 5px 0;
width: 100%;
text-align: center;
}
/* .loadMoreBtn
--------------------------- */
.loadMoreBtn {
padding: 10px 0;
text-align: center;
border: #000 1px solid;
cursor: pointer;
}
/* =======================================
ClearFixElements
======================================= */
#container:after,
.loadArea .loadItem:after {
content: ".";
height: 0;
clear: both;
display: block;
visibility: hidden;
}
#container,
.loadArea .loadItem {
display: inline-block;
overflow: hidden;
}
基本的にはCSSは動作に影響しないもので
サンプル画面のレイアウトを形成しているものになっています。
そして実際の動作スクリプトは以下の様になります。
◆SCRIPT
$(function(){
var setArea = $('.loadArea'),
btnTxt = 'もっと見る'; // ボタンテキスト
setArea.wrap('<div class="loadWrap"></div>');
setArea.after('<div class="loadMoreBtn">' + btnTxt + '</div>');
var setWrap = $('.loadWrap');
setWrap.each(function(){
var setThis = $(this),
thisLoadArea = setThis.find(setArea),
loadNum = 5, // 読み込む個数
loadTxt = 'Loading...', // Loading中の表示テキスト
fadeSpeed = 500; // フェードスピード
var setMore = setThis.find('.loadMoreBtn');
var setIndex = setWrap.index(this),
setNum = setIndex + 1;
setMore.click(function(){
$.ajax({
url: 'js/include' + setNum + '.json',
dataType: 'json',
cache: false,
success : function(data){
var dataLengh = data.length,
loadItemLength = thisLoadArea.find('.loadItem').length,
setAdj = (dataLengh)-(loadItemLength),
setBeg = (dataLengh)-(setAdj);
if(!(dataLengh == loadItemLength)){
thisLoadArea.append('<div class="nowLoading">' + loadTxt + '</div>');
if(loadItemLength == 0){
if(dataLengh <= loadNum){
for (var i=0; i<dataLengh; i++) {
$('<div id="item' + setNum + '_' + data[i].itemNum + '" class="loadItem">' + data[i].itemSource + '</div>').appendTo(thisLoadArea).css({opacity:'0'}).animate({opacity:'1'},fadeSpeed);
}
setMore.remove();
} else {
for (var i=0; i<loadNum; i++) {
$('<div id="item' + setNum + '_' + data[i].itemNum + '" class="loadItem">' + data[i].itemSource + '</div>').appendTo(thisLoadArea).css({opacity:'0'}).animate({opacity:'1'},fadeSpeed);
}
}
} else if(loadItemLength > 0 && loadItemLength < dataLengh){
if(loadNum < setAdj){
for (var i=0; i<loadNum; i++) {
v = i+setBeg;
$('<div id="item' + setNum + '_' + data[v].itemNum + '" class="loadItem">' + data[v].itemSource + '</div>').appendTo(thisLoadArea).css({opacity:'0'}).animate({opacity:'1'},fadeSpeed);
}
} else if(loadNum >= setAdj){
for (var i=0; i<setAdj; i++) {
v = i+setBeg;
$('<div id="item' + setNum + '_' + data[v].itemNum + '" class="loadItem">' + data[v].itemSource + '</div>').appendTo(thisLoadArea).css({opacity:'0'}).animate({opacity:'1'},fadeSpeed);
}
setMore.remove();
}
} else if(loadItemLength == dataLengh){
return false;
}
} else {
return false;
}
}, //success
complete : function(){
$('.nowLoading').each(function(){
$(this).remove();
});
return false;
} //complete
});
return false;
});
setThis.addClass('loadSet' + setNum);
setMore.click();
});
});
今回のサンプルではJSONファイルとの兼ね合いから
外部JSファイル構成になっていますので
ここには記述していませんが
別途jQueryファイルは必要になります。
スクリプト開始部分にある設定値の内容は
以下の様になっています。
| var setArea = $(‘.loadArea’) | 要素を追加表示させるブロック要素クラス名 |
|---|---|
| btnTxt = ‘もっと見る’ | ボタンに表示するテキスト |
併せて、スクリプト○行目からの設定値の内容は
以下の様になっています。
| loadNum = 5 | 一度に読み込む個数 |
|---|---|
| loadTxt = ‘Loading…’ | ローディング中の表示テキスト |
| fadeSpeed = 500 | 要素を追加する際のフェードスピード |
これらの設定値を変更することで
もろもろ調整が可能になっています。
追加される要素は一つひとつが
<div>で囲われるようになっており
個々にID名が付与されるようになっています。
※実行後のHTMLソースをFirebug等の開発ツールで見てもらえると分かるかと思います。
スクリプト○行目の「url: ‘js/include’ + setNum + ‘.json’」が
読み込むJSONファイルの指定になるので
パスやファイル名を変える際にはここを変更します。
今回の複数設置の場合、読み込むJSONファイルに関しては
ファイル名の最後に数字(番号)を入れることで判別する構成にしてあります。
サンプルで使用しているJSONファイルは
・include1.json
・include2.json
となっており、「include1.json」が1つ目の「もっと見る」エリアに読み込む要素
「include2.json」が2つ目の「もっと見る」エリアに読み込む要素になります。
JSONファイルの中身については
以下の様になっています。
◆JSON
[
{
"itemNum": "1",
"itemSource": "<img src='img/photo1.jpg' alt='' />【photo1】<br>これは追加要素1つ目のダミーテキストです。これは追加要素1つ目のダミーテキストです。これは追加要素1つ目のダミーテキストです。これは追加要素1つ目のダミーテキストです。これは追加要素1つ目のダミーテキストです。これは追加要素1つ目のダミーテキストです。これは追加要素1つ目のダミーテキストです。"
},
{
"itemNum": "2",
"itemSource": "<img src='img/photo2.jpg' alt='' />【photo2】<br>これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。これは追加要素2つ目のダミーテキストです。"
},
{
"itemNum": "3",
"itemSource": "<img src='img/photo3.jpg' alt='' />【photo3】<br>これは追加要素3つ目のダミーテキストです。これは追加要素3つ目のダミーテキストです。これは追加要素3つ目のダミーテキストです。これは追加要素3つ目のダミーテキストです。"
},
{
"itemNum": "4",
"itemSource": "<img src='img/photo4.jpg' alt='' />【photo4】<br>これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。これは追加要素4つ目のダミーテキストです。"
},
{
"itemNum": "5",
"itemSource": "<img src='img/photo5.jpg' alt='' />【photo5】<br>これは追加要素5つ目のダミーテキストです。これは追加要素5つ目のダミーテキストです。これは追加要素5つ目のダミーテキストです。これは追加要素5つ目のダミーテキストです。これは追加要素5つ目のダミーテキストです。"
},
・
・
・
]
サンプルで表示させている
追加要素のHTMLソースになります。
「itemNum」と「itemSource」が1セットになっており
「itemNum」は追加させる要素のナンバリング、
「itemSource」は実際に追加させるHTMLソース部分になっています。
「itemNum」で追加させるナンバーは
生成されるソースの<div>にID名として入ることになるので
要素の連番を入れておきます。
(同じ数値を入れても動作自体には影響しませんが。。)
「itemSource」で記述するHTMLソースはJSONファイルの構成上、
属性はシングルクォーテーション「’’」で記述する必要がありますが
この部分に読み込む要素に対して、個別にHTMLソースを記述させることが出来る様になっています。
一つひとつのセットは { ~ } で囲われており
セットの間は「,」カンマで区切られていますが
最後のセットだけはカンマが付かない構成になります。
ページ内で表示する要素が多くなってしまう場合は
この様にソースを外部化してボタンクリックで読み込むようにすることで
ページロード時の負荷を軽くすることも可能になるかと思います。
JSON形式で外部HTML化した要素を「もっと見る」ボタンで追加表示させる際にぜひ。。。