JS處理數(shù)據(jù)實(shí)現(xiàn)分頁(yè)功能
這幾天有小伙伴討論起了分頁(yè)的相關(guān)問(wèn)題,這里我也簡(jiǎn)單講下前端如何簡(jiǎn)單便捷的利用Js(庫(kù))寫(xiě)出優(yōu)雅,好用的分頁(yè)工具。
分頁(yè)是個(gè)很簡(jiǎn)單又超多接觸的技術(shù)點(diǎn),粗略來(lái)講分如下兩種:
真分頁(yè)——每次根據(jù)頁(yè)碼、頁(yè)大小獲取數(shù)據(jù)并展示。
假分頁(yè)——一次性獲取所有數(shù)據(jù),根據(jù)頁(yè)碼、頁(yè)大小展示。
公認(rèn)比較好的做法是真分頁(yè),這樣可以避免很多問(wèn)題(如內(nèi)存占用過(guò)多)。
有一點(diǎn)需要注意,單純的前端是無(wú)法獨(dú)立完成數(shù)據(jù)分頁(yè)的(廢話(huà)),所以后端支持是必須的。
作為支持,webapi除了返回所請(qǐng)求的數(shù)據(jù),還應(yīng)返回?cái)?shù)據(jù)總量以便計(jì)算頁(yè)數(shù):

如上圖所示,我們可以看出數(shù)據(jù)總量27,分頁(yè)大小10(這邊只請(qǐng)求了10條數(shù)據(jù))。
如果你擁有如上圖的webapi的支持,就可以接著往下寫(xiě)了。
我使用對(duì)象字面量封裝的方法:
var Post = {
Url: function () {
return "webAPI路徑";
},
///返回帶分頁(yè)信息
//[ele]填充信息元素ID
///[ele2]填充分頁(yè)元素ID
//[tagName]信息元素一級(jí)元素名
///[tag2Name]信息元素二級(jí)元素名
//[index]頁(yè)碼
Pager: function (ele, ele2, tagName, tag2Name, index, where) {
//頁(yè)大小
var size = $.cookie('pageSize') == undefined ? 10 : $.cookie('pageSize');
//封裝的Ajax
Load(Post.Url(), {參數(shù)列表}, function (data) {<br data-filtered="filtered"> //展示數(shù)據(jù)
$(ele).html(createHtml(data.rows, tagName, tag2Name));
//設(shè)置分頁(yè)信息
$(ele2).attr('index', index).attr('rowcount', size).attr('total', data.total);
//填充分頁(yè)
PagerTool(ele, ele2, Post, tagName, tag2Name, where);
});
}
}Load、createHtml和PagerTool是我自己封裝的幾個(gè)方法,代碼如下:
///公共加載方法
//[turl]訪問(wèn)地址
///[postData]提交數(shù)據(jù)(標(biāo)準(zhǔn)post格式)
//[callback]回調(diào)函數(shù)(可匿名)
function Load(turl, postData, callback) {
jQuery.support.cors = true;
try {
$.ajax({
url: turl,
timeout: 10000,
type: "post",
data: postData,
success: function (data) {
if (data != null) {
Json = eval("(" + data + ")");
callback(Json);
}
}
});
} catch (e) {
Mbox.Show(e.message);
}
}
///創(chuàng)建Html結(jié)構(gòu)
//[data]數(shù)據(jù)源
///[tagName]一級(jí)元素標(biāo)簽名稱(chēng)
//[tag2Name]二級(jí)元素標(biāo)簽名稱(chēng)
function createHtml(data, tagName, tag2Name) {
var Html = '';
for (var i = 0; i < data.length; i++) {
Html += `<${tagName}>`;
$.each(data[i], function (i, v) {
Html += `<${tag2Name}>${v}</${tag2Name}>`;
});
Html += `</${tagName}>`;
}
return Html;
}PagerTool方法:
//公共分頁(yè)工具條
///[dataEle]數(shù)據(jù)主體
//[ele]分頁(yè)主體
///[obj]被傳入的類(lèi)
//[where]條件
///[w]按照何種方式搜索
function PagerTool(dataEle, ele, obj, tag1, tag2, where) {
var total = $(ele).attr('total') - 0;
var rowcount = $(ele).attr('rowcount') - 0;
var index = $(ele).attr('index') - 0;
var count = total % rowcount == 0 ? total / rowcount : Math.floor(total / rowcount) + 1;
var Html = '';
Html += '<p class="page">';
Html += '<a href="javaScript:void(0)" class="prePage">上一頁(yè)</a>';
for (var i = 1; i <= count; i++) {
if (index != i) {
Html += `<a href="javaScript:void(0)" class="nowPage">${i}</a>`;
} else {
Html += `<a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">${i}</a>`;
}
}
Html += '<a href="javaScript:void(0)" class="nextPage">下一頁(yè)</a>';
Html += '</p>';
$(ele).html('').html(Html);
//上一頁(yè)
$(ele).find('a[class=prePage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
if (index > 1) {
$(this).parent().parent().attr('index', index - 1);
obj.Pager(dataEle, ele, tag1, tag2, index - 1, where);
}
});
//下一頁(yè)
$(ele).find('a[class=nextPage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
if (index < count) {
$(this).parent().parent().attr('index', index + 1);
obj.Pager(dataEle, ele, tag1, tag2, index + 1, where);
}
});
//當(dāng)前頁(yè)
$(ele).find('a[class=nowPage]').bind('click', function () {
var index = $(this).parent().parent().attr('index') - 0;
$(this).parent().parent().attr('index', $(this).text());
obj.Pager(dataEle, ele, tag1, tag2, $(this).text(), where);
});
}調(diào)用方式會(huì)是這樣的:
Post.Pager(testBox, pagerBox, 'ul', 'li', 1, `篩選數(shù)據(jù)的條件`);
使用了如上代碼,即可按照所返回的json數(shù)據(jù)的格式自動(dòng)映射到容器內(nèi)(按照傳入的tagName生成dom):

