残りの関数は、以下で全てです。
次に、ページナビゲーションを表示するためのタグ「<div id="blogPager"><span class="blogPager"/></div>
」を適宜表示したい場所へ配置します。
既にテンプレートに「id='blog-pager'」のタグが記載されていると思います。
リスト表示になるページでは、その中身をクリアしてページナビゲーションが表示されます。
好みに応じて、全コード内のスタイルを調整してやれば完成です。
※ アーカイブページではページング動作しませんので、必要に応じて改造してご使用下さい。
//-------------------------------------------------- // 前・後方リンク生成とコールバックScriptの書き出し //-------------------------------------------------- function getPrevNext(vector){ var startIndex = 0; var scriptStr = '<script &alt="json-in-script'" &callback="redirectPrevPage';" ){="" *="" +="(pageNo-1)" 1="" ;="" if(="" maxresults="" prev"="" span="" src="'; var srcStr = feedUrl + 1 + '&start-index='; var span = '<span class=" srcstr="" vector="="> <a href="javascript:void();" id="prevPageLink">' + vector + '</a></span>'; }else{ srcStr += (pageNo+1) * maxResults + '&alt=json-in-script' + '&callback=redirectNextPage'; span += 'naviLinkNext">' + '<a href="javascript:void();" id="nextPageLink">' + vector + '</a></span>'; } blogPager.innerHTML += span; scriptStr += srcStr + '" type="text/javascript"> </script>'; document.write(scriptStr); } //------------------------------- // 前方リンク用コールバック関数 //------------------------------- function redirectPrevPage( result ){ var targetLink = document.getElementById("prevPageLink"); var date = encodeDate( result.feed.entry[0].published.$t );// 記事公開日付 if( pageNo == 1) targetLink.href = blogUrl + '#PageNo=1'; else targetLink.href = blogUrl + '&updated-max=' + date + '#PageNo=' + pageNo ; } //------------------------------- // 後方リンク用コールバック関数 //------------------------------- function redirectNextPage( result ){ var targetLink = document.getElementById("nextPageLink"); var date = encodeDate( result.feed.entry[0].published.$t );// 記事公開日付 targetLink.href = blogUrl + '&updated-max=' + date + '#PageNo=' + (pageNo + 2); } //------------------------------- // 各ページリンク用コールバック関数 //------------------------------- function redirectTargetPage( result ){ var startIndex = parseInt(result.feed.openSearch$startIndex.$t, 10); var targetPage = parseInt( startIndex / maxResults ); var targetLink = document.getElementById("targetPageLink" + startIndex ); var feed = result.feed; var date = encodeDate( feed.entry[0].published.$t );// 記事公開日付 if( startIndex == 1) targetLink.href = blogUrl + '#PageNo=' + targetLink.innerHTML; else targetLink.href = blogUrl + '&updated-max=' + date + '#PageNo=' + targetLink.innerHTML; } //--------------------------------------- // 日時文字列をURIエンコードして返します //-------------------------------------- function encodeDate(dateStr){ dateStr = dateStr.substring(0, 19) + dateStr.substring(23, 29); return encodeURIComponent( dateStr ); }
コードの実装方法
Bloggerの管理ツールからテンプレートHtmlの編集で「</body>」を検索し、その直前に以下の全コードをコピー&ペーストして下さい。既にテンプレートに「id='blog-pager'」のタグが記載されていると思います。
リスト表示になるページでは、その中身をクリアしてページナビゲーションが表示されます。
好みに応じて、全コード内のスタイルを調整してやれば完成です。
※ アーカイブページではページング動作しませんので、必要に応じて改造してご使用下さい。
対応ブラウザ
- @Explorer
- @Chrome
- @Safari
- @Firefox(スクリプト外部ファイル化により動作確認できました)
- @Opera
全コード
※ 最大リンク表示数で範囲制限とカレントページをセンタリングする機能を付加しました。(2010/03/28)<style type='text/css'> .pageLink ,.currentPageLink, .naviLinkPrev, .naviLinkNext{ line-height: 2.1em; } .pageLink a, .currentPageLink a, .naviLinkPrev a, .naviLinkNext a{ color: #333 !important; text-decoration:none !important; margin: 0 3px; padding: 3px; } .pageLink, .naviLinkPrev, .naviLinkNext{ color: blue !important; text-decoration:none !important; margin: 0 3px; padding: 3px; } .pageLink:hover, .naviLinkPrev:hover, .naviLinkNext:hover{ background-color: skyblue; } .pageLink , .naviLinkPrev, .naviLinkNext{ color: #333; text-decoration: none; border: 1px solid #ccc; margin: 0 3px; padding: 3px; } .currentPageLink { color: #333; text-decoration: none; border: 1px solid #ccc; background-color: #ccc; margin: 0 3px; padding: 3px; } .currentPageLink .headPager{ margin: 0 3px 0 0; padding: 3px; } </style> <script type='text/javascript'> <!-- //------------------------------------- // Copyright (C) 2010 Hyperhands.com // This code Created by S.Kobayashi // License agreement with GNU LGPL //------------------------------------- var blogUrl = "/"; var currentUrl = location.href; var maxResults = 5;// ページ内サマリー数 var maxLinks=10;// 最大リンク表示数 var isHome=false;// ホームページ var isLabel=false;// ラベルページ var isStatic=false;// 静的ページ var isItem=false;// 記事ページ var labelPrefix = "search/label/"; var pageNo = 0; if( currentUrl.indexOf("#PageNo=" ) > -1){ var strNo = currentUrl.substring( currentUrl.indexOf("#PageNo=" )+8); pageNo = parseInt( strNo )-1; } if ( currentUrl.indexOf( labelPrefix ) > -1 ){ isLabel=true; } else if( currentUrl.indexOf( '.html' ) == -1 ){ isHome=true; } else if( currentUrl.indexOf( '/p/' )> -1){ isStatic=true; } else { isItem=true; } var feedUrl = blogUrl + "feeds/posts/summary/"; // フィードサマリー取得クエリー var blogPager = document.getElementById("blog-pager");//既定のページナビのオブジェクトを検索 if( isLabel || isHome ){ if( isLabel ){ var st = currentUrl.indexOf( labelPrefix ) + labelPrefix.length; var labelName = currentUrl.substring( st ); if( labelName.indexOf("/") > -1){ labelName = labelName.substring(0,labelName.indexOf("/")); }else if( labelName.indexOf("?") > -1 ){ labelName = labelName.substring(0,labelName.indexOf("?")); } feedUrl += "-/" + labelName; blogUrl += labelPrefix + labelName + "?"; }else{ blogUrl = blogUrl + "search?"; } feedUrl = feedUrl + "?orderby=published"; blogUrl += "orderby=published&max-results=" + maxResults ; feedUrl += "&max-results="; var srcStr = (feedUrl + maxResults + "&alt=json-in-script&callback=viewPageNavigation"); var scriptStr = "<script src='" + srcStr + "' type='text/javascript'></script>"; //blogPager.innerHTML = srcStr ;// JSONP動作しない場合リクエスト文字列が残ります。 document.write( scriptStr ); } function viewPageNavigation( result ){ var feed = result.feed; var totalResults = parseInt(feed.openSearch$totalResults.$t, 10); var startIndex = parseInt(feed.openSearch$startIndex.$t, 10); var itemsPerPage = parseInt(feed.openSearch$itemsPerPage.$t, 10); var totalPage = parseInt(totalResults / maxResults ); if( (totalResults % maxResults ) > 0){ totalPage += 1; } var head = "<span class='headPager'>Pages( " + totalPage + " )</span>"; blogPager.innerHTML = head; if( pageNo > 0 ){ getPrevNext("Prev"); } var startPage = pageNo; var endPage= pageNo + maxLinks; var offset = parseInt( maxLinks / 2 ); if( endPage > totalPage){ if( endPage - totalPage > offset ) offset = endPage - totalPage; for(i=0; i < offset; i++ ){ if( endPage == totalPage ) break; if( startPage > 0) startPage--; endPage--; } }else{ for(i=0; i < offset; i++ ){ if( startPage == 0 ) break; if( startPage > 0) startPage--; endPage--; } } for(i=startPage; i < endPage; i++){ var pager=""; var className = "pageLink"; if( pageNo == i) className = "currentPageLink"; pager += "<span class='" + className + "'>"; var targetIndex=0; var scriptStr =""; var srcStr =""; if( className != "currentPageLink" ){ scriptStr = "<script src='" ; srcStr = feedUrl + 1 + "&start-index="; targetIndex = (maxResults*i); //+ startIndex -1; if( targetIndex ==0) targetIndex =1; srcStr += (targetIndex + "&alt=json-in-script&callback=redirectTargetPage"); scriptStr += (srcStr + "' type='text/javascript'></script>"); } pager += ("<a id='targetPageLink" + targetIndex + "'>" +( i+1 ) + "</a></span>"); blogPager.innerHTML += pager; if( className != "currentPageLink" ) document.write( scriptStr ); } if( pageNo<(totalPage-1)){ getPrevNext("Next"); } } function getPrevNext(vector){ var startIndex = 0; var scriptStr = "<script src='"; var srcStr = (feedUrl + 1 + "&start-index="); var span = "<span class='"; if( vector.toLowerCase() == "prev" ){ srcStr += ((pageNo-1) * maxResults + 1) + "&alt=json-in-script" + "&callback=redirectPrevPage"; span += "naviLinkPrev'>" + "<a href='javascript:void();' id='prevPageLink'>" + vector + "</a></span>"; }else{ srcStr += ((pageNo+1) * maxResults) + "&alt=json-in-script" + "&callback=redirectNextPage"; span += "naviLinkNext'>" + "<a href='javascript:void();' id='nextPageLink'>" + vector + "</a></span>"; } blogPager.innerHTML += span; scriptStr += (srcStr + "' type='text/javascript'></script>"); document.write(scriptStr); } function redirectPrevPage( result ){ var targetLink = document.getElementById("prevPageLink"); var date = encodeDate( result.feed.entry[0].published.$t ); if( pageNo == 1) targetLink.href = blogUrl + "#PageNo=1"; else targetLink.href = blogUrl + "&updated-max=" + date + "#PageNo=" + pageNo ; } function redirectNextPage( result ){ var targetLink = document.getElementById("nextPageLink"); var date = encodeDate( result.feed.entry[0].published.$t ); targetLink.href = blogUrl + "&updated-max=" + date + "#PageNo=" + (pageNo + 2); } function redirectTargetPage( result ){ var startIndex = parseInt(result.feed.openSearch$startIndex.$t, 10); var targetPage = parseInt( startIndex / maxResults ); var targetLink = document.getElementById("targetPageLink" + startIndex ); var feed = result.feed; var date = encodeDate( feed.entry[0].published.$t ); if( startIndex == 1) targetLink.href = blogUrl + "#PageNo=" + targetLink.innerHTML; else targetLink.href = blogUrl + "&updated-max=" + date + "#PageNo=" + targetLink.innerHTML; } function encodeDate(dateStr){ dateStr = dateStr.substring(0, 19) + dateStr.substring(23, 29); return encodeURIComponent( dateStr ); } --> </script>
関連記事
Blogger
Javascript
ページング
コメント(1)
Bloggerテンプレートに埋め込みで動作させていたJavaScriptをカットし、当サイトのガジェットHtml TagEscaperでHtmlエンティティを特殊文字に復元し、テキストファイルに張り付け拡張子を「js」ファイルにして保存。
サーバへ配置し、中身のカットされたスクリプトタグには属性「src」でサーバへ配置したJavascriptファイルのURLを設定した。
要するに中身のコードには一切変更は加えていないのだが、これだけで「Firefox」でもページナビゲーションが正常動作するようになりました。
やれやれ(^^;
コメントを投稿