JS闯关之路每天写1000字@IT·互联网

表格排序(小综合的例子)

2017-05-05  本文已影响39人  icessun

表格排序

通过ajax来动态获取数据,结合前面学的数字和汉字的排序,动态绑定数据到页面,隔行换色,实现一个小例子。

Html与css代码

<style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            table{
                width: 700px;
                margin: 100px auto;
                text-align: center;
                border-radius: 10px;
                padding: 10px;font-size: 20px;
                /*产生阴影*/
                box-shadow: 0 0 10px darkgreen;
            }
            table caption{
                margin-bottom: 10px;
                font-size: 30px;
                font-weight: 700;
                line-height: 50px;
            }
            table thead{
                background: #7CFC00;
                height: 40px;
                line-height: 40px;
                
            }
            table thead tr{
                /*不能被选择中*/
                -webkit-user-select: none;
            }
            table thead tr th.cursor{
                cursor: pointer;
            }
            table tbody tr{
                height: 40px;
                line-height: 40px;
            }
            table tbody tr.bg0{
                background: lightblue;
            }
            table tbody tr.bg1{
                background: lightcoral;
            }
        </style>



<table cellspacing="1" cellpadding="0" id="tab">
            <!--表格标题-->
            <caption>icessun的武林世界</caption>
            
            <!--头部 -->
            <thead>
    <!--tr表示一行,td表示一个单元格cell-->
                <tr>
                    <th class="cursor">name</th>
                    <th class="cursor">age</th>
                    <th class="cursor">level</th>
                    <th>sex</th>
                </tr>
            </thead>
            <!--tbody部分-->
            <tbody>
                
                <!--我们绑定数据到页面就是这个格式-->
                
                
                <!--<tr>
                    <td>郭靖</td>
                    <td>18</td>
                    <td>87</td>
                    <td>0</td>
                </tr>
                <tr>
                    <td>黄蓉</td>
                    <td>18</td>
                    <td>90</td>
                    <td>1</td>
                </tr>-->
            </tbody>
            
        </table>

使用的数据源

data.txt

[{"name":"郭靖","age":18,"level":98,"sex":0},{"name":"黄蓉","age":16,"level":88,"sex":1},{"name":"杨康","age":17,"level":78,"sex":0},{"name":"梅超风","age":40,"level":90,"sex":1},{"name":"洪七公","age":60,"level":100,"sex":0},{"name":"穆念慈","age":20,"level":50,"sex":1}]

js代码

//获取元素

var oTab=document.getElementById('tab');
//获取表格中的表头thead 表头是唯一的
var tHead=oTab.tHead;
//一个表格里面有n个tbody表体,是一个集合;但是我们需要的是第一个【0】tbody
var tBody=oTab.tBodies[0];
//表头中的第一行所有的列  aCells里面包含列里面的内容innerHTML
var aCells=tHead.rows[0].cells;
//表体中所有的行
var aRows=tBody.rows;


//获取数据 封装在一个函数里面
var data=null;
getData();
function getData(){
//创建一个对象是为了获取对象身上的属性和方法  实例创建对象
     var xml=new XMLHttpRequest();
    //默认是异步 不写 
    xml.open("GET","data.txt");
    //发送请求
     xml.send(null);
     //响应请求
     xml.onreadystatechange=function(){
     if(xml.readyState==4&&/^2\d{2}$/.test(xml.status)){
     //处理响应数据 转成一个json格式的字符串
        data=utils.jsonParse(xml.responseText);
        console.log(data);//data获取的是一个json格式的数据对象
        //绑定数据的函数调用,可以拿到data数据
        bind();
            }
      }
}

// 绑定数据 

function bind(){
//字符串拼接的方法
var str='';
for(var i=0;i<data.length;i++){
//使用0代表男,1代表女,但是展现在页面要显示为汉字男女
data[i].sex=data[i].sex==0?'男':'女';

str+='<tr><td>'+data[i].name+'</td><td>'+data[i].age+'</td><td>'+data[i].level+'</td><td>'+data[i].sex+'</td></tr>'
}

//循环完了,把字符串插入到页面里面,字符串插入到页面使用innerHTML

tBody.innerHTML=str;


}


// 动态创建元素加上文档碎片的方法
function bind(){
//创建文档碎片
     var frg=document.creatDocumentFragment();
     for(var i=0;i<data.length;i++){
         //动态创建元素 tr 个数是根据data的长度
         var tr=document.creatElement('tr');
         //td的个数,是根据data[i]对象里面键值对的个数,for in 循环遍历data[i]对象
         for(var attr in data[i]){
               var td=document.creatElement('td');
               if(attr=='sex'){
                     data[i][attr]=data[i][attr]==0?'男':'女';

               }

              td.innerHTML=data[i][attr];
              tr.appendChild(td);
          }
         frg.appendChild(tr);
   
     }
     tBody.appendChild(frg);
     frg=null;
     //这个时候动态创建了元素插入到了页面,会出现颜色的错误,所以要重新调用一下,隔行换色的函数
     changeColor();
}

//隔行换色
function changeColor(){
        for(var i=0;i<aRows.length;i++){
          aRows[i].className='bg'+i%2;
       }
}

// 表格排序
function sort(n){

// 需求:当我们点击一行的时候,然后点击了其他的地方,回来还是点击原先第一次的地方,与我们上次点击是一样的
for(var i=0;i<aCells.length;i++){

//当前的被点击的那个frg乘以-1 ,其他的变成-1
   aCells[i].frg=i==n?aCells[i].frg*-1:-1;
 
}



//排序三部曲  类数组转数组  数组的sort排序  排好序的数据重新插入到页面

// 类数组转数组
var ary=utils.markArray(aRows);

// 数组的sort排序
ary.sort(function(a,b){
    a=a.cells[n].innerHTML;//'18'
    b=b.cells[n].innerHTML;//'19'
     //汉字的比较
     if(isNaN(a)||isNaN(b)){
          return a.localeCompare(b)*aCells[i].frg;
     }
    return (a-b)*aCells[i].frg;

});

// 排好序的数据重新插入到页面 ary中已经是排好序的数据了

var frg=document.creatDocumentFragment();

for(var i=0;i<ary.length;i++){
   frg.appendChild(ary[i]);
}
tBody.appendChild(frg);
frg=null;
changeColor();


}

// 点击表头的事件

for(var i=0;i<aCells.length;i++){
    if(aCells[i].className=='cursor'){
    //初始化的时候设置frg属性值为 -1  点击的时候frg变成1 -1 1 -1  frg开关  每一个aCells各有一个frg不冲突
  
      aCells[i].frg=-1;
      aCells[i].index=i;
      aCells[i].onclick=function(){
          sort(this.index);
      }
   }
}
上一篇 下一篇

猜你喜欢

热点阅读