JS实现隔行换色的表格排序

作者:小柒_912 时间:2024-04-29 13:35:55 

1、获取元素    2、获取数据   3、绑定数据   4、隔行换色   5、表格排序


<table cellpadding="0" cellspacing="0" id="tab">
<thead>
<tr>
 <th class="cursor">姓名</th>
 <th class="cursor">年龄</th>
 <th class="cursor">分数</th>
 <th>性别</th>
</tr>
</thead>
<tbody>
<!--<tr class="bg0">
 <td>赵老大</td>
 <td>45</td>
 <td>89</td>
 <td>0</td>
</tr>
<tr class="bg1">
 <td>赵老大</td>
 <td>45</td>
 <td>89</td>
 <td>0</td>
</tr>-->
</tbody>
</table>
<script type="text/javascript" src="js/utils.js"></script>
<script type="text/javascript" src="js/biaoge.js"></script>

css 样式


*{
  margin:0;
  padding:0;
 }
 table{
  width: 800px;
  margin:50px auto;
  box-shadow: 0 0 10px #333;
  border-radius: 10px;
  overflow: hidden;
  font-size: 18px;
 }
 table thead tr{
  text-align: center;
  width: 100%;
  height: 50px;
  background:#ffb4b4;
 }
 table thead th{
  width: 200px;
  line-height: 50px;
  color: white;
 }
 table tbody tr{
  height: 40px;
  line-height: 40px;
  text-align: center;
 }
 table tbody tr.bg0{
  background: lightgoldenrodyellow;
 }
 table tbody tr.bg1{
  background: lightgray;
 }
 .cursor{
  cursor: pointer;
 }

JS

所用到的  util.js


