参数控件javascript 页码控件 -java教程

最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--参数控件

    

    

    

    每日一道理
水仙亭亭玉立,兰花典雅幽香,牡丹雍容华贵,梨花洁白无暇……美丽的花朵总能得到世人的羡慕与赞叹,殊不知,它从一粒小小的种子到最后开花,要历经无数的艰辛与坎坷!我们的成长也是如此。只有做辛勤的“织梦者”,我们的梦想才会成真!
<!DOCTYPE html>
<html>
<head> 
<meta http-equiv=content-type content="text/html; charset=utf-8"> 

<script>
var PageNav = (function(){
    var _id = 1; //用于记标不同的页码控件

function f(options,extParam,callback){
    this.options={ //默许参数
        container:null,//父容器,id或Dom对象
        pagecount:1,//总页数     
        defaultPage:null, //控件初始化以后默许示显的页码,用于覆盖url页码参数,殊特情况下应用
        sibNum:4, //前当页阁下相邻页码数量
        pageKey:'page', //页码在url上应用的参数名
        reload:true,//是不是在点击页码时重载页面,如果是ajax翻页,设为false
        nextPrev:true, //是不是示显上一页下一页钮按
        firstLast:false,//是不是示显页首尾页钮按
        anyPage:true, //是不是示显页码输入框和转跳钮按
        dotted:true, //是不是在不连惯页码的位置插入略省号
        defaultStyle:true //是不是应用默许控件式样,wait...
    };
    this.curPage = 1; //前当页码   
    this.gotoPage = 1; //将要转跳到的页码   
    this.lockedParams={}; //锁定不允许修改的url参数,如: {key1:true,key2:true}
    this.extParam={}; //在url上额定示显的参数,{key1:1,key2:function(param,true){}},在数函内应用this可以拜访页码控件, 如果值为数函动自设置第一个参数为前当页码,如果给出第二个参数(意任值),设第一个参数为页码控件对象,其他参数不再受理
    this.callbacks=[];     //页码转跳前执行的回调数函,可以多个
    this.id = 'pageBar_'+(_id++); //页码控件id
    this.pageBarDom = null; //页码控件初始化以后保存在这里,如果初始化时未指定container,可以通过该属性找到控件   
    this.barStyle={ //默许式样,渣 css,不能自理,自重...,页码钮按应用span而不是 a 签标,因此低版本IE没有hover式样效果
  'pageBar-hoder':"position:relative;display:none;margin:3px;border:0px;font-family:'arial,sans-serif';font-size:12px;text-align:center;height:25px;line-height:25px;zoom:1;",
  'pageBar-all-btn':"position:relative;display:inline-block;margin:0px 1px;border:1px solid #ccc; border-radius:3px;color:#0066cc;height:25px;line-height:25px;cursor:pointer;zoom:1;vertical-align:middle;",
  'pageBar-all-btn-hover':"",          
  'pageBar-page-btn':"width:30px;",    
  'pageBar-page-btn-hover':"background-color:#AC75BA;",  
  'pageBar-curPage-btn':"border:0px;color:red;background-color:white;",  
  'pageBar-curPage-btn-hover':"background-color:white;", 
  'pageBar-nextPrev-btn':"width:45px;",
  'pageBar-nextPrev-btn-hover':"background-color:#23fdac;",
  'pageBar-firstLast-btn':"width:45px;",
  'pageBar-firstLast-btn-hover':"background-color:#da4587;",
  'pageBar-anyPage-btn':"width:30px;",
  'pageBar-anyPage-btn-hover':"background-color:#ad45ff;",
  'pageBar-anyPage-input':"width:35px;height:25px;line-height:25px;margin:0px 1px;border:1px solid #ccc; border-radius:3px;vertical-align:middle;" ,
  'pageBar-hoder-hover':'background-color:white'     
    };
    var args=[];
    for(var i=0,len=arguments.length; i<len;i++)
    {
        args.push(arguments[i]);
    }   
    this.init.apply(this,args);
}

f.prototype={   
    constructor:f,
    init:function(options,extParam,callback){ //受接用户传入参数并初始化控件
        var host = this;
        for(var i=0;i<arguments.length;i++)
        {//接收参数            
            if(arguments[i]===undefined){
                continue;
            }else if(typeof(arguments[i])==='string'||!arguments[i]||arguments[i].nodeType==1&&arguments[i].ownerDocument.nodeType==9){//字符串、false、null、DOM点节参数作为容器ID接收,如果有多个,只接收最右侧的一个
                host.options.container = arguments[i]||null;
            }else if(typeof(arguments[i])==='number'){//字数参数作为总页数接收
                arguments[i]>0?host.options.pagecount=arguments[i]:'';
            }else if(arguments[i].constructor===Function){ //数函参数部全作为回调数函接收,果苹浏览器把正则表达式判断为function型
                host.callbacks.push(arguments[i]);
            }else if(Object.prototype.toString.call(arguments[i])==='[object Object]'){ //object字面量参数作为options或extParam理处,其他怪僻型参数不受理
                if(!i){ //options设置只能放在第一个参数,否则部全作为额定附加URL参数清单接收
                    host._paramsJoin(host.options,arguments[i]);
                }else{
                    host._paramsJoin(host.extParam,arguments[i]);                    
                }
            }
        }//end for
       
        //修正container为dom对象
        var container = host.options.container;
        container&&typeof(container)==='string'&&(host.options.container=host._getById(container));   
          
  
        //如果经已建创过控件,再次调用init方法将应用新参数重建控件
        host.get()&&(host.get().innerHTML = "");   
       
        host.lockParams(host.options.pageKey) //锁定页码参数关键字
            .setCurPage() //指定前当页码
            .create() //建创页码控件
     .createStyle()
            .show(); //示显页码     
       
        return host;
    },
   
    get:function(){ //获得控件Dom对象
        var host = this;
        return host._getById(host.id)||host.pageBarDom;
    },
           
    show:function(container){//示显控件
        var host = this;
       
        //修正父容器
        var container = arguments[0]||host.options.container;       
        if(typeof(container)=='string'){
            container = host._getById(arguments[0]);
        }   
        host.options.container = container;
       
        var pageBar = host.get();
        pageBar.style?pageBar.style.display="inline-block":pageBar.style.cssText="display:inline-block";       
       
     if(host.options.pagecount >1){
            container&&container.appendChild(pageBar);    
        }  
            
        return host;
    },
   
    hide:function(){//藏隐控件
        var host = this;
        var pageBar = host.get();
        pageBar.style?pageBar.style.display="none":pageBar.style.cssText="display:none";
        return host;
    },
   
    destroy:function(){//毁销控件
        var host = this;
        var pageBar = host.get();
        pageBar.parentNode.removeChild(pageBar);
        return null;
    },
   
    excePage:function(page){ //执行页码翻页作动
        var host = this;
        if(!arguments.length||host.curPage==arguments[0]){
            return host;
        }
       
        host._setGotoPage(page);       
        var gotoPage = host.getGotoPage();
       
        for(var i=0,len=host.callbacks.length;i<len;i++)
        {//执行翻页前的回调数函
            host.callbacks[i].call(host,host.callbacks[i].length>1?host:gotoPage);
        }
               
        if(!host.options.reload){
            host.setCurPage(gotoPage);   
            host.reFleshBar();           
        }else{//转跳           
            window.location.href=host._getNewUrl();
        }
       
        return host;
    },
   
    lockParams:function(params,frag){//加锁、解锁参数
        var host = this;
        if(typeof(params)==='string'){//单个参数                   
            arguments[1]?host.lockedParams[params]=true:(function(){delete host.lockedParams[params];})();           
        }else if(Object.prototype.toString.call(params)=='[object Array]'){ //数组式形的多个参数
            for(var i=0,len=params.length;i<len;i++)
            {
                arguments[1]?host.lockedParams[params[i]]=true:(function(){delete host.lockedParams[params[i]];})();
            }
        }else if(Object.prototype.toString.call(params)=='[object Object]'){ //{key:frag}
            for(var key in params){
                params[key]?host.lockedParams[key]=true:(function(){delete host.lockedParams[key];})();
            }   
        }           
        return host;
    },     
   
    setAnchor:function(key,val){ //设置锚点
        var host = this;
        var anchor=[arguments[0],arguments[1]].join('=').replace(/(^\=)|(\=$)/,'');
        if(anchor){
            window.location = window.location.toString().split("#")[0]+"#"+anchor;
        }        
        return host;
    }, 
   
    getAnchor:function(){       
        return window.location.hash.substr(1);       
    },
   
    setCurPage:function(curPage){ //设置前当页码
        var host = this;
        var page = arguments[0]
                    ||host.options.defaultPage
                    ||window.location.search.split(host.options.pageKey+'=')[1];               
        host.curPage = [1,parseInt(page)||1,host.options.pagecount].sort(function(a,b){ return a-b;})[1];                       
        return host;
    },
   
    getCurPage:function(){//获得前当页码
        var host = this;
        return host.curPage;
    },
 
    _setGotoPage:function(page){ //设置将要转跳的页码
        var host = this;
        host.gotoPage = [1,parseInt(arguments[0])||1,host.options.pagecount].sort(function(a,b){ return a-b;})[1];         
        return host;
    },
   
    getGotoPage:function(){
        var host = this;
        return host.gotoPage;
    },
       
    _getById:function(id){ //按id获得DOM元素
        return document.getElementById(arguments[0]);
    },   
   
    _getUrlParams:function(){ //获得url参数
        var host = this;
        var urlParams = {};
        var urlParamsArr = window.location.search.substr(1).replace(/(^\&)|(\&$)/,'');
        urlParamsArr = urlParamsArr?urlParamsArr.split("&"):[];
              
        for(var i=0,len=urlParamsArr.length;i<len;i++)
        {           
            var paramArr = urlParamsArr[i].split("=");
            urlParams[paramArr[0]]=paramArr[1]==undefined?undefined:paramArr[1].replace(/(^\s)|($\s)/,'');
        }       
        return urlParams;       
    },
   
    _paramsJoin:function(paramsExist,addParams,lockedParams){ //并合对象键值
        //addParams 要并合的参数,paramsExist 原url存在的参数,lockedParams锁定的参数不允许换替
            var host = this;
            //不受理非键值型对象
            if(Object.prototype.toString.call(addParams)!='[object Object]'){ return paramsExist; }
           
            var newParams=paramsExist;
            var lockedParams = lockedParams||host.lockedParams;
            //新增参数,若有和原参数重复,覆盖原参数,锁定的参数除外
            for(var key in addParams){   
                //不受接addParams对象承继来的属性
                if(!addParams.hasOwnProperty(key)||lockedParams[key]){continue;}
                           
                if((addParams[key]).constructor===Function){
                    newParams[key] = addParams[key](addParams[key].length>1?host:host.getGotoPage());
                }else if(typeof(addParams[key])!='number'
                            && typeof(addParams[key])!='string'
                            && typeof(addParams[key])!='boolean'){
                                    newParams[key] = '';
                }else{
                    newParams[key]=addParams[key];
                }
            }  
               
            return newParams;
    },
 
    _getNewUrl:function(){ //生成新址网
        var host = this;              
        var urlParams = host._paramsJoin(host._getUrlParams(),host.extParam);
        urlParams[host.options.pageKey] = host.getGotoPage(); //新页码 
        var url = window.location;   
        var mainUrl = [url.protocol,'//',url.host,url.pathname].join(''); //址网
        var antor = url.hash; //锚点
   
        var searchArr = []; //参数
        for(var key in urlParams)
        {
            searchArr.push(urlParams[key]==undefined?key:[key,urlParams[key]].join('='));
        }
        var searchStr = searchArr.join('&');
        
        searchStr = searchStr?'?'+searchStr:'';       
        var newUrl = [mainUrl,searchStr,antor].join('');
       
        return newUrl;   
    },
       
    reFleshBar:function(){ //刷新页码控件,用于无刷新翻页
        var host = this;
        var pageBar = host.get();               
        pageBar.innerHTML="";
        host.create().show();       
        return host;
    },    


create:function(){ //组装pagebar   
        var host = this;
        var curPage = host.curPage;
        var maxPage = host.options.pagecount;
        var sibNum = host.options.sibNum;
        var start = Math.max(1,[1,curPage-sibNum,maxPage-2*sibNum].sort(function(a,b){return a-b;})[1]);
        var end = Math.min(start+sibNum*2,maxPage);      
        var pageBar=host.pageBarDom||host._createBarElm(0);
        var pageBtn=host._createBarElm(1);
        var firstLastBtn = host._createBarElm(2);
        var nextPrevBtn = host._createBarElm(3);
        var gotoBtn = host._createBarElm(4);
        var input = host._createBarElm(5);   
        var newPageBtn;
               
        if(curPage>1&&host.options.firstLast){
            var firstBtn = firstLastBtn.cloneNode(true);
            firstBtn.appendChild(host._createBarElm(6,'页首'));
            firstBtn.onclick = function(){
                host.excePage(1);   
            }
            pageBar.appendChild(firstBtn);
            if(start==1){ start++;}
        }else if(start>1){
            newPageBtn = pageBtn.cloneNode(true);
            newPageBtn.onclick = function(){                               
                    host.excePage(parseInt(this.innerHTML));               
            };
            pageBar.appendChild(newPageBtn).appendChild(host._createBarElm(6,1));           
         }
        
        if(start>2&&host.options.dotted)
        {
            pageBar.appendChild(host._createBarElm(6,'...'));    
        }
           
        do{                   
            newPageBtn = pageBtn.cloneNode(true);
            newPageBtn.onclick = function(){                                       
                    host.excePage(parseInt(this.innerHTML));
            };
            if(start==curPage){
    newPageBtn.className="pageBar-page-btn pageBar-curPage-btn";
            }
            pageBar.appendChild(newPageBtn).appendChild(host._createBarElm(6,start));           
            start++;
        }while(start<=end);
       
        if(end<maxPage-1&&host.options.dotted){            
            pageBar.appendChild(host._createBarElm(6,'...'));   
           
        }
       
        if(curPage<maxPage&&host.options.firstLast){
            var lastBtn = firstLastBtn.cloneNode(true);
            lastBtn.appendChild(host._createBarElm(6,'尾页'))
            lastBtn.onclick = function(){
                host.excePage(maxPage);   
            }
            pageBar.appendChild(lastBtn);
            if(end==maxPage){ end--;}
        }else if(end<maxPage){
            newPageBtn = pageBtn.cloneNode(true);
            newPageBtn.onclick = function(){                                       
                    host.excePage(parseInt(this.innerHTML));               
            };
            pageBar.appendChild(newPageBtn).appendChild(host._createBarElm(6,maxPage));   
        }    
               
        if(host.options.nextPrev){ //上一页下一页钮按
            if(curPage>1){
                var prevBtn = nextPrevBtn.cloneNode(true);
                prevBtn.onclick=function(){
                    host.excePage(curPage-1);
                }
                prevBtn.appendChild(host._createBarElm(6,'上一页'));
                pageBar.insertBefore(prevBtn,pageBar.firstChild);
            }
           
            if(curPage<maxPage){
                var nextBtn = nextPrevBtn.cloneNode(true);
                nextBtn.onclick=function(){
                    host.excePage(curPage+1);
                }
                nextBtn.appendChild(host._createBarElm(6,'下一页'));
                pageBar.appendChild(nextBtn);
            }
       
        }
       
        if(host.options.anyPage){ //页码转跳输入框及钮按
            var newGotoBtn = gotoBtn.cloneNode(true);
            var newInput = input.cloneNode(true);
            newGotoBtn.onclick=function(){
                var npage = parseInt(newInput.value);
                npage>0&&host.excePage(npage);
            }
            pageBar.appendChild(newInput);
            pageBar.appendChild(newGotoBtn)
                        .appendChild(host._createBarElm(6,'GO'));
        }
           
        host.pageBarDom = pageBar;               
        return host;

    },

_createBarElm:function(type,attrs){ //生成控件上的钮按
        var host = this;   
        var elm;
        switch(type){
            case 0://控件外框
                elm = host._createElm('span',{id:host.id});          
                break;
            case 1: //页码字数钮按
                elm = host._createElm('span',{"class":"pageBar-page-btn"});              
                break;
            case 2: //页首尾页
                elm = host._createElm('span',{"class":"pageBar-firstLast-btn"});              
                break;
            case 3: //上一页下一页
                elm = host._createElm('span',{"class":"pageBar-nextPrev-btn"});              
                break;
           
            case 4: //goto Button
                elm = host._createElm('span',{"class":"pageBar-anyPage-btn"});                
                break;
            case 5://input
                elm = host._createElm('input',{"class":"pageBar-anyPage-input"});                      
                break;
            case 6://textNode
                elm = host._createElm('textNode',attrs);
                break;           
        }
             
        return elm;       
    },
   
    _createElm: function(elmName,attrs) {
        //建创元素点节
        var elm;
        if(elmName=="textNode") {
            if(arguments.length==1) {
                attrs="";
            }
            elm = document.createTextNode(attrs.toString());
        } else {
            elm = document.createElement(elmName);
            if(attrs) {               
                for(var attr in attrs) {      
     if(attr=="class"||attr=="className"){                     
                     elm.className = attrs[attr];
                    }else{
                     elm.setAttribute(attr,attrs[attr]);
                    }
     
                }
            } //end if(attrs)
        }
        return elm;
    },
    
    styleSheet:function(){//获得文档最后一个式样表
        var host = this;
        var styleSheets = document.styleSheets
        if(!styleSheets.length){
            document.getElementsByTagName("head")[0].appendChild(document.createElement("style"));
        }        
        return styleSheets[styleSheets.length-1];
        
    },
    
    cssRules:function(styleSheet){//式样表的式样
        host = this;
        return styleSheet?(styleSheet.cssRules||styleSheet.rules):null;    
    },
        
    addRule:function(styleSheet,selector,cssText,index){//增长一条式样
        var host = this;
        if(!styleSheet){ return host;}
        var cssRules = host.cssRules(styleSheet);
  
        if(index===undefined||index>cssRules.length){
            index = cssRules.length;
        }
        
        if(styleSheet.insertRule){
            styleSheet.insertRule(selector+'{'+cssText+'}',index);
        }else{
            styleSheet.addRule(selector,cssText,index);
        }
        
        return host;
    },
    
    removeRule:function(styleSheet,index){//删除一条式样
        var host = this;
        if(!styleSheet||!index){ return host;}
        if(styleSheet.removeRule){
            styleSheet.removeRule(index);
        }else{
            styleSheet.deleteRule(index);
        }
        
        return host;
    },
    
    createStyle:function(){
        var host=this;
        if(!host.options.defaultStyle){
            return host;
        }
          
  var styleSheet = host.styleSheet();
  var holderSelector = "#"+host.id;
  host.addRule(styleSheet,holderSelector,host.barStyle['pageBar-hoder'])
   .addRule(styleSheet,holderSelector+" span",host.barStyle['pageBar-all-btn'])
   .addRule(styleSheet,holderSelector+" .pageBar-page-btn",host.barStyle['pageBar-page-btn'])
   .addRule(styleSheet,holderSelector+" .pageBar-nextPrev-btn",host.barStyle['pageBar-nextPrev-btn'])
   .addRule(styleSheet,holderSelector+" .pageBar-firstLast-btn",host.barStyle['pageBar-firstLast-btn'])
   .addRule(styleSheet,holderSelector+" .pageBar-anyPage-btn",host.barStyle['pageBar-anyPage-btn'])
   .addRule(styleSheet,holderSelector+" .pageBar-anyPage-input",host.barStyle['pageBar-anyPage-input'])
   .addRule(styleSheet,holderSelector+" .pageBar-curPage-btn",host.barStyle['pageBar-curPage-btn'])   
   ;
 // if(!window.document.all){//非IE  
   host.addRule(styleSheet,holderSelector+" span:hover",host.barStyle['pageBar-all-btn-hover'])
   .addRule(styleSheet,holderSelector+" span.pageBar-page-btn:hover",host.barStyle['pageBar-page-btn-hover'])
   .addRule(styleSheet,holderSelector+" span.pageBar-nextPrev-btn:hover",host.barStyle['pageBar-nextPrev-btn-hover'])
   .addRule(styleSheet,holderSelector+" span.pageBar-firstLast-btn:hover",host.barStyle['pageBar-firstLast-btn-hover'])
   .addRule(styleSheet,holderSelector+" span.pageBar-anyPage-btn:hover",host.barStyle['pageBar-anyPage-btn-hover'])
   .addRule(styleSheet,holderSelector+" span.pageBar-curPage-btn:hover",host.barStyle['pageBar-curPage-btn-hover'])
   .addRule(styleSheet,holderSelector+":hover",host.barStyle['pageBar-hoder-hover'])
   ; 
 // }
         
        return host;
    }

}

return f;
})();

