本篇延續<第9車廂-使用content:attr()實現tableRWD應用>的版,透過程式自動產生假title
<th>
,並製作簡單的分頁功能
首先先複習一下昨篇提到的,透過<td>
先事先打上data-th="我是th名稱"
<td data-th="信用卡公司">兆豐銀行</td>
<td data-th="回饋 / 名額">$300 產品(限量8萬名)<br>最高5千抽獎</td>
<td data-th="五倍券優惠活動">期限綁定台灣Pay/信用卡,可享一次抽獎,最高獎金5千元(110/12/31前)</td>
....等
,之後再透過::before {content: attr(data-th);....}
讓文字顯現出來
td::before {
color: #01977a;
text-indent: -1rem;
content: attr(data-th);
font-weight: bold;
display: block;
}
但是因為
1.欄位很多時,就要手動一個一個key data-th="XXX"嗎?這樣不是很麻煩嗎?
2.範例資料是死的,真正工作上的資料是抓api後回傳的,所以我們也無法先都手動key好
所以我們今天就改寫成
HTML
/*html*/
<table id="" class="table_change">
<thead>
<tr>
<th>信用卡公司</th>
<th>回饋 / 名額</th>
<th>五倍券優惠活動</th>
</tr>
</thead>
<tbody>
<tr>
<td>兆豐銀行</td>
<td>$300 產品(限量8萬名)<br>最高5千抽獎</td>
<td>期限綁定台灣Pay/信用卡,可享一次抽獎,最高獎金5千元(110/12/31前)</td>
</tr>
<tr>
...
</tr>
</tbody>
</table>
jq
$(function () {
let $table = $(".table_change"); //抓table class
let $thRows = $table.find("thead th"); //找到每個th
$thRows.each(function (key, thRow) { //key是0開始
$table
.find("tbody tr td:nth-child(" + (key + 1) + ")") //選擇器第一個元素是1開始
.attr("data-th", $(thRow).text());// 將每個td塞入data-th="對應的<th>名稱"
});
/*-----------*/
});
這樣就還是完成啦!
那有時候總會碰到多筆資料的時候吧?
我們可以做一個簡單的分頁,像這樣
而除了可以按"上一頁""下一頁"外,也能讓使用者輸入跳入該頁,
HTML
<div id="pageModule">
</div>
<div id="numberPageModule">
<label for="numberPage">跳至第</label>
<input id="numberPage" type="number" value="1" min="1" max="100">頁
</div>
<table id="" class="table_change">
<thead>
<tr>
<th>信用卡公司</th>
<th>回饋 / 名額</th>
<th>五倍券優惠活動</th>
</tr>
</thead>
<tbody>
<tr>
<td>兆豐銀行</td>
<td>$300 產品(限量8萬名)<br>最高5千抽獎</td>
<td>期限綁定台灣Pay/信用卡,可享一次抽獎,最高獎金5千元(110/12/31前)</td>
</tr>
//等多筆資料<tr>....</tr>
</tbody>
</table>
jq
goPage(參數1,參數2)
為我們換頁的function,參數第一個
放的是目前頁數
,第二個
放一頁要秀幾筆
$(function () {
/*----產生data-th-----*/
let $table = $(".table_change");
let $thRows = $table.find("thead th");
$thRows.each(function (key, thRow) {
$table
.find("tbody tr td:nth-child(" + (key + 1) + ")")
.attr("data-th", $(thRow).text());
});
/*-----------*/
goPage(1, 2); // 一開始先秀第一頁,以及每一頁最多兩筆資料
});
再來
我們假設每一頁只能有兩筆資料顯示
function goPage(currentPage, pageSize) {
var tr = $(".table_change tbody tr");
var num = $(".table_change tbody tr").length; //表格所有行數
var totalPage = Math.ceil(num / pageSize ); // 表格所有行數/每頁顯示行數 = 總頁數
$('#numberPage').attr('max',totalPage); // 寫入跳至第幾頁input
$("#numberPage").off('change').on("change",function(){ // 當"跳至第幾頁"改變時....
let numberPage = $("#numberPage").val();//使用者輸入要跳頁的值
if( numberPage > totalPage ){ //如果輸入超過總頁數,就跳出行為
console.log("頁數超過")
return
}
goPage(numberPage, 2);//如果是正常的值,就執行換頁,一樣每頁顯示兩筆
});
var startRow = (currentPage - 1) * pageSize + 1; //開始顯示的行
var endRow = currentPage * pageSize; //結束顯示的行
endRow = (endRow > num) ? num : endRow;
//遍歷顯示資料實現分頁
for (var i = 1; i < (num + 1); i++) {
var trRow = tr[i - 1];
if (i >= startRow && i <= endRow) {
trRow.style.display = "";
} else {
trRow.style.display = "none";
}
}
//寫入於<div id="pageModule">中
var tempStr = "";
//如果目前頁數大於1,則可以按首頁跟上一頁
if (currentPage > 1) {
tempStr += `<a href="javascript:;" onClick="goPage(1,${pageSize})">首頁</a>`;
tempStr += `<a href="javascript:;" onClick="goPage(${currentPage - 1},${pageSize})">上一頁</a>`;
} else {
tempStr += `<a href="javascript:;" class="disabled">首頁</a>`;
tempStr += `<a href="javascript:;" class="disabled">上一頁</a>`;
}
//放入頁碼 EX:1/5
tempStr += `<div><span>第${currentPage}頁</span>/<span>共${totalPage}頁</span></div>`;
//如果目前頁數小於總頁數,則無法按下一頁及尾頁
if (currentPage < totalPage) {
tempStr += `<a href="javascript:;" onClick="goPage(${currentPage + 1},${pageSize})">下一頁</a>`;
tempStr += `<a href="javascript:;" onClick="goPage(${totalPage},${pageSize})">尾頁</a>`;
} else {
tempStr += `<a href="javascript:;" class="disabled">下一頁</a>`;
tempStr += `<a href="javascript:;" class="disabled">尾頁</a>`;
}
$("#pageModule").html(tempStr);
}
附上完整程式碼
透過這對新手相較易懂的範例後,之後就能再加強挑戰除了"上一頁""下一頁"外,能有頁碼出現的那種,或者可以選擇每一頁的顯示筆數拉!
本篇參考資料:
https://codepen.io/yidas/pen/eEaKRO