案例(一) : 实现表格的多序排列

表格多序排列
案例效果图


// --> 想要操作谁,就先获取谁
var oTab = document.getElementById("tab");
//table下的特殊属性
var tHead = oTab.tHead;
var oThs = tHead.rows[0].cells; //rows 所有行,cells 所有列
var tBody = oTab.tBodies[0]; //tbody会有多个
var oRows = tBody.rows;

var data = null;


// --> 1) 首先获取后台(table.txt)中的数据"JSON"格式字符串 -->AJAX
// async javascript and xml
// 1) 创建一个AJAX对象
var xhr = new XMLHttpRequest;

// 2) 打开我们需要请求数据的那个文件地址
xhr.open("get", "./table.txt",true); //true --> 异步请求

// 3) 监听请求状态
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
        var val = xhr.responseText;
        console.log(val);
        data = utils.jsonParse(val);
                                          bind();
                                          changeBg();
    } 
};

// 4)发送请求
xhr.send(null);


// --> 2) 实现我们的数据绑定 动态创建 字符串拼接 文档碎片
function bind(){
    var frg = document.createDocumentFragment();
    for (var i = 0;i < data.length;i++ ) {
        var cur = data[i];
        var oTr = document.createElement("tr");//每一次循环创建一个tr
        //每一个tr中还需要创建4个tr,因为每一个对象中有四组键值对
        for (var key in cur) {
            var oTd = document.createElement("td");
            if (key === "sex") {
                oTd.innerHTML = cur[key] === 0 ? "男" : "女";
            } else {
                oTd.innerHTML = cur[key];
            }
            oTr.appendChild(oTd);
        }
        frg.appendChild(oTr);
    }
    tBody.appendChild(frg);
    frg = null;
}


// --> 3)实现隔行变色
function changeBg() {
    for (var i = 0;i <oRows.length;i++) {
        oRows[i].className = i % 2 === 1 ? "bg" : null;
    }
}



// --> 4)编写表格升降序排序方法:实现按照年龄这一行排列
function sort(n) { //n --> 当前点击这一列的索引
    // this --> oThis[i]
    var _this = this;
    // --> 把存储所有行的类数组转化为数组
    var ary = utils.listToArray(oRows);
    // --> 给数组进行排序:按照每一行的第二列中的内容由小到大进行排序
    // 点击当前列,需要让其他的列的flag存储的值回归到初始值-1,这样在
    // 返回头点击其他的列,才是按照升序排列的
    for (var k = 0;k < oThs.length;k++) {
        if (oThs[k] !== this) {
            oThs[k].flag = -1;
        }
    }
    _this.flag *= -1;// 第一次是1,升序;第二次是-1,降序
    ary.sort(function (a,b) {
                                        console.log(a);
                                        console.log(n);
        var curInn = a.cells[n].innerHTML;
        var nexInn = b.cells[n].innerHTML;
        var curInnNum = parseFloat(curInn);
        var nexInnNum = parseFloat(nexInn);

        // this --> window
        if (isNaN(curInnNum) || isNaN(nexInnNum)) {
            //中文汉字
            return (curInn.localCompare(nexInn)) * _this.flag;
        } 
        return (curInnNum - nexInnNum) * _this.flag;
    });
    //按照ary中的最新顺序,把每一行重新的添加到tBody中去
    var frg = document.createDocumentFragment();
    for (var i = 0;i < ary.length;i++) {
        frg.appendChild(ary[i]);
    }
    tBody.appendChild(frg);
    frg = null;
    //按照最新的顺序重新进行隔行变色
    changeBg();
};


/*
// --> 5) 点击第二列进行排序
oThs[1].flag = -1;//给当前点击这一列,增加一个自定义属性flag,存储的值是1
oThs[1].onclick = function () {
    // this --> oThs[1] 当前元素
    //sort(); // this --> window
    //sort.call(oThs[1]);
    sort.call(this);
};
*/

// --> 5) 所有具有class = "cursor" 这个样式的列都可以进行排序
for (var i = 0;i < oThs.length;i++) {
                     oThs[i].index = i; // --> 用来存储索引的
                     oThs[i].flag = -1; // --> 用来标识升降序
                     var curTh = oThs[i];
    if (curTh.className === "cursor") {
                                        curTh.onclick = function () {
                                                // --> this --> oThs[i]console.log("curTh.index -->" + oThs[i].index);
                                                console.log(curTh);
                                                sort.call(this,this.index);
                                        };

    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值