寫的jquery分頁插件AmSetPager

第一次做的插件,早寫好了,後來發現一個jquery插件模板,就拿過來套。名字叫jquery.boilerplate.js。我的理解不是很深,也不太理解太多效率問題。

本來我是一個做asp.net開發的,可是公司好些個人包括美工沒太會js啊。項目很多js改來改去搞得我都頭大了。萌發了寫插件的想法,於是照葫蘆畫瓢寫啊,寫插件的過程也學了js的面向對象。對js,還有一些效率問題有了更深瞭解。以前有個項目單個頁面寫過600多行的js文件。全是按功能面向過程寫的。亂的不堪回首啊抓狂好吧先是說一下插件吧。


插件叫AmSetPager,首先是看一下樣子:


此處下載:點擊下載

我這個插件好像使用有些另類,是調用數據展示容器的元素$("#DataContent").AmSetPager({...});在參數中配置分頁容器元素ID。寫完插件後看別的插件都是調用分頁元素ID閉嘴

貼下源碼:

;(function ( $, window, document, undefined ) {
    // Create the defaults once
    var pluginName = "AmSetPager",
        defaults = {
            pagerName: "pager",			//分頁的容器(默認爲pager)
			viewCount: 5,				//可顯示多少條數據
			dataCount: 0,				//如果後臺取數據,總數多少(靜態的不用)
			selectClass: "selectno",			//選中的樣式

			listCount:10,				//顯示多少個分頁碼(不包括前一頁,後一頁)
			enablePrevNext:true,		//允許顯示前一頁後一頁
			enableFirst:true,			//允許只有一頁的情況下顯示頁碼
			template:"default",			//模板(現只有一個,default)
			
			mode:"static",				//"url" or "ajax"
			urlparameter:"",		//url參數,不用寫頁碼參數!後面aa=1&bb=2...
			callback:null			//回調函數(ajax取數據或者靜態也可以使用)
        };

    // The actual plugin constructor
    function Plugin( element, options ) {
        this.element = element;
        this.options = $.extend( {}, defaults, options );
        this._name = pluginName;
        this.init();
    }
	//獲取url參數
	var getQueryString = function (name) {
		var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
		var r = window.location.search.substr(1).match(reg);
		if (r != null) return unescape(r[2]); return undefined;
	}
	//靜態模板數據展示
	var Bind_StaticData = function ($content, minnum, maxnum) {
		if (minnum > 0) {
			$content.children(":gt(" + (minnum - 1) + "):lt(" + maxnum + ")").css("display", "");//chrome下使用block佈局錯亂,因此使用空
		} else {
			$content.children(":lt(" + maxnum + ")").css("display", "");
		}
		$content.children(":lt(" + (minnum) + ")").css("display", "none");
		$content.children(":gt(" + (maxnum - 1) + ")").css("display", "none");	
	}
	//格式化成a元素
	var FormatStr = function(pageNo,pageText,m,p) {
		var href = m=='url'?location.pathname+"?"+p+"&p="+pageNo:"javascript:void(0);";
		if (typeof (pageText) == "number") {
			return "<a href='"+href+"' >" + pageText + "</a>";
		}
		return "<a href='"+href+"' i='" + pageNo + "'>" + pageText + "</a>";
	}
	//選中狀態a元素
	var FormatStrIndex = function(pageNo,seclass){
		return "<span class='"+seclass+"'>" + pageNo + "</span>";
	}	
	
	//private
	//分頁主要行爲邏輯部分
	//默認模板初始化頁碼集合
	var	InitDefaultList = function(_pageIndex,pageCount){
		if(this.options.listCount<5)
				throw new Error("listCount must be lager than 5");	//listCount>5
		var pageIndex = parseFloat(_pageIndex);		//轉化爲number
		var ns = [];
		var numList = new Array(this.options.listCount);	
		if (pageIndex >= this.options.listCount) {   
			numList[0] = 1;
			numList[1] = "…";	
			var infront = 0;
			var inback = 0;
			var inflag = Math.floor((this.options.listCount-2)/2);
			if(this.options.listCount%2==0){
				infront = inflag-1;
				inback = inflag;
			}else{
				infront = inflag;
				inback = inflag;
			}
			if (pageIndex + inback >= pageCount) {                
				for (i = pageCount - (this.options.listCount-3); i < pageCount + 1; i++) {
					ns.push(i);
				}
				for (j = 0; j <= (this.options.listCount-3); j++) {  
					numList[j + 2] = ns[j];
				}
			}
			for (i = pageIndex - infront; i <= pageIndex + inback; i++) {
				ns.push(i);
			}
			for (j = 0; j < (this.options.listCount-2); j++) {
				numList[j + 2] = ns[j];
			}
		} else {              
			if (pageCount >= this.options.listCount) {                               
				for (i = 0; i < this.options.listCount; i++) {
					numList[i] = i+1;
				}
			} else {                        
				for (i = 0; i < pageCount; i++) {
					numList[i] = i+1;
				}
			}
		}
		return numList;
	}
	//生成頁碼
	var InitPager = function (pageIndex, pageCount) {
		$("#"+this.options.pagerName).html('');
		if(!this.options.enableFirst&&pageCount<=1){
			return null;
		}
		var array = [];
		var $con = $("#"+this.options.pagerName);
		switch(this.options.template){	//選擇模板
			case 'default':array = InitDefaultList.call(this,pageIndex,pageCount);break;
			default:array = InitDefaultList.call(this,pageIndex,pageCount);
		}
		var arr_len = array.length;
		if(!array instanceof Array){
			throw new Error("is not array");
		} 
		if(arr_len!=this.options.listCount){
			throw new Error("array.length error:"+arr_len);
		}
		if(pageIndex>1&&this.options.enablePrevNext){
			$con.append(FormatStr(pageIndex-1,'上一頁',this.options.mode,this.options.urlparameter));      
		}	
		for(var i=0;i<arr_len;i++){
			if(typeof array[i]=='undefined'){
				continue;
			}
			if(pageIndex==array[i]){
				$con.append(FormatStrIndex(array[i],this.options.selectClass));
			}else if(typeof array[i]=='number'){
				$con.append(FormatStr(array[i],array[i],this.options.mode,this.options.urlparameter));
			}else{
				$con.append(array[i]);
			}
		}
		if(pageIndex<pageCount&&this.options.enablePrevNext){
			$con.append(FormatStr(pageIndex+1,'下一頁',this.options.mode,this.options.urlparameter)); 			
		}
	}
    Plugin.prototype = {
		//初始化
        init: function () {
            var that = this;
            var options = that.options;
            var $thisbase = $(that.element);
			var $content;
			if ($thisbase.is(':has(tbody)')) {
			    $content = $thisbase.children('tbody');
			}
			else{
				$content=$thisbase;
			}	
			var count = options.mode=='static'?$content.children().length:options.dataCount;		
			var eachcount = options.viewCount;				
			var totalpage = Math.ceil(count / eachcount); 
			var $pager = $("#"+options.pagerName);
			if(options.mode=='url'){
				var urlindex = getQueryString("p");
				if(isNaN(urlindex)){
				    InitPager.call(that, 1, totalpage);
				}else{
					urlindex = parseFloat(urlindex);//要轉換成數字
					InitPager.call(that, urlindex > totalpage ? totalpage : urlindex, totalpage);
				}
			} else {
			    
			    InitPager.call(that, 1, totalpage);
				if(options.mode=='static'&&typeof options.callback!='function'){
					Bind_StaticData($content,0,eachcount);
				}else{
					options.callback($content,1,options.viewCount);
				}
				$pager.bind("click",function(e){		//click事件
					if(e.target.tagName!='A') return;
					var $this = $(e.target);
					$this.removeAttr("href").siblings().attr("href", "javascript:void(0);");//..
					var indexnum = parseFloat($this.html())==$this.html()?parseFloat($this.html()):parseFloat($this.attr('i'));
					var maxnum = (indexnum * eachcount);
					var minnum = (indexnum - 1) * eachcount;
					if(options.mode!='static'&&options.mode!='ajax'){
						throw new Error("mode must be selected:static,url,ajax");
					}
					if(options.mode=='static'&&typeof options.callback!='function'){
					    InitPager.call(that, indexnum, totalpage);
						Bind_StaticData($content,minnum, maxnum);
					}else{
					    InitPager.call(that, indexnum, totalpage);
						options.callback($content,indexnum,options.viewCount);
					}
				});
			}
        }
    };
    $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" + pluginName, new Plugin( this, options ));
            }
        });
    };
})( jQuery, window, document );



