用js操作表格

实现思路:

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>




原文地址:https://www.cnblogs.com/jiechen/p/5559057.html