切換后效果:

分頁(yè)工具條,生成在頁(yè)面是這樣的:
<p class="page"><br data-filtered="filtered"> <a href="javaScript:void(0)" class="prePage">上一頁(yè)</a><br data-filtered="filtered"> <a href="javaScript:void(0)" class="nowPage" style="background:#ACDDEA; color:#226F83; border:#93D3E4 1px solid;">1</a><br data-filtered="filtered"> <a href="javaScript:void(0)" class="nowPage">2</a><br data-filtered="filtered"> <a href="javaScript:void(0)" class="nowPage">3</a><br data-filtered="filtered"> <a href="javaScript:void(0)" class="nextPage">下一頁(yè)</a><br data-filtered="filtered"></p>
到此這篇關(guān)于JS處理數(shù)據(jù)實(shí)現(xiàn)分頁(yè)功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js對(duì)象實(shí)現(xiàn)數(shù)據(jù)分頁(yè)效果
- 原生JS實(shí)現(xiàn)酷炫分頁(yè)效果
- 原生JS實(shí)現(xiàn)分頁(yè)點(diǎn)擊控件
- JS實(shí)現(xiàn)前端分頁(yè)效果
- js實(shí)現(xiàn)簡(jiǎn)單的前端分頁(yè)效果
- javascript實(shí)現(xiàn)前端分頁(yè)功能
- 原生js實(shí)現(xiàn)分頁(yè)效果
- jQuery pager.js 插件動(dòng)態(tài)分頁(yè)功能實(shí)例分析
- vue.js 2.0實(shí)現(xiàn)簡(jiǎn)單分頁(yè)效果
相關(guān)文章
手機(jī)瀏覽器 后退按鈕強(qiáng)制刷新頁(yè)面方法總結(jié)
這篇文章主要介紹了手機(jī)瀏覽器 后退按鈕強(qiáng)制刷新頁(yè)面方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2016-10-10
JavaScript前端實(shí)現(xiàn)小說(shuō)分頁(yè)功能示例
這篇文章主要為大家介紹了JavaScript前端實(shí)現(xiàn)小說(shuō)分頁(yè)功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
微信小程序 在Chrome瀏覽器上運(yùn)行以及WebStorm的使用
這篇文章主要介紹了微信小程序 在Chrome瀏覽器上運(yùn)行以及WebStorm的使用的相關(guān)資料,需要的朋友可以參考下2016-09-09
JavaScript?定時(shí)器關(guān)鍵點(diǎn)及使用場(chǎng)景解析
這篇文章主要為大家介紹了JavaScript?定時(shí)器關(guān)鍵點(diǎn)及使用場(chǎng)景解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

