dhDataGrid Ver2.0.0发布

针对dhDataGrid的前一版本Ver1.0.0而做的更新!

1、标题栏、左边边栏固定方式更新,取消expression方式;

2、排序方式更新,同时支持数字、字符、日期、数字字符混合、中文汉字的排序;

3、支持换肤,您可以自己定制该控件样式;

4、预留[双击]、[右键]功能;

5、支持IE、FF;

DEMO(演示):http://www.jxxg.com/dh20156/dhdatagrid/

CSS:

/*dhdatagrid 大块样式*/
#dhdatagrid {position:relative;width:500px;height:200px;background:white;margin:0px;padding:0px;overflow:hidden;border:1px inset;-moz-user-select:none;}
/*dhdatagrid 表格全局样式*/
#dhdatagrid table {table-layout:fixed;margin:0px;}
#dhdatagrid table td {height:18px;cursor:default;font-size:12px;font-family:verdana;overflow:hidden;white-space:nowrap;text-indent:2px;border-right:1px solid buttonface;border-bottom:1px solid buttonface;}
#dhdatagrid table td .arrow {font-size:8px;color:#808080;}
#dhdatagrid table .lastdata {border-right:none;}
#dhdatagrid table .column {width:120px;cursor:default;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
#dhdatagrid table .over {width:120px;cursor:default;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
#dhdatagrid table .sortdown {width:120px;cursor:default;background:buttonface;border-right:1px solid #ffffff;border-bottom:1px solid #ffffff;border-left:1px solid #404040;border-top:1px solid #404040;position:relative;left:1px;}
#dhdatagrid table .dataover {background:#FAFAFA;}
#dhdatagrid table .firstcolumn {width:30px;text-indent:0px;text-align:center;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
#dhdatagrid table .lastcolumn {background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
/*dhdatagrid 选定行样式*/
#dhdatagrid table .selectedrow {background:highlight;color:white;}
/*dhdatagrid 表头样式*/
#dhdatagrid #titlecolumn {width:100%;position:absolute;top:0px;left:0px;z-index:3;}
/*dhdatagrid 左边栏样式*/
#dhdatagrid #slidecolumn {width:30px;position:absolute;top:0px;left:0px;z-index:2;}
#dhdatagrid #slidecolumn td {width:30px;text-indent:0px;text-align:center;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
/*dhdatagrid 内容表体样式*/
#dhdatagrid #datacolumn {width:100%;position:absolute;top:0px;left:0px;}
/*dhdatagrid 原点样式*/
#dhdatagrid #zero {width:30px;height:18px;margin:0px;padding:0px;position:absolute;top:0px;left:0px;z-index:10;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;text-align:center;font-size:10px;color:#A19F92;}

JS:

