zoukankan      html  css  js  c++  java
  • 用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>




  • 相关阅读:
    寄存器详解
    Sleep(0)的妙用
    源码分析之Dictionary笔记
    ASP.NET Core框架的本质
    Dictionary实现(收藏的)
    微软的判断一个数是不是质数的算法
    C#性能优化:延迟初始化Lazy
    C#3 分部方法,简单标记一下
    单例下并发的情况下访问私有变量的一个典型问题
    BeforeFieldInit的小叙
  • 原文地址:https://www.cnblogs.com/jiechen/p/5559057.html
Copyright © 2011-2022 走看看