一个可绑定数据源的jQuery数据表格插件


  本文标签:jQuery,数据表格

固定表头
列宽可调整
单击列头可排序
双击单元格可编辑
可绑定数据源

看下效果吧:
HTML - 模板代码:
复制代码 代码如下:

<table id="test">
<tr class="header">
<td style="width: 100px;" sort=true>
姓名
</td>
<td style="width: 100px;" sort=true>
性别
</td>
<td style="width: 100px;" sort=true>
年龄
</td>
<td style="width:200px;" sort=true>
住址
</td>
</tr>
<tr class="itemtemplate">
<td editable=true>
{姓名}
</td>
<td editable=true>
{性别}
</td>
<td editable=true>
{年龄}
</td>
<td editable=true>
{住址}
</td>
</tr>
</table>

jsascript代码:
复制代码 代码如下:

//测试数据
var dataJsonStr={tablename:"",rows:[{"姓名":"曹操","性别":"男","年龄":"51","住址":"许昌"},{"姓名":"诸葛亮","性别":"男","年龄":"40","住址":"南阳"},{"姓名":"周瑜","性别":"男","年龄":"40","住址":"江东"},{"姓名":"大乔","性别":"女","年龄":"30","住址":"江东"},{"姓名":"小乔","性别":"女","年龄":"28","住址":"江东"},{"姓名":"曹操","性别":"男","年龄":"51","住址":"许昌"},{"姓名":"诸葛亮","性别":"男","年龄":"40","住址":"南阳"},{"姓名":"周瑜","性别":"男","年龄":"40","住址":"江东"},{"姓名":"大乔","性别":"女","年龄":"30","住址":"江东"},{"姓名":"小乔","性别":"女","年龄":"28","住址":"江东"}]};
//清空数据
$(#test).DataGridClear();
//设定行样式
$(#test).DataGridSetItemClass("tr1","tr2","trhover");
//绑定数据,并设置宽度高度
$(#test).DataGrid("100%",200,dataJsonStr);

结构示意图:

如何根据HTML模板创建DataGrid整个结构?
1.首先创建 表头 主体 等各区域:
复制代码 代码如下:

TableBody.addClass(TableBody);
TableBody.wrap("<div id="+MyTableId+" class=houfeng-table></div>");
var MyTable=$(#+MyTableId);
TableBody.data(MyTable,MyTable);
TableBody.before("<table class=TableHead ></table>");
var TableHead=MyTable.find(".TableHead");
TableBody.data(TableHead,TableHead);
TableBody.wrap(<div class="TableBodyArea"></div>);
TableHead.wrap("<div class=TableHeadArea onselectstart=return false;></div>");
var TableBodyArea=MyTable.find(.TableBodyArea);
var TableHeadArea=MyTable.find(.TableHeadArea);
TableBody.data(TableBodyArea,TableBodyArea);
TableBody.data(TableHeadArea,TableHeadArea);

上面代代中红色高亮 TableBody 为表主体, TableHead 为表头
2.创建表头
复制代码 代码如下:

TableBody.find(.header).clone().prependTo(TableHead);

TableBody 其实便是HTML模板Table , 将 .header 的行移到到表头表格中作为表头.
3.创建表主体
创建表主体,其实便是根据数据源及模板 循环创建每一行 , 这里用了 上篇文章提到的 Repeater 来创建, 详细 请看用javascript实现Repeater.
4.处理当列过多时横向滚动条的问题
复制代码 代码如下:

TableBodyArea.scroll(function (){
var ml=0-parseInt(TableBodyArea.attr(scrollLeft));
TableHead.css(margin-left,ml);
});

TableBodyArea 为TableBody外包裹的一个Div
5.如何实现单元格编辑
双击td时在td中动态插入一个文件本框为将td的innerHTML给文本框,在文本焦点失去时,将文本框值赋给td的innerHTML,将移除文本框 代码如下:
复制代码 代码如下:

TableBody.find(td).live(dblclick,function(){
var td=$(this);
if(td.attr(editable)==true)
{
var text=td.text();
var html="<input type=text class=TdEditTextBox value="+$.trim(text)+" />";
td.html(html);
td.addClass("tdediting");
//
$(this).find(.TdEditTextBox).focus().focus().focus().focus();
$(this).find(.TdEditTextBox).blur(function(){
var val=$(this).val();
td.html(val);
td.removeClass("tdediting");
});
}
});

6. 如何排序:
由时间问题请容我下回分解!!
源码下载: /201007/yuanma/DataGrid.rar
作者:houfeng
出处:http://houfeng.cnblogs.com