</script>

 

</head>

<body >
<span id="page_2"  style="display: block;"></span>
<script>
 var page2 = new PageNav({  
            container:'page_2',                
            pagecount:10,
            pageKey:'page',
            reload:true,        
            nextPrev:true, //是不是示显上一页下一页钮按
            firstLast:true,//是不是示显页首尾页钮按
            anyPage:true, //是不是示显页码输入框和转跳钮按
            dotted:true,  //是不是在略省页码出插入略省号
            defaultStyle:true
            },{k:9},function(a,b){alert(this.getGotoPage());});
/*
 或
 var page2 = new PageNav('page_2',15);

 或
 var page2 = new PageNav('page_2',15).show('page_2');
*/

</script>
</body>
</html>

 

文章结束给大家分享下程序员的一些笑话语录: IT业众生相
第一级:神人,天资过人而又是技术狂热者同时还拥有过人的商业头脑,高瞻远瞩,技术过人,大器也。如丁磊,求伯君。
第二级:高人,有天赋,技术过人但没有过人的商业头脑,通常此类人不是顶尖黑客就是技术总监之流。
第三级:牛人,技术精湛,熟悉行业知识,敢于创新,有自己的公司和软件产品。
第四级:工头,技术精湛,有领导团队的能力,此类人大公司项目经理居多。
第五级:技术工人,技术精湛,熟悉行业知识但领导能力欠加,此类人大多为系分人员或资深程序员,基本上桀骜不逊,自视清高,不愿于一般技术人员为伍,在论坛上基本以高手面目出现。
第六级:熟练工人,技术有广度无深度,喜欢钻研但浅尝辄止。此类人大多为老程序员,其中一部分喜欢利用工具去查找网上有漏洞的服务器,干点坏事以获取成绩感。如果心情好,在论坛上他们会回答菜鸟的大部分问题。此级别为软件业苦力的重要组成部分。
第七级:工人,某些技术较熟练但缺乏深度和广度,此类人大多为程序员级别,经常在论坛上提问偶尔也回答菜鸟的问题。为软件产业苦力的主要组成部分。
第八级:菜鸟,入门时间不长,在论坛上会反复提问很初级的问题,有一种唐僧的精神。虽然招人烦但基本很可爱。只要认真钻研,一两年后就能升级到上一层。
第九级:大忽悠,利用中国教育的弊病,顶着一顶高学历的帽子,在小公司里混个软件部经理,设计不行,代码不行,只会胡乱支配下属,拍领导马屁,在领导面前胡吹海侃,把自己打扮成技术高手的模样。把勾心斗角的办公室文化引入技术部门,实在龌龊!
第十级:驴或傻X,会写SELECT语句就说自己精通ORALCE,连寄存器有几种都不知道就说自己懂汇编,建议全部送到日本当IT产业工人,挣了日本人的钱还严重打击日本的软件业!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值