var utils=(function(){
var flg='getComputedStyle' in window; // 惰性思想的运用;
function makeArray(arg){
 if(flg){ // 标准浏览器
  return Array.prototype.slice.call(arg);
 }else{
  var ary=[];
  for(var i=0; i<arg.length; i++){
   ary.push(arg[i]);
  }
  return ary;
 }
}
function jsonParse(jsonStr){
 return 'JSON' in window?JSON.parse(jsonStr):eval('('+jsonStr+')');
}
function rnd(n,m){
 n=Number(n);
 m=Number(m);
 if(isNaN(n) || isNaN(m)){
  return Math.random();//当返回0-1之间的随机小数,说明参数传错了;
 }
 if(n>m){
  var tmp=m;
  m=n;
  n=tmp;
 }
 return Math.round(Math.random()*(m-n)+n);
}
function getByClass(strClass,parent){
 parent=parent||document;
 if(flg){
  return this.makeArray(parent.getElementsByClassName(strClass));
 }
 //对IE浏览器兼容处理;
 var aryClass=strClass.replace(/(^ +)|( +$)/g,'').split(/\s+/g);
 var nodeList=parent.getElementsByTagName('*');
 var ary=[];
 for(var i=0; i<nodeList.length; i++){
  var cur=nodeList[i];
  var bOk=true;
  for(var j=0; j<aryClass.length; j++){
   var reg=new RegExp('(^| +)'+aryClass[j]+'( +|$)');
   if(!reg.test(cur.className)){
    bOk=false;
    break;
   }
  }
  if(bOk){
   ary.push(cur);
  }
 }
 return ary;
}
function hasClass(curEle,cName){
 var reg=new RegExp('(^| +)'+cName+'( +|$)','g');
 return reg.test(curEle.className);
}
function addClass(curEle,strClass){
 var aryClass=strClass.replace(/(^ +)|( +$)/g,'').split(/\s+/g);
 for(var i=0; i<aryClass.length; i++){
  if(!this.hasClass(curEle,aryClass[i])){
   curEle.className+=' '+aryClass[i];
  }
 }
}
function removeClass(curEle,strClass){
 var aryClass=strClass.replace(/(^ +)|( +$)/g,'').split(/\s+/g);
 for(var i=0; i<aryClass.length; i++){
  var reg=new RegExp('(^| +)'+aryClass[i]+'( +|$)','g');
  if(reg.test(curEle.className)){
   curEle.className=curEle.className.replace(reg,' ').replace(/(^ +)|( +$)/g,'').replace(/\s+/g,' ');
  }
 }
}
function getCss(curEle,attr){
 var val=null;
 var reg=null;
 if(flg){
  val=getComputedStyle(curEle,false)[attr];
 }else{
  if(attr==='opacity'){
   val=curEle.currentStyle['filter'];//‘alpha(opacity=10)';
   reg=/^alpha\(opacity[=:](\d+(\.\d+)?)\)$/;
   return reg.test(val)?RegExp.$1/100:1;
  }
  val=curEle.currentStyle[attr];
 }
 //如果带单位了,干掉单位;
 reg=/^([+-])?(\d+(\.\d+)?)(px|pt|rem|em)?$/gi;
 return reg.test(val)?parseFloat(val):val;
}
function setCss(curEle,attr,value){
 //升级3:处理float
 if(attr==='float'){
  curEle.style.cssFloat=value;
  curEle.style.styleFloat=value;
  return;
 }
 //升级2:处理透明度
 if(attr=='opacity'){
  curEle.style.opacity=value;
  curEle.style.filter='alpha(opacity='+(value*100)+')';
  return;
 }
 var reg=/(width|height|top|right|bottom|left|((margin|padding)(top|right|bottom|left)?))/gi;
 //升级1:处理单位;
 if(reg.test(attr)){
  if(value!=='auto' || value.toString().indexOf('%') == -1){
   value=parseFloat(value)+'px';
  }
 }
 curEle.style[attr]=value;
}
function setGroupCss(curEle,opt){
 if(Object.prototype.toString.call(opt) !== '[object Object]') return;
 for(var attr in opt){
  this.setCss(curEle,attr,opt[attr]);
 }

}
function css(curEle){
 var argTwo=arguments[1];
 if(typeof argTwo==='string'){
  var argThree=arguments[2];
  if(argThree===undefined){//第三个参数没有-获取
   return this.getCss(curEle,argTwo);
  }else{//当有第三个参数-设置一个样式
   this.setCss(curEle,argTwo,argThree);
  }
 }
 if({}.toString.call(argTwo)==='[object Object]'){
  this.setGroupCss(curEle,argTwo);
 }
}
function win(attr,value){
 if(value===undefined){
  return document.documentElement[attr]||document.body[attr];
 }
 document.documentElement[attr]=document.body[attr]=value;
}
function offset(curEle){
 var l=curEle.offsetLeft;
 var t=curEle.offsetTop;
 var par=curEle.offsetParent;
 while(par){
  if(window.navigator.userAgent.indexOf('MSIE 8') == -1){
   l+=par.clientLeft;
   t+=par.clientTop;
  }
  l+=par.offsetLeft;
  t+=par.offsetTop;
  par=par.offsetParent;
 }
 return {left:l,top:t}
}
function getChildren(curEle,tagName){
 var childs=curEle.childNodes;//获取所有的子节点
 var ary=[];
 for(var i=0; i<childs.length; i++){
  var cur=childs[i];
  if(cur.nodeType==1){//首先保证是子元素,再考虑是否过滤;
   if(tagName){
    if(cur.tagName.toLocaleLowerCase()===tagName.toLowerCase()){
     ary.push(cur);
    }
   }else{
    ary.push(cur)
   }
  }
 }
 return ary;
}
function prev(curEle){
 if(flg){
  return curEle.previousElementSibling;
 }
 var pre=curEle.previousSibling;
 while(pre && pre.nodeType !== 1){
  pre=pre.previousSibling;
 }
 return pre;
}
function next(curEle){
 if(flg){
  return curEle.nextElementSibling;
 }
 var nex=curEle.nextSibling;
 while(nex && nex.nodeType !== 1){
  nex=nex.nextSibling;
 }
 return nex;
}
function sibling(curEle){
 var ary=[];
 var pre=this.prev(curEle);
 var nex=this.next(curEle);
 if(pre) ary.push(pre);
 if(nex) ary.push(nex);
 return ary;
}
function prevAll(curEle){
 var ary=[];
 var pre=this.prev(curEle);
 while(pre){
  ary.push(pre);
  pre=this.prev(pre);
 }
 return ary;
}
function nextAll(curEle){
 var nex=this.next(curEle);
 var ary=[];
 while(nex){
  ary.push(nex);
  nex=this.next(nex);
 }
 return ary;
}
function siblings(curEle){
 var ary1=this.prevAll(curEle);
 var ary2=this.nextAll(curEle);
 return ary1.concat(ary2);
}
function firstChild(curEle){
 var children=this.getChildren(curEle);
 return children[0];
}
function lastChild(curEle){
 var children=this.getChildren(curEle);
 return children[children.length-1];
}
function index(curEle){
 return this.prevAll(curEle).length;
}
function appendChild(curEle,parent){
 parent.appendChild(curEle);
}
function prependChild(curEle,parent){
 var first=this.firstChild(parent);
 if(first){
  parent.insertBefore(curEle,first);
 }else{
  parent.appendChild(curEle);
 }
}
function insertBefore(curEle,oldEle){
 oldEle.parentNode.insertBefore(curEle,oldEle);
}
function insertAfter(curEle,oldEle){
 var nex=this.next(oldEle);
 if(nex){
  oldEle.parentNode.insertBefore(curEle,nex);
 }else{
  oldEle.parentNode.appendChild(curEle);
 }
}
return {
 //makeArray:类数组转数组
 makeArray:makeArray,
 //jsonParse:把JSON格式的字符串转成JSON格式的数据(对象)
 jsonParse:jsonParse,
 //rnd:求一定范围的随机数,包含最大值;
 rnd:rnd,
 //getByClass:通过class名,可以限制范围的获取元素
 getByClass:getByClass,
 //hasClass:判断元素身上是否有某个class名
 hasClass:hasClass,
 //addClass:给元素批量添加出class名
 addClass:addClass,
 //removeClass:从元素身上批量删除class名
 removeClass:removeClass,
 //getCss:获取非行间样式
 getCss:getCss,
 //setCss:给元素设置一个样式
 setCss:setCss,
 //setGroupCss:给元素设置一组样式
 setGroupCss:setGroupCss,
 //css:集获取,设置一个,设置一组为一体;
 css:css,
 //win:浏览器盒子模型的兼容处理
 win:win,
 //offset:元素偏移量的兼容处理;
 offset:offset,
 //getChildren:获取当前元素下的所有子元素(可以通过标签名过滤子元素)
 getChildren:getChildren,
 //prev:获取当前元素的上一个哥哥元素
 prev:prev,
 //next:获取当前元素的下一个弟弟元素
 next:next,
 //sibling:获取当前元素的相邻元素;
 sibling:sibling,
 //prevAll:获取当前元素所有的哥哥元素
 prevAll:prevAll,
 //nextAll:获取当前元素所有的弟弟元素
 nextAll:nextAll,
 //siblings:获取当前元素所有的兄弟元素;
 siblings:siblings,
 //firstChild:获取当前容器下第一个子元素
 firstChild:firstChild,
 //lastChild:获取当前容器下最后一个子元素
 lastChild:lastChild,
 //index:当前元素的索引(当前元素排行第几);
 index:index,
 //appendChild:把新元素插入到父容器的末尾;
 appendChild:appendChild,
 //prependChild:把新元素插入到父容器的开头;
 prependChild:prependChild,
 //insertBefore:把新元素插入到指定元素的前面
 insertBefore:insertBefore,
 //insertAfter:把新元素插入到指定元素的后面;
 insertAfter:insertAfter
}
})();

