原文地址:
http://www.cnblogs.com/gxll1314/archive/2010/10/08/1845651.html
1:效果圖
2:素材
3:編碼
3.1思考
需要做什麼?
1:分頁控件需要向後臺發送請求,發送的參數包括當前頁,每頁顯示數量,查詢條件;並且獲取數據加載到當前頁面;
2:進行修改刪除操作的時候能記住當前頁;
3:查詢後翻頁的時候可以可以記住當前查詢的條件
3.2實現
HTML
1 2 3 4 5 | <!--存儲數據的容器--> < div class = "tableData" > </ div > <!--分頁控件顯示--> < div class = "pageBar" ></ div > |
jQuery
爲了我們的控件可以隨意使用,我們將其寫成插件的形式,首先搭個框架,我們將插件命名爲simplePage
1 2 3 4 5 6 7 8 9 | ( function ($){
$.fn.simplePage= function (o){
var options={
//配置參數
};
return //sth
} })(jQuery) |
默認有哪些參數呢?
由於需要發送當前頁,每頁顯示數量,所以需要 currentPage,pageSize 兩個基本參數;
由於需要查詢表格內容,所以需要一個放置查詢條件的表單 form;
由於需要修改刪除後記住當前頁,所以需要一個標誌指示當前進行的是何操作type;
爲了使我們的程序更具有靈活性,加上獲取數據後需要加載到的container,還有就是分頁控件加載的pager,
具體如下
1 2 3 4 5 6 7 8 9 10 11 | var options={
pager: '.pager' , //表格控件的容器
container: '.tableData' , //放置表格數據的容器
form: '#form' , //放置查詢條件的表單
pageForm: '#pageForm' , //放置隱藏與的Div
url: '' , //發送請求的地址
currentPage: 1,
pageSize: 2
type: null , //可選:action,
pageShow:7 } |
爲了便於維護,我們聲明一個獨立的對象來進行獲取數據,綁定事件的操作,我們將這個函數命名爲$.page
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $.page = {
//
setPage: function (o){
}, //獲取當前頁
getCurrentPage: function (o){
}, //獲取每頁顯示數量
getPageSize: function (o){
}, //生成發送所需要的json數據
genData: function (o){
}, //發送數據
loadData: function (o){
} } |
實現以上所聲明的函數,當分頁第一次加載的時候,我們需要從服務器獲取總頁數來生成分頁控件,所以首先實現loadData函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | loadData: function (o){
var that = this ;
var data = that.genData(o);
$.ajax({
url: o.url,
data: data,
type: 'post' ,
dataType: 'html' ,
cache: false ,
success: function (result){
var res = $(result).find( 'tbody' ).html();
var totalPage = $(result).find( '#totalPage' ).val();
var currentPage = $(result).find( '#currentPage' ).val();
o.currentPage=currentPage;
o.pager.empty();
$.line.setLine(totalPage,o); //調用生成分頁控件的函數
},
error: function (){
alert( "error" );
}
})
} |
下面我們實現上面生成分頁控件的函數$.line.setLine
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | $.line={
setLine: function (totalPage,o){
for ( var i=0;i<totalPage;i++){
var a=$( '<a/>' ).html( '<span>' +(i+1)+ '</span>' ).addClass( 'pageA' ).bind( 'click' , function (){
var s=$( this );
s.siblings().removeClass( 'pageActive' );
s.addClass( 'pageActive' );
o.currentPage=s.text();
$.page.loadData(o);
});
if (o.currentPage==i+1){
a.addClass( 'pageActive' );
}
o.pager.append(a);
}
var limit= this .getLimit(o,totalPage);
var aPage=o.pager.find( 'a.pageA' ).not( 'a.previous,a.nextAll,a.record' );
aPage.hide();
aPage.slice(limit.start,limit.end).show();
var prev=$( '<a/>' ).html( '<span>上一頁</span>' ).addClass( 'pageA previous' ).unbind( 'click' ).bind( 'click' , function (){
var pageActive=o.pager.find( 'a.pageActive' );
var s=$( this );
if (pageActive.prev().text()== '上一頁' ){
alert( '已經是第一頁!' );
return false ;
}
pageActive.removeClass( 'pageActive' );
pageActive.prev().addClass( 'pageActive' );
o.currentPage=pageActive.prev().text();
$.page.loadData(o);
});
var next=$( '<a/>' ).html( '<span>下一頁</span>' ).addClass( 'pageA nextAll' ).unbind( 'click' ).bind( 'click' , function (){
var pageActive=o.pager.find( 'a.pageActive' );
var s=$( this );
if (pageActive.next().text()== '下一頁' ){
alert( '已經是最後一頁!' );
return false ;
}
pageActive.removeClass( 'pageActive' );
pageActive.next().addClass( 'pageActive' );
o.currentPage=pageActive.next().text();
$.page.loadData(o);
});
var pageActiveText=o.pager.find( 'a.pageActive' ).text();
var record=$( '<a/>' ).html( '<span>' +pageActiveText+ '/' +totalPage+ '</span>' ).addClass( 'pageA record' );
o.pager.prepend(prev).prepend(record).append(next);
} } |
在上面的代碼中我們給當前的頁面加上了pageActive類,所以現在我們可以實現$.page的getCurrentPage函數,非常簡單
1 2 3 4 | getcurrentPage: function (o){
var p = o.pager.find( "a.pageActive" ).text();
return p; } |
接着我們實現生成json數據的genData函數,json格式爲{key:value,key:value}
1 2 3 4 5 | genData: function (o){
var sdata = $.extend({}, { "currentPage" : o.currentPage,
"pageSize" : o.pageSize}, $.jsonObj(o.pageForm));
return sdata;
}, |
上面的$.jsonObj爲自定義的函數,爲了生成我們需要的json格式以便發送查詢的數據,只支持input,select
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | $.jsonObj = function (form){
//判斷是否有序列化的東東
if (!$(form).html() || $(form).html() == null || $.trim($(form).html()) == "" ) {
return null ;
}
var formEl = $(form).find( 'input[type="text"]' );
var formselect = $(form).find( 'select' );
var json = "{" ;
for ( var i = 0; i < formEl.length - 1; i++) {
var name = formEl.eq(i).attr( 'name' );
var val = "'" + formEl.eq(i).val() + "'" ;
json += name;
json += ":" ;
json += val;
json += "," ;
}
var lname = formEl.eq(formEl.length - 1).attr( 'name' );
var lval = "'" + formEl.eq(formEl.length - 1).val() + "'" ;
json += lname;
json += ":" ;
json += lval;
if (formselect) {
json += "," ;
for ( var i = 0; i < formselect.length - 1; i++) {
var name = formselect.eq(i).attr( 'name' );
var val = "'" + formselect.eq(i).val() + "'" ;
json += name;
json += ":" ;
json += val;
json += "," ;
}
var lname = formselect.eq(formselect.length - 1).attr( 'name' );
var lval = "'" + formselect.eq(formselect.length - 1).val() + "'" ;
json += lname;
json += ":" ;
json += lval;
}
json += "}" ;
var jsonObj = eval( "(" + json + ")" )
return jsonObj;
} |
接着我們爲查詢表單的按鈕綁定事件,我們擴展下我們的$.page函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | handleQueryLine: function (o){
$(o.form).find( ".query" ).click( function (){
//$(o.pageForm).append($(o.form).clone(true));
$(o.pageForm).empty();
$(o.form).find( 'input[type="text"]' ).each( function (){
var vals = $( this ).val();
var s = $( this ).clone().val(vals);
$(o.pageForm).append(s);
});
$(o.form).find( 'select' ).each( function (){
var vals = $( this ).val();
var s = $( this ).clone().val(vals);
$(o.pageForm).append(s);
});
$.page.query(o);
}); } |
ok,基本的函數已經完成,下面完成主函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | $.fn.simplePage = function (os){
var options = {
pager: '.pager' , //表格控件的容器
container: '.tableData' , //放置表格數據的容器
form: '#form' , //放置查詢條件的表單
pageForm: '#pageForm' , //放置隱藏與的Div
url: '' , //發送請求的地址
currentPage: 1,
pageSize: 2,
type: null , //可選:action,
pageShow:7 //,
};
var o = $.extend(options, os);
return this .each( function (){
o.pager = $( this ).find(o.pager);
o.container = $( this ).find(o.container);
//首先清除click事件
o.pager.unbind( 'click' );
if (o.type == 'action' ) {
//指定的動作,比如刪除時的事件,這時需要在當前頁刷新數據
o.currentPage = $.page.getPageSize(o);
o.pageSize = $.page.getCurrentPage(o);
$.page.loadData(o);
return ;
}
$.page.loadData(o);
$.line.handleQueryLine(o);
})
} |
現在我們的分頁還不是很好看,我們用firebug查看下生成的分頁結構,寫了如下樣式
.pager a {
display
:
block
;
float
:
left
;
width
:
16px
;
height
:
16px
;
margin
:
5px
;
}
.pager a.pageA{
background
:
url
(
"../images/grid/page.png"
)
no-repeat
left
0px
transparent
;
display
:inline-
block
;
font-size
:
14px
;
margin
:
0
3px
;
padding-left
:
6px
;
text-align
:
center
;
vertical-align
:
bottom
;
height
:
auto
;
width
:
auto
;
cursor
:
pointer
;
}
.pager a.pageA span{
background
:
url
(
"../images/grid/page.png"
)
no-repeat
right
0px
transparent
;
display
:inline-
block
;
height
:
24px
;
line-height
:
22px
;
padding-right
:
6px
;
}
.pager a.pageActive{
background
:
url
(
"../images/grid/page.png"
)
no-repeat
left
-24px
transparent
;
}