最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--参数控件
<!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产业工人,挣了日本人的钱还严重打击日本的软件业!