实现思路:
1.通过表单,可以添加数据到表格中显示
2.id自动根据已有的最大id值进行累加,删除一条记录的时候,最大id值不会变化(id的值不是根据表格中编号的最大值去计算)
3.隔行变色,新增加的行应该也需要隔行变色的
4.鼠标移入高亮
5.全选/全不选(checkAll和下面的每一个checkbox是有关联的)
6.选中变色
7.上移/下移
8.删除
9.排序
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Title</title>
6 <style>
7 form {
8 margin: 10px 0;
9 }
10 td {
11 text-align: center;
12 }
13
14 .c1 {
15 background: #CCCCCC;
16 }
17 .c2 {
18 background: white;
19 }
20 .c3 {
21 background: #ff9900;
22 }
23 .c4 {
24 background: #186318;
25 color: white;
26 }
27 </style>
28 <script>
29
30 var data = [
31 {
32 id: 1,
33 name : '欢欢',
34 sex : '女',
35 age : 22
36 },
37 {
38 id: 2,
39 name : '小明',
40 sex : '男',
41 age : 28
42 },
43 {
44 id: 3,
45 name : '芊芊',
46 sex : '女',
47 age : 18
48 }
49 ];
50
51 var maxId = 3;
52
53 window.onload = function() {
54 var tab = document.getElementById('tab1');
55 var tbody = tab.tBodies[0];
56
57 //获取表单元素
58 var form1 = document.getElementById('form1');
59 var form2 = document.getElementById('form2');
60
61 var checkAll = document.getElementById('checkAll');
62
63 //初始化数据的添加
64 //addData(data[0]);
65 for ( var i=0; i<data.length; i++ ) {
66 addData(data[i]);
67 }
68 //初始化隔行变色
69 changeColor();
70
71 //通过表单添加数据
72 form1.btn.onclick = function() {
73
74 if ( form1.username.value == '' || form1.age.value == '' || form1.sex.value == '' ) {
75 alert('请输入完整的数据');
76 } else {
77
78 //添加数据到表格中
79 maxId++;
80 addData({
81 id: maxId,
82 name : form1.username.value,
83 sex : form1.sex.value,
84 age : form1.age.value
85 });
86 //每次添加新数据的时候,重新调用隔行变色
87 changeColor();
88
89 //因为新增数据是一定未选中的,那么全选也应该是未选中的
90 checkAll.checked = false;
91
92 }
93
94 }
95
96 //点击checkAll,全选和全不选
97 checkAll.onclick = function() {
98 var checkBoxes = tbody.getElementsByTagName('input');
99 var trs = tbody.rows;
100
101 for ( var i=0; i<checkBoxes.length; i++ ) {
102
103 checkBoxes[i].checked = this.checked;
104
105 if (this.checked) {
106 //全选
107 trs[i].className = 'c4';
108 } else {
109 //全不选
110 trs[i].className = trs[i].oldColor;
111 }
112
113 }
114 }
115
116 //排序
117 form2.orderButton.onclick = function() {
118 if ( form2.orderName.value == '' || form2.orderBy.value == '' ) {
119 alert('请选择排序方式和排序字段')
120 } else {
121 order( form2.orderName.value, form2.orderBy.value );
122 }
123 }
124
125 /*
126 * 把单条数据添加到表格中
127 * @params object data 要添加到表格中的单条数据
128 * @return
129 * */
130 function addData(data) {
131
132 //每一条数据需要创建一个tr,6个td,每个td里面放置对应的内容
133
134 var tr = document.createElement('tr');
135
136 //checkbox
137 var td0 = document.createElement('td');
138
139 //因为checkbox需要绑定事件,我们这里使用createElement的方式来创建checkbox
140 var checkbox = document.createElement('input');
141 checkbox.type = 'checkbox';
142
143 //给checkbox添加onclick选择
144 checkbox.onclick = function() {
145 //根据当前的checkbox是否选中,去处理当前这一行的背景色
146 if (this.checked) {
147 //如果当前是选中的,把当前行class设置成c4
148 tr.className = 'c4';
149 } else {
150 //如果当前不是选中的
151 tr.className = 'c3';
152 }
153
154 //处理全选
155 var checkBoxes = tbody.getElementsByTagName('input');
156 //循环查看tbody里面的所有checkbox元素,只要有一个是没选中的,那么就非全选,否则就是全选
157 for ( var i=0; i<checkBoxes.length; i++ ) {
158 if ( !checkBoxes[i].checked ) {
159 checkAll.checked = false;
160 return;
161 }
162 }
163
164 //如果代码能走到这里来,就说明上面的循环过程中,所有的checkbox都是选中的
165 checkAll.checked = true;
166 }
167
168 td0.appendChild(checkbox);
169
170 tr.appendChild(td0);
171
172 //编号
173 var td1 = document.createElement('td');
174 td1.innerHTML = data.id;
175 tr.appendChild(td1);
176
177 //姓名
178 var td2 = document.createElement('td');
179 td2.innerHTML = data.name;
180 tr.appendChild(td2);
181
182 //性别
183 var td3 = document.createElement('td');
184 td3.innerHTML = data.sex;
185 tr.appendChild(td3);
186
187 //年龄
188 var td4 = document.createElement('td');
189 td4.innerHTML = data.age;
190 tr.appendChild(td4);
191
192 //操作
193 var td5 = document.createElement('td');
194
195 var btn0 = document.createElement('button');
196 btn0.innerHTML = '上移';
197 //上移
198 btn0.onclick = function() {
199 //把当前行的tr添加到tr的上一个兄弟节点的前面
200 if ( tr.previousElementSibling ) {
201 tbody.insertBefore( tr, tr.previousElementSibling );
202 changeColor();
203 }
204 }
205 td5.appendChild(btn0);
206
207 var btn1 = document.createElement('button');
208 btn1.innerHTML = '下移';
209 //下移
210 btn1.onclick = function() {
211 //把当前行的tr添加到tr的下一个兄弟节点的后面
212 if ( tr.nextElementSibling ) {
213 tbody.insertBefore( tr.nextElementSibling, tr );
214 changeColor();
215 }
216 }
217 td5.appendChild(btn1);
218
219 var btn2 = document.createElement('button');
220 btn2.innerHTML = '删除';
221 //删除
222 btn2.onclick = function() {
223 tbody.removeChild(tr);
224 changeColor();
225
226 //处理全选
227 var checkBoxes = tbody.getElementsByTagName('input');
228 if (checkBoxes.length) {
229 //循环查看tbody里面的所有checkbox元素,只要有一个是没选中的,那么就非全选,否则就是全选
230 for ( var i=0; i<checkBoxes.length; i++ ) {
231 if ( !checkBoxes[i].checked ) {
232 checkAll.checked = false;
233 return;
234 }
235 }
236
237 //如果代码能走到这里来,就说明上面的循环过程中,所有的checkbox都是选中的
238 checkAll.checked = true;
239 }
240
241 }
242 td5.appendChild(btn2);
243
244 tr.appendChild(td5);
245
246 //给每一行添加鼠标移入移出的事件处理函数
247 //鼠标移入
248 tr.onmouseover = function() {
249 //鼠标移入的时候也需要根据当前tr里面的checkbox的状态去设置tr的class
250 if (checkbox.checked) {
251 this.className = 'c4';
252 } else {
253 this.className = 'c3';
254 }
255 }
256 //鼠标移出
257 tr.onmouseout = function() {
258 //当鼠标离开tr的时候,需要根据当前tr里面的checkbox的状态去设置当前tr的class
259 if (checkbox.checked) {
260 //如果当前tr里面的checkbox是选中的,那么离开tr以后,这个tr的class应该还是c4
261 this.className = 'c4';
262 } else {
263 //如果当前tr里面的checkbox不是选中的,那么离开这个tr以后,应该回到当前tr最开始class
264 this.className = this.oldColor;
265 }
266 }
267
268 tbody.appendChild(tr);
269 }
270
271 /*
272 * 隔行变色
273 * @return
274 * */
275 function changeColor() {
276 for ( var i=0; i<tbody.rows.length; i++ ) {
277
278 var checkbox = tbody.rows[i].querySelector('input');
279
280 //如果当前行是选中的,那么就不需要重新设置隔行变色
281 if ( !checkbox.checked ) {
282 if ( i % 2 == 0 ) {
283 //偶数行
284 tbody.rows[i].className = 'c1';
285 tbody.rows[i].oldColor = 'c1';
286 } else {
287 //奇数行
288 tbody.rows[i].className = 'c2';
289 tbody.rows[i].oldColor = 'c2';
290 }
291 }
292
293 }
294 }
295
296 /*
297 * 排序
298 * */
299 function order(orderName, orderBy) {
300
301 var rows = [];
302
303 for ( var i=0; i<tbody.rows.length; i++ ) {
304 rows.push(tbody.rows[i]);
305 }
306
307 rows.sort(function(a, b) {
308
309 var v1;
310 var v2;
311
312 //需要根据orderName和orderBy来排序
313
314 if ( orderName == 'id' ) {
315 v1 = parseFloat(a.cells[1].innerHTML);
316 v2 = parseFloat(b.cells[1].innerHTML);
317 }
318
319 if ( orderName == 'age' ) {
320 v1 = parseFloat(a.cells[4].innerHTML);
321 v2 = parseFloat(b.cells[4].innerHTML);
322 }
323
324 //asc : 升序
325 //desc : 降序
326 if (orderBy == 'asc') {
327 return v1 - v2;
328 } else {
329 return v2 - v1;
330 }
331
332 });
333
334 //console.log(rows)
335 for (var i=0; i<rows.length; i++) {
336 tbody.appendChild(rows[i]);
337 }
338 changeColor();
339 }
340 }
341 </script>
342 </head>
343
344 <body>
345 <form id="form1">
346 <input type="text" name="username" />
347 <select name="sex">
348 <option value="">请选择一个性别</option>
349 <option value="男">男</option>
350 <option value="女">女</option>
351 </select>
352 <input type="text" name="age" />
353 <input type="button" name="btn" value="提交">
354 </form>
355 <!--选做-->
356 <p>
357 <form id="form2">
358 <select name="orderName">
359 <option value="">选择一个排序字段</option>
360 <option value="id">编号</option>
361 <option value="age">年龄</option>
362 </select>
363 <select name="orderBy">
364 <option value="">选择一个排序方式</option>
365 <option value="asc">升序</option>
366 <option value="desc">降序</option>
367 </select>
368 <input type="button" name="orderButton" value="排序">
369 </form>
370 </p>
371 <table border="1" width="100%" id="tab1">
372 <thead>
373 <tr>
374 <th>全选 <input type="checkbox" id="checkAll"></th>
375 <th>编号</th>
376 <th>姓名</th>
377 <th>性别</th>
378 <th>年龄</th>
379 <th>操作</th>
380 </tr>
381 </thead>
382 <tbody></tbody>
383 </table>
384 </body>
385 </html>