從零開始做一個(gè)pagination分頁組件
開始一個(gè)組件,毫無目的的寫代碼是一個(gè)不好的習(xí)慣,要經(jīng)歷 分析 => 抽象 => 實(shí)現(xiàn) => 應(yīng)用 四個(gè)階段。
組件DEMO地址:https://github.com/CaptainLiao/zujian/tree/master/pagination
分析需求
當(dāng)前頁碼顯示前后三頁,以及在兩端顯示上一頁、下一頁
未顯示的地方用 ‘...'代替
舉個(gè)栗子:
假設(shè)總共有30頁
當(dāng)前為第一頁:1 2 3 4 ... 30 下一頁
當(dāng)前為第二頁:上一頁 1 2 3 4 5 ... 30 下一頁
當(dāng)前為第三頁:上一頁 1 2 3 4 5 6 ... 30 下一頁
.
當(dāng)前為第6頁:上一頁 1 ... 3 4 5 6 7 8 9 ... 30 下一頁
.
當(dāng)前為第29頁:上一頁 1 ... 26 27 28 29 30 下一頁
當(dāng)前為第30頁:上一頁 1 ... 27 28 29 30
抽象
分析上面的例子,發(fā)現(xiàn)決定輸出的因素有兩個(gè):當(dāng)前頁碼和總頁數(shù)。
于是,我們設(shè)定一個(gè)函數(shù)用來表示當(dāng)前頁碼的顯示內(nèi)容:
/** * @param {Number} page 當(dāng)前頁 * @param {Number} totalPage 總頁數(shù) */ function pagination(page, totalPage) { var str = ''; // todo... return str; } // 運(yùn)行函數(shù),打印出值 var ret = pagination(4, 30) console.log(ret)
>上一頁 1 2 3 4 5 6 7 ... 30 下一頁
實(shí)現(xiàn)
輸入和輸出都有了,接著正式開始擼:
function pagination(page, totalPage) { var str = page; // 這里實(shí)現(xiàn)當(dāng)前頁面顯示前后三項(xiàng)功能 for(var i=1; i< totalPage; i++) { if(page-i>1) { str = page-i +' '+ str; } if(page + i < totalPage) { str = str + ' ' + (page+i) } } // 以page為中心,向左右擴(kuò)展 // 向左,先判斷當(dāng)前page向左的第四個(gè)數(shù)是否大于 1 if(page-4 > 1) { str = '... ' + page; } // 繼續(xù)向左判斷 if(page >1) { str = "上一頁" + '... ' +1 +' ' +str; } // 向右,判斷當(dāng)前page向右的第四個(gè)數(shù)字是否小于 totalPage if(page + 4 < totalPage) { str = '... '+ str; } if(page < totalPage) { str = str +' ' + totalPage +' '+ '下一頁'; } return str; }
現(xiàn)在,我們可以執(zhí)行下面的函數(shù),取得我們想要的結(jié)果:
var total = 30; for(var i = 1; i< total; i++) { var ret = showPage(i, total); console.log(ret) }
至此,我們已經(jīng)實(shí)現(xiàn)了分頁的邏輯。
應(yīng)用
接下來的應(yīng)用就非常簡單了,不外乎是給str 加一些標(biāo)簽和class,于是我們就得到了一個(gè)分頁組件:
HTML:
<ul id="pagination-list" class="clearfix2"> </ul>
javascript:
function pagination(page, totalPage) { var str = '<li class="page-active">'+page+'</li>'; for(var i=1; i<=3; i++) { if(page - i > 1) { str = '<li class="page-item">'+(page-i)+'</li>' +' '+ str; } if(page + i < totalPage) { str = str +" "+'<li class="page-item">'+(page+ i)+'</li>' } } if(page-4 >1) { str = '<li class="page-item">... </li>' +str; } if (page >1) { str= '<li class="page-up">上一頁</li>'+ ' '+'<li class="page-item">1</li>' +' '+ str; } if(page+4< totalPage) { str = str+ '<li class="page-item"> ...</li>'; } if(page < totalPage) { str = str + " " +'<li class="page-item">'+totalPage+'</li>' +" " +'<li class="page-down">下一頁</li>' } return str; } var totalPage = 30; var str = pagination(1, totalPage); var wrap = $("#pagination-list"); // 這里引用了 jQuery wrap.html(str) .on('click', '.page-item', function () { var cur = parseInt($(this).text()); wrap.html(pagination(cur, totalPage)); });
看看效果吧:
目前來說,進(jìn)展順利,但是!還有很多需要優(yōu)化的地方:樣式固定,不能自由更改;初始化和交互混雜在一起,沒有對代碼進(jìn)行封裝...
又經(jīng)過一番折騰,這個(gè)分頁組件終于完成,下載demo:
https://github.com/CaptainLiao/zujian/tree/master/pagination
現(xiàn)在,我們可以這樣調(diào)用它:
<script> // #pagination-list 是組件的父容器,50 是總頁數(shù)。 $(function () { $("#pagination-list").pagination(50); }) </script>
是不是很酸爽呢?
如果繼續(xù)擴(kuò)展,我們還可以給組件更多的樣式選擇......
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- jQuery EasyUI API 中文文檔 - Pagination分頁
- jQuery Pagination Ajax分頁插件(分頁切換時(shí)無刷新與延遲)中文翻譯版
- jquery pagination插件實(shí)現(xiàn)無刷新分頁代碼
- jquery.pagination.js 無刷新分頁實(shí)現(xiàn)步驟分享
- jquery分頁插件jquery.pagination.js使用方法解析
- Jquery 分頁插件之Jquery Pagination
- PHP框架Laravel插件Pagination實(shí)現(xiàn)自定義分頁
- jquery.pagination +JSON 動(dòng)態(tài)無刷新分頁實(shí)現(xiàn)代碼
- jquery插件pagination實(shí)現(xiàn)無刷新ajax分頁
- asp.net jquery無刷新分頁插件(jquery.pagination.js)
相關(guān)文章
js中使用DOM復(fù)制(克?。┲付ü?jié)點(diǎn)名數(shù)據(jù)到新的XML文件中的代碼
使用DOM復(fù)制(克?。┲付ü?jié)點(diǎn)名數(shù)據(jù)到新的XML文件中 ,用到三個(gè)類的相關(guān)知識(shí)點(diǎn) : DOMDocument - DOMNodeList - DOMNode2011-07-07javascript之對系統(tǒng)的toFixed()方法的修正
javascript之對系統(tǒng)的toFixed()方法的修正...2007-05-05通過JavaScript實(shí)現(xiàn)動(dòng)態(tài)圣誕樹詳解
這篇文章主要為大家介紹幾個(gè)好看的基于HTML+CSS+JS的圣誕樹,希望圣誕節(jié)那天圣誕老爺爺能把我喜歡的你塞到我床上。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12JavaScript對象屬性檢查、增加、刪除、訪問操作實(shí)例
這篇文章主要介紹了JavaScript對象屬性檢查、增加、刪除、訪問操作實(shí)例,本文分別給出代碼實(shí)例來講解如何給對象增加屬性、檢查屬性存在、以及刪除和訪問屬性,需要的朋友可以參考下2015-07-07Openlayers實(shí)現(xiàn)點(diǎn)閃爍擴(kuò)散效果
這篇文章主要為大家詳細(xì)介紹了Openlayers實(shí)現(xiàn)點(diǎn)閃爍擴(kuò)散效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09微信h5靜默和非靜默授權(quán)獲取用戶openId的方法和步驟
這篇文章主要介紹了微信h5靜默和非靜默授權(quán)獲取用戶openId的方法和步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06