Jqueryのページ付け( このJqueryのページ付けチュートリアルに基づく -- デモ )を変更して、すばらしいTwitterブートストラップで動作させようとしています。
Twitter Bootstrapの標準のページ付け設定は次のようになります。したがって、これがページ付け出力構造の目標です。
<div class="pagination">
<ul>
<li class="prev disabled"><a href="#">← Previous</a></li>
<li class="active"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li class="next"><a href="#">Next →</a></li>
</ul>
</div>
これまでのところ、html出力構造を変更することで機能させることができますが、出力を<a>
から<li>
タグに変更したため、アクティブな強調表示が適切に機能していません。
prev
ボタンを無効にします<li>
を変更しますnext
ボタンを無効にしますprev
ボタンを修正して再び機能するようにします私はこの投稿を完全に忘れました
しかし、私はそれを次のコードで動作させることができました:
// Based on http://stackoverflow.com/questions/1262919/jquery-active-class-assignment and http://stackoverflow.com/questions/2037501/javascript-add-class-when-link-is-clicked
$(function() {
$('ul.nav li:first').addClass('active').show(); //Activate first tab
$('li a').click(function(e) {
//e.preventDefault();
var $this = $(this);
$this.closest('ul').children('li').removeClass('active');
$this.parent().addClass('active');
//Remove active from dropdown li
$('.dropdown').removeClass('active');
// Activate Home when clicked on the logo
$('.thelogo').click(function()
{
$('.nav li').removeClass('active');
$('.home').addClass('active');
});
});
});
これが標準のjQuery.paginationライブラリで、Twitterブートストラップを使用するように変更しました。
divを作成-
<div id="myPager" class="pagination"></div>
その後
$('#myPager').pagination(100,{callback:function(page,component){
console.info(page);
}})
これがライブラリのコードです。
jQuery.fn.pagination = function(maxentries, opts){
opts = jQuery.extend({
items_per_page:10,
num_display_entries:10,
current_page:0,
num_Edge_entries:0,
link_to:"javascript:void(0)",
first_text:"First",
last_text:"Last",
prev_text:"Prev",
next_text:"Next",
ellipse_text:"...",
prev_show_always:true,
next_show_always:true,
callback:function(){return false;}
},opts||{});
return this.each(function() {
/**
* Calculate the maximum number of pages
*/
function numPages() {
return Math.ceil(maxentries/opts.items_per_page);
}
/**
* Calculate start and end point of pagination links depending on
* current_page and num_display_entries.
* @return {Array}
*/
function getInterval() {
var ne_half = Math.ceil(opts.num_display_entries/2);
var np = numPages();
var upper_limit = np-opts.num_display_entries;
var start = current_page>ne_half?Math.max(Math.min(current_page-ne_half, upper_limit), 0):0;
var end = current_page>ne_half?Math.min(current_page+ne_half, np):Math.min(opts.num_display_entries, np);
return [start,end];
}
/**
* This is the event handling function for the pagination links.
* @param {int} page_id The new page number
*/
function pageSelected(page_id, evt){
current_page = page_id;
drawLinks();
var continuePropagation = opts.callback(page_id, panel);
if (!continuePropagation) {
if (evt.stopPropagation) {
evt.stopPropagation();
}
else {
evt.cancelBubble = true;
}
}
return continuePropagation;
}
/**
* This function inserts the pagination links into the container element
*/
function drawLinks() {
panel.empty();
var list = jQuery("<ul></ul>");
panel.append(list);
var interval = getInterval();
var np = numPages();
// This helper function returns a handler function that calls pageSelected with the right page_id
var getClickHandler = function(page_id) {
return function(evt){ return pageSelected(page_id,evt); }
}
// Helper function for generating a single link (or a span tag if it's the current page)
var appendItem = function(page_id, appendopts){
page_id = page_id<0?0:(page_id<np?page_id:np-1); // Normalize page id to sane value
appendopts = jQuery.extend({text:page_id+1, classes:""}, appendopts||{});
if(page_id == current_page){
var clazz = appendopts.side ? 'disabled' : 'active';
var lstItem = jQuery("<li class='"+clazz+"'><a>"+(appendopts.text)+"</a></li>")
}
else
{
var a = jQuery("<a>"+(appendopts.text)+"</a>")
.attr('href', opts.link_to.replace(/__id__/,page_id));;
var lstItem = jQuery("<li></li>")
.bind("click", getClickHandler(page_id));
lstItem.append(a);
}
if(appendopts.classes){lstItem.addClass(appendopts.classes);}
list.append(lstItem);
}
// Generate "Previous"-Link
if(opts.prev_text && (current_page > 0 || opts.prev_show_always)){
appendItem(0, { text: opts.first_text, side: true });
appendItem(current_page-1,{text:opts.prev_text, side:true});
}
// Generate starting points
if (interval[0] > 0 && opts.num_Edge_entries > 0)
{
var end = Math.min(opts.num_Edge_entries, interval[0]);
for(var i=0; i<end; i++) {
appendItem(i);
}
if(opts.num_Edge_entries < interval[0] && opts.ellipse_text)
{
jQuery("<li class='disabled'>"+opts.ellipse_text+"</li>").appendTo(list);
}
}
// Generate interval links
for(var i=interval[0]; i<interval[1]; i++) {
appendItem(i);
}
// Generate ending points
if (interval[1] < np && opts.num_Edge_entries > 0)
{
if(np-opts.num_Edge_entries > interval[1]&& opts.ellipse_text)
{
jQuery("<li class='disabled'>"+opts.ellipse_text+"</li>").appendTo(list);
}
var begin = Math.max(np-opts.num_Edge_entries, interval[1]);
for(var i=begin; i<np; i++) {
appendItem(i);
}
}
// Generate "Next"-Link
if(opts.next_text && (current_page < np-1 || opts.next_show_always)){
appendItem(current_page+1,{text:opts.next_text, side:true});
appendItem(np - 1, { text: opts.last_text, side: true });
}
}
// Extract current_page from options
var current_page = opts.current_page;
// Create a sane value for maxentries and items_per_page
maxentries = (!maxentries || maxentries < 0)?1:maxentries;
opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0)?1:opts.items_per_page;
// Store DOM element for easy access from all inner functions
var panel = jQuery(this);
// Attach control functions to the DOM element
this.selectPage = function(page_id){ pageSelected(page_id);}
this.prevPage = function(){
if (current_page > 0) {
pageSelected(current_page - 1);
return true;
}
else {
return false;
}
}
this.nextPage = function(){
if(current_page < numPages()-1) {
pageSelected(current_page+1);
return true;
}
else {
return false;
}
}
// When all initialisation is done, draw the links
drawLinks();
// call callback function
//opts.callback(current_page, this);
});
}
<li>
の下のすべての#page_navigation
に動的にIDを割り当て、IDに基づいてクラスactive
を追加または削除します。
<script type="text/javascript">
$(document).ready(function(){
//how much items per page to show
var show_per_page = 5;
//getting the amount of elements inside content div
var number_of_items = $('#content').children().size();
//calculate the number of pages we are going to have
var number_of_pages = Math.ceil(number_of_items/show_per_page);
//set the value of our hidden input fields
$('#current_page').val(0);
$('#show_per_page').val(show_per_page);
var navigation_html = '<ul>';
navigation_html += '<li class="previous_link">';
navigation_html += '<a href="javascript:previous();">← Previous</a>';
navigation_html += '</li>';
var current_link = 0;
while(number_of_pages > current_link){
navigation_html += '<li class="page_link" id="id' + current_link +'">';
navigation_html += '<a href="javascript:go_to_page(' + current_link +')" longdesc="' + current_link +'">'+ (current_link + 1) +'</a>';
current_link++;
navigation_html += '</li>';
}
navigation_html += '<li>';
navigation_html += '<a class="next_link" href="javascript:next();">Next →</a>';
navigation_html += '</li>';
navigation_html += '</ul>';
$('#page_navigation').html(navigation_html);
//add active class to the first page link
$('#page_navigation .page_link:first').addClass('active');
//hide all the elements inside content div
$('#content').children().css('display', 'none');
//and show the first n (show_per_page) elements
$('#content').children().slice(0, show_per_page).css('display', 'block');
});
function previous(){
new_page = parseInt($('#current_page').val()) - 1;
//if there is an item before the current active link run the function
if($('.active').prev('.page_link').length==true){
go_to_page(new_page);
}
}
function next(){
new_page = parseInt($('#current_page').val()) + 1;
//if there is an item after the current active link run the function
if($('.active').next('.page_link').length==true){
go_to_page(new_page);
}
}
function go_to_page(page_num){
//get the number of items shown per page
var show_per_page = parseInt($('#show_per_page').val());
//get the element number where to start the slice from
start_from = page_num * show_per_page;
//get the element number where to end the slice
end_on = start_from + show_per_page;
activate_id = page_num;
var get_box = document.getElementById("id"+page_num);
//hide all children elements of content div, get specific items and show them
$('#content').children().css('display', 'none').slice(start_from, end_on).css('display', 'block');
/*get the page link that has longdesc attribute of the current page and add active class to it
and remove that class from previously active page link*/
$("#page_navigation").find('li.active').removeClass("active");
$(get_box).addClass("active");
//update the current page input field
$('#current_page').val(page_num);
}
</script>
アクティブな強調表示は、Twitterの scrollspy javascriptプラグインによって行われます。プラグインは、そのページでdiv idへの参照を検索し、メニュー項目をスクロールすると自動的に強調表示されます。 <a>
タグのhref
属性が同じページ上の参照を指しているため、目的のセクションにジャンプすることもできます。
いくつかのこと:
"#"
を指しています。これはページの上部です。これらを、このページの必要なhtmlid属性に変更します。"#"
記号は必要ありません。href
を絶対または相対URIにポイントするだけです。<li>
の周りの<a>
タグは、Twitter bootstrapパッケージのトップバーメニューのcssフォーマット用です。ハイライトについてさらに質問がある場合は、非常に読みやすいスクロールスパイソースをご覧ください。
前のボタンを無効にするには、最初のページでこれを使用します。
<li class="disabled"><a href="#">Previous</a></li>
ページが変更されたときにアクティブなliを変更するには、ページが表示されているliにアクティブなクラスを配置するだけです。
最後のページで次のボタンを無効にするには、次のように前のボタンと同じように使用します。
<li class="disabled"><a href="#">Next</a></li>