分頁製做

不少時候,不能所有顯示數據,只能經過分頁來作。以前有個項目,它運用的 dicuz 框架有自帶的分頁功能,可是惟一很差的地方是用戶體驗很差,須要刷新網頁,因此就本身嘗試作了一個。javascript

效果如圖:css

css 代碼:html

#page {
    text-align: center;
}
.page {
    display: inline-block;
}
.page a {
    padding: 3px 8px;
    border: 1px solid #d2d2d2;
    text-decoration: none;
    margin: 0 2px;
    color: #444;
}
.page a.invisible {
    visibility: hidden;
}
.page a.on {
    color: #fff;
    border-color: #d36969;
    background: #d36969;
}

#page 和 .page 的樣式設置是爲了讓分頁居中。java

 

js 代碼:ajax

var page_num   = 5;
var page_index = 1;
setPages(page_num)
function setPages(num) {
   $('#page').remove();
if (num > 1) { $('body').append('<div id="page"><div class="page"></div></div>'); var page_text = '<a class="prev btn" href="javascript:void(0)">上一頁</a>' +
              '<a class="on" href="javascript:void(0)">1</a>'; for (var i = 2; i <= num; i ++) { page_text += '<a href="javascript:void(0)">'+i+'</a>'; } page_text += '<a class="next btn" href="javascript:void(0)">下一頁</a>'; $('#page .page').html(page_text); canShow(); } }

page_num 表示頁數,這個頁數應該是在加載頁面的時候從後臺獲取,只有當頁數有兩頁或者兩頁以上,纔會有分頁;app

page_index 表示當前頁(這個值會在用 ajax 與後臺交互時,將它放入 data 裏來傳給後臺);框架

$('#page').remove() 這個在後面會解釋,建立了 '上一頁'、'下一頁'和 5 個頁碼,並插入到 body,這裏有一個 canShow 函數。函數

function canShow() {
    for (var i = 1; i < $('#page .page a').length - 1; i ++) {
        if ($('#page .page a').eq(i).hasClass('on')) {
            $('#page .page a').removeClass('invisible');
            if (i == 1) {
                $('#page .page .prev').addClass('invisible');
            } else if (i == page_num) {
                $('#page .page .next').addClass('invisible');
            } 
        }
    }
}

這個函數是用來判斷 '上一頁' 和 '下一頁' 能不能顯示。而後就是點擊頁碼或者上下頁:佈局

$('#page .page a').on('click', function() {
    if ($(this).hasClass('on')) return;
    $('#page .page a').removeClass('on')
    if ($(this).hasClass('prev')) {
        page_index --;
        $('#page .page a').eq(page_index).addClass('on');
    }else if ($(this).hasClass('next')) {
        page_index ++;
        $('#page .page a').eq(page_index).addClass('on');
    }else {
        page_index = $(this).index();
        $(this).addClass('on');
    }
    getData();
    canShow();
});

這一段純屬一個邏輯判斷,就不在介紹了,這裏也出現一個新函數 getData,就是用來和後臺交互的。post

var url  = '...';
var data = { page_index: page_index, ...};
function getData(){
    $.ajax({
        url: url,
        type: 'post',
        data: data,
        success: function(msg){
            msg = JSON.parse(msg);
            showText(msg);
        }
    })
}

把當前頁碼 page_index 和一些須要的信息放入data 裏傳給後臺,而後獲取的數據基本是一個 JSON 數據,要先 parse 一下,這裏有一個 showText 函數,就是用來填寫內容的。

function showText(data){
    var content = '';
    for (obj in data) {
        content += <!-- 佈局 -->
    }
    $('#test').empty().html(content);
}

從後臺獲取的數據經過傳參的方式傳到這個函數,經過循環把數據取出來,先把須要顯示這頁內容的 test 裏面上個頁面的內容清空,再一一對應到佈局裏。

PS:項目中另外一個需求——篩選功能

其實一開始就考慮到這個,因此才把建立分頁,用一個函數 setPages 來封裝,並在裏面寫了 $('#page').remove(),而後篩選時,在那個和後臺交互的 getData 函數中,後臺會多傳一個數據表示篩選結果總共有幾頁,就只要再調用 setPages 這個函數,並把頁數傳進去就解決了。

相關文章
相關標籤/搜索