function dhdatagrid(){
 //author:dh20156;
 this.callname = "dhdg";
 this.width = 500;
 this.height = 200;
 this.rid = "dhdatagrid";
 this.columns = [];
 this.data = [];
 this.dblclick_fun = function(){}
 this.contextmenu_fun = function(){}
 this.parentNode = document.body;

 var dh = this;
 var framediv = null;
 var zerobj = null;
 var leftobj = null;
 var titleobj = null;
 var dataobj = null;
 var hbar = null;
 var vbar = null;
 var bgbar = null;

 //改变列宽初始位置
 var ml = 0;
 //改变列宽对象初始宽度
 var ow = 0;
 //改变列宽对象
 var tdobj = null;
 //当前选定行索引
 var nowrow = null;
 //是否更改垂直滚动条位置
 var changeposv = true;
 
 this.init = function(){
  //init the data 初始数据
  var dgc = "";
  if(this.columns.length>0){
   dgc = "<tr><td class=/"firstcolumn/">&nbsp;</td>";
   for(var cc=0;cc<this.columns.length;cc++){
    dgc += "<td class=/"column/" οnmοuseοver=/""+this.callname+".over(this);/" οnmοuseοut=/""+this.callname+".out(this);/" οnmοusemοve=/""+this.callname+".cc(event,this);/" οnmοusedοwn=/""+this.callname+".rsc_d(event,this);/" οnmοuseup=/""+this.callname+".mouseup(this);/">"+this.columns[cc]+"<span class=/"arrow/"></span></td>";
   }
   dgc += "<td class=/"lastcolumn/">&nbsp;</td></tr>";
  }

  var dgs = "";
  var dgd = "";
  if(this.data.length>0){
   //第一列
   dgs = "<tr><td>&nbsp;</td></tr>";
   for(var r=0;r<this.data.length;r++){
    dgs += "<tr><td>"+(r+1)+"</td></tr>";
    dgd += "<tr οnmοuseοver=/""+this.callname+".dataover(this);/" οnmοuseοut=/""+this.callname+".dataout(this);/"><td class=/"firstcolumn/">&nbsp;</td>";
    for(var c=0;c<this.data[r].length;c++){
     dgd += "<td οndblclick=/""+this.callname+".dblclick_fun(this);/" οncοntextmenu=/""+this.callname+".contextmenu_fun(this);/">"+this.data[r][c]+"</td>";
    }
    dgd += "<td class=/"lastdata/">&nbsp;</td></tr>";
   }
   if(dgc==""){
    dgc = "<tr><td class=/"firstcolumn/">&nbsp;</td>";
    for(var dc=0;dc<this.data[0].length;dc++){
     dgc += "<td class=/"column/" οnmοuseοver=/""+this.callname+".over(this);/" οnmοuseοut=/""+this.callname+".out(this);/" οnmοusemοve=/""+this.callname+".cc(event,this);/" οnmοusedοwn=/""+this.callname+".rsc_d(event,this);/" οnmοuseup=/""+this.callname+".mouseup(this);/">Expr"+(dc+1)+"<span class=/"arrow/"></span></td>";
    }
    dgc += "<td class=/"lastcolumn/">&nbsp;</td></tr>";
   }
  }

  //dhdatagrid frame 框架
  var dgframe = document.createElement("DIV");
  dgframe.id = this.rid;
  dgframe.onmousedown = function(e){e=e||window.event;getrow(e);}
  dgframe.onmousemove = function(e){e=e||window.event;rsc_m(e);}
  if(document.attachEvent){
   document.attachEvent("onmouseup",rsc_u);
  }else{
   document.addEventListener("mouseup",rsc_u,false);
  }
  dgframe.oncontextmenu = function(){return false}
  dgframe.onselectstart = function(){return false}
  ae(dgframe);

  //dhdatagrid zero point 零点
  var dgzero = "<div id=/"zero/"></div>"

  //dhdatagrid slidecolumn 第一列
  var dgslide = "<table cellpadding=/"0/" cellspacing=/"0/" id=/"slidecolumn/">"+dgs+"</table>";

  //dhdatagrid column 标题栏
  var dgcolumn = "<table cellpadding=/"0/" cellspacing=/"0/" id=/"titlecolumn/">"+dgc+"</table>";

  //dhdatagrid data 数据
  var dgdata = "<table cellpadding=/"0/" cellspacing=/"0/" id=/"datacolumn/">"+dgc+dgd+"</table>";

  //dhdatagrid hbar 水平滚动条
  var dghbar = document.createElement("DIV");
  dghbar.id = "hbar";
  dghbar.style.position = "absolute";
  dghbar.style.width = "100%";
  dghbar.style.height = "17px";
  dghbar.style.top = this.height-17;
  dghbar.style.overflowX = "auto";
  dghbar.style.zIndex = "10";
  dghbar.onscroll = function(){scrh();}
  dghbar.innerHTML = "<div style=/"width:100%;height:1px;overflow-y:hidden;/">&nbsp;</div>";

  //dhdatagrid vbar 垂直滚动条
  var dgvbar = document.createElement("DIV");
  dgvbar.id = "vbar";
  dgvbar.style.position = "absolute";
  dgvbar.style.width = "17px";
  dgvbar.style.height = "100%";
  dgvbar.style.left = this.width-17;
  dgvbar.style.overflowY = "auto";
  dgvbar.style.zIndex = "10";
  dgvbar.onscroll = function(){scrv();}
  dgvbar.innerHTML = "<div style=/"width:1px;height:100%;overflow-x:hidden;/">&nbsp;</div>";

  //dhdatagrid bgbar 滚动条背景
  var dgbgbar = document.createElement("DIV");
  dgbgbar.id = "bgbar";
  dgbgbar.style.background = "buttonface";
  dgbgbar.style.position = "absolute";
  dgbgbar.style.width = "100%";
  dgbgbar.style.height = "17px";
  dgbgbar.style.top = this.height-17;
  dgbgbar.style.overflowX = "auto";
  dgbgbar.style.zIndex = "9";
  dgbgbar.style.display = "none";
  dgbgbar.innerHTML = "&nbsp;";

  //appendChild
  dgframe.innerHTML = dgzero+dgslide+dgcolumn+dgdata;
  dgframe.appendChild(dghbar);
  dgframe.appendChild(dgvbar);
  dgframe.appendChild(dgbgbar);

  this.parentNode.appendChild(dgframe);

  if(document.attachEvent){
   document.attachEvent("onkeydown",updown);
  }else{
   document.addEventListener("keydown",updown,false);
  }

  framediv = dgframe;
  zerobj = document.getElementById("zero");
  leftobj = document.getElementById("slidecolumn");
  titleobj = document.getElementById("titlecolumn");
  dataobj = document.getElementById("datacolumn");
  hbar = dghbar;
  vbar = dgvbar;
  bgbar = dgbgbar;

  var btt = getCurrentStyle(framediv,"borderTopWidth");
  var btr = getCurrentStyle(framediv,"borderRightWidth");
  var btb = getCurrentStyle(framediv,"borderBottomWidth");
  var btl = getCurrentStyle(framediv,"borderLeftWidth");
  var fh = getCurrentStyle(framediv,"height");
  var zh = getCurrentStyle(zerobj,"height");
  var zbt = getCurrentStyle(zerobj,"borderTopWidth");
  var zbb = getCurrentStyle(zerobj,"borderBottomWidth");

  if(document.all){
   vbar.style.left = parseInt(vbar.style.left)-parseInt(btr)-parseInt(btl);
  }else{
   framediv.style.height = parseInt(fh)-parseInt(btb)-parseInt(btt);
   zerobj.style.height = parseInt(zh)-parseInt(zbb)-parseInt(zbt);
  }

  hbar.style.top = parseInt(hbar.style.top)-parseInt(btb)-parseInt(btt);
  bgbar.style.top = parseInt(bgbar.style.top)-parseInt(btb)-parseInt(btt);
 }
 function getCurrentStyle(oElement, sProperty) {  
  if(oElement.currentStyle){  
   return oElement.currentStyle[sProperty];  
  }else if(window.getComputedStyle){  
   sProperty = sProperty.replace(/([A-Z])/g, "-$1").toLowerCase();  
   return window.getComputedStyle(oElement, null).getPropertyValue(sProperty);  
  }else{  
   return null;  
  }  
 }
 //设置块滚动条
 this.setwh = function(){
  hbar.style.display = "block";
  vbar.style.display = "block";
  hbar.childNodes[0].style.width = dataobj.offsetWidth;
  vbar.childNodes[0].style.height = dataobj.offsetHeight;
  if(hbar.childNodes[0].offsetWidth<=hbar.offsetWidth){
   hbar.style.display = "none";
  }else{
   hbar.style.display = "block";
  }
  if(vbar.childNodes[0].offsetHeight<=vbar.offsetHeight){
   vbar.style.display = "none";
  }else{
   vbar.style.display = "block";
  }
  if(hbar.childNodes[0].offsetWidth>hbar.offsetWidth && vbar.childNodes[0].offsetHeight>vbar.offsetHeight && changeposv){
   bgbar.style.display = "block";
   hbar.style.width = hbar.offsetWidth-17;
   vbar.style.height = vbar.offsetHeight-17;
   vbar.childNodes[0].style.height = vbar.childNodes[0].offsetHeight+17;
   changeposv = false;
  }
  if(hbar.childNodes[0].offsetWidth<=hbar.offsetWidth+17 && !changeposv){
   bgbar.style.display = "none";
   hbar.childNodes[0].style.width = 0;
   hbar.style.width = hbar.offsetWidth+17;
   vbar.style.height = vbar.offsetHeight+17;
   changeposv = true;
   if(vbar.offsetHeight-dataobj.offsetHeight>dataobj.offsetTop && document.all){
    leftobj.style.top = leftobj.offsetTop+17;
    dataobj.style.top = dataobj.offsetTop+17;
   }
  }
 }

 //鼠标滚轮,列表滚动事件
 function mwEvent(e){
  e=e||window.event;
  if(e.wheelDelta<=0 || e.detail>0){
   vbar.scrollTop += 18;
  }else {
   vbar.scrollTop -= 18;
  }
 }
 function ae(obj){
  if(document.attachEvent){
   obj.attachEvent("onmousewheel",mwEvent);
  }else{
   obj.addEventListener("DOMMouseScroll",mwEvent,false);
  }
 }

 //滚动条事件
 function scrv(){
  leftobj.style.top = -(vbar.scrollTop);
  dataobj.style.top = -(vbar.scrollTop);
 }

 function scrh(){
  titleobj.style.left = -(hbar.scrollLeft);
  dataobj.style.left = -(hbar.scrollLeft);
 }

 //选择行
 function getrow(e){
  e=e||window.event;
  var esrcobj = e.srcElement?e.srcElement:e.target;
  if(esrcobj.parentNode.tagName=="TR"){
   var epobj = esrcobj.parentNode;
   var eprowindex = epobj.rowIndex;
   if(eprowindex!=0){
    if(nowrow!=null){
     dataobj.rows[nowrow].className = "";
    }
    dataobj.rows[eprowindex].className = "selectedrow";
    nowrow = eprowindex;
   }
  }
 }

 //更改列宽
 this.rsc_d = function(e,obj){
  var px = document.all?e.offsetX:e.layerX-obj.offsetLeft;
  if(px>obj.offsetWidth-6 && px<obj.offsetWidth){
   e=e||window.event;
   obj=obj||this;
   ml = e.clientX;
   ow = obj.offsetWidth;
   tdobj = obj;
   if(obj.setCapture){
    obj.setCapture();
   }else{
    e.preventDefault();
   }
  }else{
   if(nowrow!=null){
    dataobj.rows[nowrow].className = "";
   }
   if(obj.getAttribute("sort")==null){
    obj.setAttribute("sort",0);
   }
   var sort = obj.getAttribute("sort");
   if(sort==1){
    dgsort(obj,true);
    obj.setAttribute("sort",0);
   }else{
    dgsort(obj,false);
    obj.setAttribute("sort",1);
   }
   obj.className = "sortdown";
  }
 }
 this.mouseup = function(obj){
  obj.className = "over";
 }
 function rsc_m(e){
  if(tdobj!=null){
   e=e||window.event;
   var newwidth = ow-(ml-e.clientX);
   if(newwidth>5){
    tdobj.style.width = newwidth;
    dataobj.rows[0].cells[tdobj.cellIndex].style.width = newwidth;
   }else{
    tdobj.style.width = 5;
    dataobj.rows[0].cells[tdobj.cellIndex].style.width = 5;
   }
   dh.setwh();
   scrh();
  }
 }
 function rsc_u(e){
  if(tdobj!=null){
   e=e||window.event;
   var newwidth = ow-(ml-e.clientX);
   if(newwidth>5){
    tdobj.style.width = newwidth;
    dataobj.rows[0].cells[tdobj.cellIndex].style.width = newwidth;
   }else{
    tdobj.style.width = 5;
    dataobj.rows[0].cells[tdobj.cellIndex].style.width = 5;
   }
   if(tdobj.releaseCapture){
    tdobj.releaseCapture();
   }
   ml = 0;
   ow = 0;
   tdobj = null;
  }
  dh.setwh();
  scrh();
 }

 this.cc = function(e,obj){
  var px = document.all?e.offsetX:e.layerX-obj.offsetLeft;
  if(px>obj.offsetWidth-6 && px<obj.offsetWidth){
   obj.style.cursor = "col-resize";
  }else{
   obj.style.cursor = "default";
  }
 }

 this.over = function(obj){
  obj.className = "over";
 }

 this.out = function(obj){
  obj.className = "column";
 }

 this.dataover = function(obj){
  if(obj.rowIndex!=nowrow){
   obj.className = "dataover";
  }
 }

 this.dataout = function(obj){
  if(obj.rowIndex!=nowrow){
   obj.className = "";
  }
 }

 //键盘Up & Down事件
 function updown(e){
  e=e || window.event; e=e.which || e.keyCode;
  var rl = dh.data.length;
  switch(e){
   case 38://Up;
    if(nowrow!=null && nowrow>1){
     vbar.scrollTop -= 18;
     dataobj.rows[nowrow].className = "";
     nowrow -= 1;
     dataobj.rows[nowrow].className = "selectedrow";
    };
    break;
   case 40://Down;
    if(nowrow!=null && nowrow<rl){
     vbar.scrollTop += 18;
     dataobj.rows[nowrow].className = "";
     nowrow += 1;
     dataobj.rows[nowrow].className = "selectedrow";
    };
    break;
   default:break;
  }
 }

 function dti(s){
  var n = 0;
  var a = s.match(//d+/g);
  for(var i=0;i<a.length;i++){
   if(a[i].length<2){
    a[i] = "0"+a[i];
   }
  }
  n = a.join("");
  return n;
 }

 //排序
 function dgsort(obj,asc){
  var rl = dh.data.length;
  var ci = obj.cellIndex;
  var rowsobj = [];
  for(var i=1;i<dataobj.childNodes[0].rows.length;i++){
   rowsobj[i-1] = dataobj.childNodes[0].rows[i];
  }
  rowsobj.sort(function(trObj1,trObj2){
    if(!isNaN(trObj1.cells[ci].innerHTML.charAt(0)) && !isNaN(trObj2.cells[ci].innerHTML.charAt(0))){
     if(asc){
      return dti(trObj1.cells[ci].innerHTML)-dti(trObj2.cells[ci].innerHTML);
     }else{
      return dti(trObj2.cells[ci].innerHTML)-dti(trObj1.cells[ci].innerHTML);
     }
    }else{
     if(asc){
      return trObj1.cells[ci].innerHTML.localeCompare(trObj2.cells[ci].innerHTML);
     }else{
      return trObj2.cells[ci].innerHTML.localeCompare(trObj1.cells[ci].innerHTML);
     }
    }
   });
  for(var i=0;i<rowsobj.length;i++){
   dataobj.childNodes[0].appendChild(rowsobj[i]);
  }
  for(var c=1;c<obj.parentNode.cells.length-1;c++){
   obj.parentNode.cells[c].childNodes[1].innerHTML = "";
  }
  if(asc){
   obj.childNodes[1].innerHTML = "▲";
  }else{
   obj.childNodes[1].innerHTML = "▼";
  }
 }
}

 

引用:

<html>
<head>
<meta http-equiv="content-type" content="type=text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="default/dhdatagrid.css">
<script language="javascript" src="dhdatagrid.js"></script>
</head>
<body style="background:#ECE9D8;">
<script language="javascript">
var dhdg = new dhdatagrid();
dhdg.callname = "dhdg";
dhdg.columns = ["名称","大小","修改时间"];
dhdg.data = [["01.jpg","49 KB","2006-12-6 17:06"],["02.gif","3 KB","2006-12-6 17:06"],["axjz.jpg","121 KB","2007-1-19 10:19"],["bb.jpg","314 KB","2006-10-24 15:49"],["cd056.jpg","50 KB","2007-1-5 10:03"],["d.psd","27,639 KB","2006-11-6 13:31"],["dhAJ2.htm","12 KB","2006-12-21 10:53"],["dhChange.htm","12 KB","2006-10-19 9:28"],["dhcombobox.htm","2 KB","2006-12-22 11:39"],["保险.txt","5 KB","2007-1-3 11:31"],["滨江丽景.rar","1,048 KB","2007-1-18 14:23"],["积分兑奖.doc","634 KB","2007-1-19 11:17"],["亲人.jpg","396 KB","2006-12-23 15:50"],["未标题-2.jpg","61 KB","2006-12-23 15:46"]];
dhdg.dblclick_fun = function(e){alert(e+',ondblclick');}
dhdg.contextmenu_fun = function(e){alert(e+',oncontextmenu');}
dhdg.init();
dhdg.setwh();
</script>
</body>
</html>

DEMO(演示):http://www.jxxg.com/dh20156/dhdatagrid/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值