我从网上下载的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">&nbsp;</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">&nbsp;</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生成,则不行