說一下樣式(.pager就是分頁元素class):

<style type="text/css">
        .pager a{ text-decoration: none; border: 1px solid #e7ecf0;color: #15B;}
        .pager a:hover{ background-color:#E6EBEF}
        .pager a,.pager span{display: inline-block;padding: 0.1em 0.4em;margin-right: 5px; margin-bottom: 5px;}
        .selectno{background: #26B;color: #fff;border: 1px solid #AAE;}
    </style>


有三種方式,一個是頁面中數據容器有全部數據,這時就是mode:'static'。還有就是ajax按分頁方式取數據時,mode:'ajax',還有根據url傳參分頁mode:'url'(我感覺這時估計不會用到吧)。

首先靜態的:

html:

<table id="tablepager" border="0" cellpadding="0" cellspacing="0">
        <tr><td><p>1aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>2aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>3aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>4aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>5aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>6aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>7aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>8aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
        <tr><td><p>9aaaaaaaaaaaaaaaaaaaaaa</p></td></tr>
</table>
    <div id="pager" class="pager"></div>
js代碼:

$(function(){
$("#tablepager").AmSetPager({"viewCount":2,"mode":"static","listCount":6});
})

這裏也可以設置callback,和下面類似


截圖:


ajax的:

html:

<table id="tablepager" border="0" cellpadding="0" cellspacing="0">
        
</table>
    <div id="pager" class="pager"></div>

後臺獲取實例數據:

public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            int index = int.Parse(context.Request.QueryString["index"]);
            int viewCount = int.Parse(context.Request.QueryString["viewCount"]);
            List<string> list = new List<string>();
            for (int i = 1; i <= viewCount; i++)
            {
                list.Add(index + "_" + i + "....................");
            }
            JavaScriptSerializer ser = new JavaScriptSerializer();
            context.Response.Write(ser.Serialize(list));
            context.Response.End();
        }

js代碼:

<script type="text/javascript">
        $(function () {
            $("#tablepager").AmSetPager({ "viewCount": 3, "mode": "ajax", "dataCount": 30, "listCount": 6, "callback": function (ev, indexnum, viewCount) {//callback中三個參數分別爲:數據容器對象,當前頁,顯示幾條數據

                $.getJSON("Handler1.ashx", { "index": indexnum, "viewCount": viewCount }, function (data) {
                    ev.html('');
                    for (var i = 0; i < data.length; i++) {
                       ev.append("<tr><td>" + data[i] + "</td></tr>");
                    }
                });
            }
            });
        })
    </script>

截圖:


url的:

沒什麼可說的,js代碼:

$(function(){
		$("#tablepager").AmPager({"viewCount":5,"dataCount":50,"mode":"url","listCount":6,"urlparameter":"ss=1&ee=2"});
	})

urlparameter爲傳的參數,也必須設置每頁顯示,和數據總條數。點擊頁碼3,url地址欄爲 :test.htm?ss=1&ee=2&p=3


插件寫的可能有點臃腫,很多地方也不合理。希望大家下載試試,提提意見,讓一個菜鳥能成長,謝啦大笑



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章