所用到的  biaoge.js


(function () {
var oTab = document.getElementById('tab');
var tHead = oTab.tHead;
var tCells = tHead.rows[0].cells;
var tBody = oTab.tBodies[0];
var aRows = tBody.rows;
var data = null;
getData();
function getData() {
 var xml = new XMLHttpRequest;
 xml.open('get', 'data.txt', false);
 xml.onreadystatechange = function () {
  if (xml.readyState === 4 && /^2\d{2}$/.test(xml.status)) {
   data = utils.jsonParse(xml.responseText);
  }
 };
 xml.send();
}
bind();
function bind() {
 var str = '';
 for (var i = 0; i < data.length; i++) {
  var curData = data[i];
  curData.sex = curData.sex == 0 ? '男' : '女';
  str += '<tr>\
     <td>' + curData.name + '</td>\
     <td>' + curData.age + '</td>\
     <td>' + curData.score + '</td>\
     <td>' + curData.sex + '</td>\
     </tr>';
 }
 tBody.innerHTML = str;
}
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 < tCells.length; i++) {
  tCells[i].flag = i == n ? tCells[i].flag * -1 : -1;
 }
 var ary = utils.makeArray(aRows);
 ary.sort(function (a, b) {
  a = a.cells[n].innerHTML;
  b = b.cells[n].innerHTML;
  if (isNaN(a) && isNaN(b)) {
   return a.localeCompare(b) * tCells[n].flag;
  }
  return (a - b) * tCells[n].flag;
 });
 var frg = document.createDocumentFragment();
 for (var i = 0; i < ary.length; i++) {
  frg.appendChild(ary[i]);
 }
 tBody.appendChild(frg);
 frg = null;
 changeColor();
}
for (var i = 0; i < tCells.length; i++) {
 if (tCells[i].className == 'cursor') {
  tCells[i].flag = -1;
   tCells[i].index = i;
  tCells[i].onclick = function () {
   sort(this.index);
  }
 }
}
})();

