/*********************************
** 名称:JQeury实现表格行列冻结
**
** 作者:杨积江
**
** 时间:2114年4月16日
**
** 联系:
[email protected]
**
** 描述:类似Excel中的冻结窗格功能.建议给出表头固定宽度,所有单元格的高度,指定表格宽度;
**********************************/
$.fn.mergeAttributes = function(src){
if($.browser.msie) {
$(this).get(0).mergeAttributes(src.get(0));
}else{
attrs = src.get(0).attributes;//保存所有属性
i = attrs.length - 1;
for(;i>=0;i--){
var name = attrs[i].name;//取出属性名
if(name.toLowerCase() === 'id' || attrs[i].value=="" || attrs[i].value==null ||attrs[i].value=="null"){
continue;
}//忽略id属性 和 值为空的属性的标签元素的合并
try{
$(this).attr(name,attrs[i].value);
}catch(e){
}
}
}
}
$.fn.FrozenTable = function(iRowHead,iRowFoot,iColLeft){
var oTable = $(this);
var oTableId = oTable.attr("id");
var oDiv = $(this).parent();
if(oDiv.get(0).tagName != "DIV") return;
oTable.find("td").attr("noWrap","nowrap");
//oTable.css("table-layout","fixed");
//表格宽高大于div宽高
if(oTable.width()>oDiv.width() && oTable.height()>oDiv.height()){
if(iRowHead>0 && iColLeft>0){
var oCloneTable = $("<table id='oTableLH_"+oTableId+"'></table>");
oDiv.parent().append(oCloneTable);
oCloneTable.CloneTable(oTable,0,iRowHead,iColLeft);
oCloneTable.css("position","absolute");
oCloneTable.css("z-index","1004");
oCloneTable.css("left",oDiv.offset().left);
oCloneTable.css("top",oDiv.offset().top);
}
if(iRowFoot>0 && iColLeft>0){
var oCloneTable = $("<table id='oTableLF_"+oTableId+"'></table>");
oDiv.parent().append(oCloneTable);
oCloneTable.CloneTable(oTable,oTable.find("tr").length-iRowFoot,oTable.find("tr").length,iColLeft);
oCloneTable.css("position","absolute");
oCloneTable.css("z-index","1003");
oCloneTable.css("left",oDiv.offset().left);
oCloneTable.css("top",(oDiv.offset().top+oDiv.outerHeight(true)-oCloneTable.outerHeight(true)-17));
}
}
//固定了表头 表格高度大于div容器高度
if(iRowHead>0 && oTable.height()>oDiv.height()){
var oCloneDiv = $("<div id='oDivH_"+oTableId+"'><table></table></div>");
oDiv.parent().append(oCloneDiv);
oCloneDiv.find("table").CloneTable(oTable,0,iRowHead,-1);
oCloneDiv.css("overflow","hidden");
oCloneDiv.css("width",oDiv.outerWidth(true)-21);
oCloneDiv.css("position","absolute");
oCloneDiv.css("z-index","1002");
oCloneDiv.css("left",oDiv.offset().left);
oCloneDiv.css("top",oDiv.offset().top);
}
//固定了表底部 表格高度大于div容器高度
if(iRowFoot>0 && oTable.height()>oDiv.height()){
var oCloneDiv = $("<div id='oDivF_"+oTableId+"'><table></table></div>");
oDiv.parent().append(oCloneDiv);
oCloneDiv.find("table").CloneTable(oTable,oTable.find("tr").length-iRowFoot,oTable.find("tr").length,-1);
oCloneDiv.css("overflow","hidden");
oCloneDiv.css("width",oDiv.outerWidth(true)-21);
oCloneDiv.css("position","absolute");
oCloneDiv.css("z-index","1001");
oCloneDiv.css("left",oDiv.offset().left);
oCloneDiv.css("top",oDiv.offset().top+oDiv.outerHeight(true)-oCloneTable.outerHeight(true)-17);
}
//固定了表左侧 表格宽度大于div容器宽度
if(iColLeft>0 && oTable.width()>oDiv.width()){
var oCloneDiv = $("<div id='oDivL_"+oTableId+"'><table></table></div>");
oDiv.parent().append(oCloneDiv);
oCloneDiv.find("table").CloneTable(oTable,0,oTable.find("tr").length,iColLeft);
oCloneDiv.css("overflow","hidden");
oCloneDiv.css("height",oDiv.outerHeight(false)-17);
//TODO
oCloneDiv.css("position","absolute");
oCloneDiv.css("z-index","1000");
oCloneDiv.css("left",oDiv.offset().left);
oCloneDiv.css("top",oDiv.offset().top);
}
oDiv.scroll(function(){
if(typeof($("#oDivH_"+oTableId).get(0))!='undefined'){
$("#oDivH_"+oTableId).scrollLeft($(this).scrollLeft());
}
if(typeof($("#oDivF_"+oTableId).get(0))!='undefined'){ //TODO
$("#oDivF_"+oTableId).scrollLeft($(this).scrollLeft());
}
if(typeof($("#oDivL_"+oTableId).get(0))!='undefined'){
$("#oDivL_"+oTableId).scrollTop($(this).scrollTop());
}
});
};
/**
*
* @param oSrcTable 原始表格(需要克隆的表格)
* @param iRowStart 行号开始处
* @param iRowEnd 行号完结处
* @param iColumnEnd 列完结处
* @constructor
*/
$.fn.CloneTable = function(oSrcTable,iRowStart,iRowEnd,iColumnEnd){
var iWidth = 0,iHeight = 0;
$(this).mergeAttributes(oSrcTable);
var Log="";
var rowspanValue = 0;
var rowNumber = 0;
var rowIndex;
for(var i=iRowStart;i<iRowEnd;i++){//遍历每一行
var oldTr = oSrcTable.find("tr").eq(i);//找出第i个tr元素
var isSingleRowspan = false;
var rowspanCount = 0;
var colCount = 0;
var colNumber = 0;
for(var j=0; j<(iColumnEnd==-1?oldTr.find("td").length:iColumnEnd); j++){
var oldTd = oldTr.find("td").eq(j);//遍历td元素
colNumber++;
var colspan = oldTd.attr("colspan");//得到colspan的数目
if (typeof(colspan)=="undefined" || colspan==1) {
colCount += 1;
}else{
colCount += colspan;//统计列数目
}
//统计行数目
var rowspan = oldTd.attr("rowspan");
//TODO
if(typeof(rowspan)!="undefined" && rowspan!=1){
rowspanCount++;
rowIndex = i;
rowspanValue = rowspan;
rowNumber = rowspanCount;
}
if(colCount>=iColumnEnd && iColumnEnd!=-1){
break;
}
}
Log +=i+"=="+rowIndex+"="+rowspanCount+"="+rowNumber+"="+rowspanValue+"<br>";
//TODO
if(i>rowIndex && i<=(rowIndex+rowspanValue-1) && iColumnEnd!=-1){
if(rowNumber!=0 && iColumnEnd==rowNumber){
isSingleRowspan = true;
}else{
colNumber -= 1;
if(rowspanCount==0){
colNumber -= (rowNumber-1);
}
}
}
if(colNumber!=0){
var newTr = $("<tr></tr>");
newTr.mergeAttributes(oldTr);
var jWidth = 0;
iHeight += oldTr.outerHeight(false);
for(var j=0; j<colNumber;j++){
if(isSingleRowspan){
continue;
}
var oldTd = oldTr.find("td").eq(j);
var newTd = oldTd.clone(true,true);
/*IE 一行多列合并时
if(iColumnEnd==-1 && iRowStart!=0 && $.browser.msie){
if (typeof(newTd.attr("colspan"))!="undefined" && newTd.attr("colspan")!=1) {
alert(newTd.text()+"==2=="+newTd.attr("colspan")+"---"+colCount);
}
}
if(iColumnEnd==-1 && iRowStart!=0 && j==1){
newTd.width(oidTd.outerWidth(true)-1);
jWidth += (oidTd.outerWidth(true)-1);
}else{
newTd.width(oidTd.outerWidth(true));
jWidth += oidTd.outerWidth(true);
}*/
newTd.height(oldTd.height()+1);//TODO
newTd.width(oldTd.outerWidth(true));
jWidth += oldTd.outerWidth(true);
iWidth = Math.max(iWidth,jWidth);
newTr.append(newTd);
}
$(this).append(newTr);
}
}
$(this).width(iWidth);
$(this).height(iHeight);
}