我从网上下载的JS代码来做我的表格排序,如果我的Table是HTML代码的,排序没有问题,
但如果我的Table表体使用的是js动态生成的,则在js注释的地方,会出错 tr.cells无效,不知道为什么,求高人帮忙var TableOrder_Extend=function(destination, source)
{
for (var property in source)
{
destination[property]=source[property];
}
return destination;
}
var TableOrder_Bind=function(object, fun)
{
var args=Array.prototype.slice.call(arguments).slice(2);
return function()
{
return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}
var TableOrder_forEach=function(array, callback, thisObject)
{
if(array.forEach)
{
array.forEach(callback, thisObject);
}
else
{
for (var i=0, len=array.length; i<len; i++)
{
callback.call(thisObject, array[i], i, array);
}
}
}
var TableOrder_Map=function(array, callback, thisObject)
{
if(array.map)
{
return array.map(callback, thisObject);
}
else
{
var res=[];
for (var i=0, len=array.length; i < len; i++)
{
res.push(callback.call(thisObject, array[i], i, array));
}
return res;
}
}
var TableOrder_Filter=function(array, callback, thisObject)
{
if(array.filter)
{
return array.filter(callback, thisObject);
}
else
{
var res=[];
for (var i=0, len=array.length; i<len; i++)
{
callback.call(thisObject, array[i], i, array) && res.push(array[i]);
}
return res;
}
}
var TableOrder=function(table, options)
{
this._checked=[];//checkbox和radio集合(用来解决ie6/7的状态恢复bug)
this.tBody=$(table).tBodies[0];//tbody对象
this.Rows=TableOrder_Map(this.tBody.rows, function(o){ return o; });//行集合
this.SetOptions(options);
}
TableOrder.prototype=
{
//设置默认属性
SetOptions:function(options)
{
this.options=
{//默认值
Index: 0,//td索引
Attri: "innerHTML",//获取数据的属性
DataType: "string",//比较的数据类型
Desc: false,//是否按降序
Compare: null,//自定义排序函数
GetValue: null,//自定义取值函数
startSort: function(){},//排序前执行
endSort: function(){}//排序后执行
};
TableOrder_Extend(this.options, options || {});
},
//排序并显示
Sort:function()
{
var orders=Array.prototype.slice.call(arguments);
//没有排序对象返回
if(!orders.length){ return false };
//执行附加函数
orders[0].startSort();
//排序
this.Rows.sort(TableOrder_Bind(this, this.Compare, orders, 0));
//获取集合
isIE6or7 && this.GetChecked();
//显示表格
var oFragment=document.createDocumentFragment();
TableOrder_forEach(this.Rows, function(o){ oFragment.appendChild(o); });
this.tBody.appendChild(oFragment);
//恢复状态
isIE6or7 && this.SetChecked();
//执行附加函数
orders[0].endSort();
},
//比较函数
Compare:function(orders, i, o1, o2)
{
var order=orders[i],value1=this.GetValue(order, o1), value2=this.GetValue(order, o2)
,result=order.Compare ? order.Compare(value1, value2) ://使用自定义排序函数
typeof value2 == "string" ? value1.localeCompare(value2) : (value1 - value2);
//如果result是0(值相同)同时有下一个排序对象的话继续比较否则根据Desc修正结果并返回
return !result && orders[++i] ? this.Compare(orders, i, o1, o2) : (order.Desc ? -1 : 1) * result;
},
//获取比较值
GetValue:function(order, tr)
{
var td;
if (!isNaN(tr.cells))//这里有问题tr明明是行,但是就是没有cells??
td=tr.cells[order.Index];
else
return;
var att=order.Attri
,data=order.GetValue ? order.GetValue(td) ://使用自定义取值函数
att in td ? td[att] : td.getAttribute(att);
//数据转换
switch (order.DataType.toLowerCase())
{
case "int":
return parseInt(data, 10) || 0;
case "float":
return parseFloat(data, 10) || 0;
case "date":
return Date.parse(data) || 0;
case "bool":
return data === true || String(data).toLowerCase() == "true" ? 1 : 0;
case "string":
default:
return data.toString() || "";
}
},
//创建并返回一个排序对象
Creat: function(options)
{
return TableOrder_Extend(TableOrder_Extend({}, this.options), options || {});
},
//获取要修正的checkbox和radio集合
GetChecked: function()
{
this._checked=TableOrder_Filter(this.tBody.getElementsByTagName("input"), function(o)
{
return ((isIE6 && o.type == "checkbox") || o.type == "radio") && o.checked != o.defaultChecked;
});
},
//设置checkbox和radio集合的checked
SetChecked: function()
{
TableOrder_forEach(this._checked, function(o){ o.checked=!o.defaultChecked; });
}
}
//实际排序部份
var to=new TableOrder("tableDataList"), odID=to.Creat({ DataType: "int", Desc: false }), arrOrder=[];
function ClearCss()
{
TableOrder_forEach(arrOrder, function(o){ o.className="order-nocol"; });
}
function SetOrder(obj, options)
{
var o=$(obj),order=to.Creat(options);
order.startSort=function()
{
ClearCss();
odID.Desc=this.Desc;
}
order.endSort=function()
{
o.className=this.Desc ? "order-downcol" : "order-upcol";//设置样式
this.Desc=!this.Desc;//取反排序
}
o.onclick=function(){ to.Sort(order, odID); return false;}
arrOrder.push(o);//记录排序项目(这里主要用来设置样式)
}
SetOrder("idNum",{Index:0, DataType:"int" });
SetOrder("idPactNum",{ Index:1});
<table id="tableDataList" border="0" cellpadding="0" cellspacing="0" class="content-grid">
<thead>
<tr>
<th onselectstart="return false;" style="width:30px">
<a href="javascript:void(0)" id="idNum" title="点击排序" class="order-nocol"> </a>
</th>
<th onselectstart="return false;" style="width:75px;min-width:75px;">
<span class="grid-split" onmousedown="grid_MouseDownToResize(event,this);" onmouseup="grid_MouseUpToResize(event);"></span>
<a href="javascript:void(0)" title="点击过滤" onclick="FilterList()">合同编号</a>
<a href="javascript:void(0)" id="idPactNum" title="点击排序" class="order-nocol"> </a>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="grid-rowhead">1</td>
<td><a href="#">QHY1009</a></td>
</tr>
<tr>
<td class="grid-rowhead">2</td>
<td><a href="#">QHY1010</a></td>
</tr>
</tbody>
</table>如果这个表格中的行与列采用js insertRow与insertCell生成,则不行
但如果我的Table表体使用的是js动态生成的,则在js注释的地方,会出错 tr.cells无效,不知道为什么,求高人帮忙var TableOrder_Extend=function(destination, source)
{
for (var property in source)
{
destination[property]=source[property];
}
return destination;
}
var TableOrder_Bind=function(object, fun)
{
var args=Array.prototype.slice.call(arguments).slice(2);
return function()
{
return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
}
}
var TableOrder_forEach=function(array, callback, thisObject)
{
if(array.forEach)
{
array.forEach(callback, thisObject);
}
else
{
for (var i=0, len=array.length; i<len; i++)
{
callback.call(thisObject, array[i], i, array);
}
}
}
var TableOrder_Map=function(array, callback, thisObject)
{
if(array.map)
{
return array.map(callback, thisObject);
}
else
{
var res=[];
for (var i=0, len=array.length; i < len; i++)
{
res.push(callback.call(thisObject, array[i], i, array));
}
return res;
}
}
var TableOrder_Filter=function(array, callback, thisObject)
{
if(array.filter)
{
return array.filter(callback, thisObject);
}
else
{
var res=[];
for (var i=0, len=array.length; i<len; i++)
{
callback.call(thisObject, array[i], i, array) && res.push(array[i]);
}
return res;
}
}
var TableOrder=function(table, options)
{
this._checked=[];//checkbox和radio集合(用来解决ie6/7的状态恢复bug)
this.tBody=$(table).tBodies[0];//tbody对象
this.Rows=TableOrder_Map(this.tBody.rows, function(o){ return o; });//行集合
this.SetOptions(options);
}
TableOrder.prototype=
{
//设置默认属性
SetOptions:function(options)
{
this.options=
{//默认值
Index: 0,//td索引
Attri: "innerHTML",//获取数据的属性
DataType: "string",//比较的数据类型
Desc: false,//是否按降序
Compare: null,//自定义排序函数
GetValue: null,//自定义取值函数
startSort: function(){},//排序前执行
endSort: function(){}//排序后执行
};
TableOrder_Extend(this.options, options || {});
},
//排序并显示
Sort:function()
{
var orders=Array.prototype.slice.call(arguments);
//没有排序对象返回
if(!orders.length){ return false };
//执行附加函数
orders[0].startSort();
//排序
this.Rows.sort(TableOrder_Bind(this, this.Compare, orders, 0));
//获取集合
isIE6or7 && this.GetChecked();
//显示表格
var oFragment=document.createDocumentFragment();
TableOrder_forEach(this.Rows, function(o){ oFragment.appendChild(o); });
this.tBody.appendChild(oFragment);
//恢复状态
isIE6or7 && this.SetChecked();
//执行附加函数
orders[0].endSort();
},
//比较函数
Compare:function(orders, i, o1, o2)
{
var order=orders[i],value1=this.GetValue(order, o1), value2=this.GetValue(order, o2)
,result=order.Compare ? order.Compare(value1, value2) ://使用自定义排序函数
typeof value2 == "string" ? value1.localeCompare(value2) : (value1 - value2);
//如果result是0(值相同)同时有下一个排序对象的话继续比较否则根据Desc修正结果并返回
return !result && orders[++i] ? this.Compare(orders, i, o1, o2) : (order.Desc ? -1 : 1) * result;
},
//获取比较值
GetValue:function(order, tr)
{
var td;
if (!isNaN(tr.cells))//这里有问题tr明明是行,但是就是没有cells??
td=tr.cells[order.Index];
else
return;
var att=order.Attri
,data=order.GetValue ? order.GetValue(td) ://使用自定义取值函数
att in td ? td[att] : td.getAttribute(att);
//数据转换
switch (order.DataType.toLowerCase())
{
case "int":
return parseInt(data, 10) || 0;
case "float":
return parseFloat(data, 10) || 0;
case "date":
return Date.parse(data) || 0;
case "bool":
return data === true || String(data).toLowerCase() == "true" ? 1 : 0;
case "string":
default:
return data.toString() || "";
}
},
//创建并返回一个排序对象
Creat: function(options)
{
return TableOrder_Extend(TableOrder_Extend({}, this.options), options || {});
},
//获取要修正的checkbox和radio集合
GetChecked: function()
{
this._checked=TableOrder_Filter(this.tBody.getElementsByTagName("input"), function(o)
{
return ((isIE6 && o.type == "checkbox") || o.type == "radio") && o.checked != o.defaultChecked;
});
},
//设置checkbox和radio集合的checked
SetChecked: function()
{
TableOrder_forEach(this._checked, function(o){ o.checked=!o.defaultChecked; });
}
}
//实际排序部份
var to=new TableOrder("tableDataList"), odID=to.Creat({ DataType: "int", Desc: false }), arrOrder=[];
function ClearCss()
{
TableOrder_forEach(arrOrder, function(o){ o.className="order-nocol"; });
}
function SetOrder(obj, options)
{
var o=$(obj),order=to.Creat(options);
order.startSort=function()
{
ClearCss();
odID.Desc=this.Desc;
}
order.endSort=function()
{
o.className=this.Desc ? "order-downcol" : "order-upcol";//设置样式
this.Desc=!this.Desc;//取反排序
}
o.onclick=function(){ to.Sort(order, odID); return false;}
arrOrder.push(o);//记录排序项目(这里主要用来设置样式)
}
SetOrder("idNum",{Index:0, DataType:"int" });
SetOrder("idPactNum",{ Index:1});
<table id="tableDataList" border="0" cellpadding="0" cellspacing="0" class="content-grid">
<thead>
<tr>
<th onselectstart="return false;" style="width:30px">
<a href="javascript:void(0)" id="idNum" title="点击排序" class="order-nocol"> </a>
</th>
<th onselectstart="return false;" style="width:75px;min-width:75px;">
<span class="grid-split" onmousedown="grid_MouseDownToResize(event,this);" onmouseup="grid_MouseUpToResize(event);"></span>
<a href="javascript:void(0)" title="点击过滤" onclick="FilterList()">合同编号</a>
<a href="javascript:void(0)" id="idPactNum" title="点击排序" class="order-nocol"> </a>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="grid-rowhead">1</td>
<td><a href="#">QHY1009</a></td>
</tr>
<tr>
<td class="grid-rowhead">2</td>
<td><a href="#">QHY1010</a></td>
</tr>
</tbody>
</table>如果这个表格中的行与列采用js insertRow与insertCell生成,则不行
解决方案 »
- 这句代码什么意思,怎么调用图片的
- 正则查找html中第一个p元素
- 百撕不得其姐啊,请大侠看看这段代码什么意思!!!!!!
- 用FLASH装载的广告图片的链接不显示
- 一个我学网页中遇到的小问题~~!
- 怎样判断焦点在哪个文本框里面?
- 如何让浏览器不显示菜单工具条啊???
- 关于用键盘来控制光标上下移动,以及回车事件,还有键盘快捷键,类似于掌上电脑
- 有没觉得这个javascript 和 jscript 很烦,很讨厌啊?fuck microsoft--fuck netscape
- ajax为啥能实现为刷新获取数据
- jquery 传递 变量问题
- Ext中,如何移除掉window的已注册事件(removeListener无效)
可以参考一下