来源:http://www.qdfuns.com/notes/42231/0f55ec4137c30e212fbbb13f4f4116e4.html

标签:js,隔行,换色,表格,排序
0
投稿

猜你喜欢

  • Git 教程之标签详解

    2023-10-25 21:58:04
  • python中for语句简单遍历数据的方法

    2023-04-18 11:26:45
  • 通过不同的CSS设计字体大小来提高用户体验

    2008-12-10 19:17:00
  • Python算法中的时间复杂度问题

    2021-03-20 04:52:50
  • PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析

    2023-11-22 22:00:16
  • python selenium在打开的浏览器中动态调整User Agent

    2022-09-26 13:41:59
  • python读取与写入csv格式文件的示例代码

    2023-08-09 09:07:15
  • python登录豆瓣并发帖的方法

    2021-03-06 14:48:35
  • Python实现把json格式转换成文本或sql文件

    2022-06-03 14:52:23
  • MySQL5.7中的JSON基本操作指南

    2024-01-27 20:38:34
  • 使用python搭建Django应用程序步骤及版本冲突问题解决

    2023-01-29 07:36:34
  • Python实现读写INI配置文件的方法示例

    2021-03-16 08:10:08
  • Go语言Zap库Logger的定制化和封装使用详解

    2024-04-25 15:18:52
  • oracle 函数

    2010-07-23 13:06:00
  • Vue中的 DOM与Diff详情

    2023-07-02 16:32:37
  • sqlserver 数据库学习笔记

    2011-12-01 08:15:06
  • MYSQL启用日志和查看日志

    2010-12-03 16:24:00
  • 快速了解Python开发中的cookie及简单代码示例

    2023-05-29 11:04:05
  • 详解python tkinter模块安装过程

    2021-05-18 04:19:38
  • 使用Python脚本将绝对url替换为相对url的教程

    2022-09-03 09:36:39
  • asp之家 网络编程 m.aspxhome.com