JavaScript實現table排序
阿新 • • 發佈:2019-02-15
- 前段時間一道筆試題,假設有一個記錄成績單的table,是讓我們說說如何實現點選一個位置,然後對table按照其中成績按順序排列,再點選一次就可以按倒序排列。當時剛接觸DOM不懂,現在剛剛接觸了一點,就自己試著實現一下,心裡也是知道必然會有很多問題,而且方法可能會很蠢。
我的方法
- 先獲取table物件,再使用rows陣列獲取table[0]的每一行資訊
- 建立陣列score,獲取每一行的td的內容,本例其中td有三個,分別記錄了when,where和score
- 根據td中的score對陣列進行排序
- 建立一個二維陣列text儲存score中每一個td的innerHTML
用陣列text來修改table中的內容,根據標記ifg判斷是正序還是倒序
注意:第四步本來是沒有的,最初的想法是將排好序的score直接賦值給table,用來修改其內容,然後,果然就踩坑了;因為開始我按照以前的經驗,這樣是沒有問題的,但是,每次我的排序都會有問題,除錯發現,一旦修改了table中的某一行的內容,那麼score陣列中的某些資料也會發生改變!也就是說,score陣列 是和table有關聯的,修改table會影響到score,同時修改score也會改變table,果然是很蠢的方法,但是現階段我所學只能讓我這樣做,不得已添加了一個數組來儲存score中各個元素的innerHTML,也就是實際用來更新table的資料,這個是不會隨著table改變而改變的。
- HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Cities</title>
<link rel="stylesheet" type="text/css" media="screen" href="styles/format.css" />
<script type="text/javascript" src="scripts/addLoadEvent.js"></script>
<script type="text/javascript" src="scripts/clickScore.js"></script>
</head>
<body>
<table>
<caption>Itinerary</caption>
<thead>
<tr>
<th>When</th>
<th>Where</th>
<th id="scores">Scores</th>
</tr>
</thead>
<tbody>
<tr>
<td>June 9th</td>
<td>Portland,
<abbr title="Oregon">OR</abbr>
</td>
<td>87</td>
</tr>
<tr>
<td>June 10th</td>
<td>Nanchang ,
<abbr title="Jiangxi">NC</abbr>
</td>
<td>80</td>
</tr>
<tr>
<td>June 12th</td>
<td>Sacramento,
<abbr title="California">CA</abbr>
</td>
<td>71</td>
</tr>
<tr>
<td>June 30th</td>
<td>Seattle,
<abbr title="Washington">WA</abbr>
</td>
<td>84</td>
</tr>
<tr>
<td>June 30th</td>
<td>Beijing,
<abbr title="Beijing">BJ</abbr>
</td>
<td>90</td>
</tr>
<tr>
<td>June 12th</td>
<td>Nanjing,
<abbr title="Jiangshu">NJ</abbr>
</td>
<td>80</td>
</tr>
<tr>
<td>June 10th</td>
<td>Shanghai,
<abbr title="Huadong">SH</abbr>
</td>
<td>78</td>
</tr>
</tbody>
</table>
</body>
</html>
- clickScore函式
function clickScore() {
// body...
if (!document.getElementById("scores")) return false;
var scores = document.getElementById("scores");
scores.onmouseover = function() {
this.style.backgroundColor = "#2aa8c6";
this.style.cursor = "pointer";
};
scores.onmouseout = function() {
this.style.backgroundColor = "#99cccc";
};
var ifg = true;
scores.onmouseup = function() {
var tables = document.getElementsByTagName("table");
var rows = tables[0].getElementsByTagName("tr");
var score = [];
for (var i = 1; i < rows.length; i++) {
score[i] = rows[i].getElementsByTagName("td");
}
for (i = 2; i < score.length; i++) {
var temp = score[i][2].innerHTML;
var temps = score[i];
for (var j = i - 1; j >= 1; j--) {
var now = score[j][2].innerHTML;
if (temp < now) {
score[j + 1] = score[j];
} else {
break;
}
}
score[j + 1] = temps;
}
var text = [];
for (i = 1; i < rows.length; i++) {
text[i] = [];
}
for (i = 1; i < rows.length; i++) {
for (j = 0; j < score[i].length; j++) {
text[i][j] = score[i][j].innerHTML;
}
}
if (ifg) {
for (i = 1; i < rows.length; i++) {
for (j = 0; j < score[i].length; j++) {
rows[i].cells[j].innerHTML = text[i][j];
}
}
} else {
for (i = 1; i < rows.length; i++) {
for (j = 0; j < score[i].length; j++) {
rows[i].cells[j].innerHTML = text[rows.length - i][j];
}
}
}
ifg = !ifg;
};
}
addLoadEvent(clickScore);
附上一個很好的方法
- 注意sort()的功能
appendChild有一個屬性:
如果被插入的節點已經存在於當前文件的文件樹中,則那個節點會首先從原先的位置移除,然後再插入到新的位置.
如果你需要保留這個子節點在原先位置的顯示,則你需要先用Node.cloneNode方法複製出一個節點的副本,然後在插入到新位置.這個屬性存在所以可以使用oTbody.appenChild更新table
<script>
window.onload = function() {
var oTable = document.getElementById('tableTest');
var oTbody = oTable.tBodies[0];
var oBtn = document.getElementById('sort');
var arr = []; //用來存放每一個tr
var isAsc = true; //用來判斷升序,還是降序
oBtn.onclick = function() {
for (var i = 0; i < oTbody.rows.length; i++) {
arr[i] = oTbody.rows[i]; //這裡是把每一個tr存放到一個數組,而不是排序的依據(這裡是cells[0].innerHTML)
}
//陣列根據cells[0].innerHTML來排序
arr.sort(function(td1, td2) {
if (isAsc) {
return parseInt(td1.cells[0].innerHTML) - parseInt(td2.cells[0].innerHTML);
} else {
return parseInt(td2.cells[0].innerHTML) - parseInt(td1.cells[0].innerHTML);
}
});
//把排序後的tr 重新插入tbody
for (var j = 0; j < arr.length; j++) {
oTbody.appendChild(arr[j]);
}
//判斷升序,降序
isAsc = !isAsc;
}
}
</script>