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

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

 

上一篇博文写道:用javascript实现Repeater.

此文将实现一个的jQuery表格插件jQuery.DataGrid。

  1. 固定表头
  2. 列宽可调整
  3. 单击列头可排序
  4. 双击单元格可编辑
  5. 可绑定数据源

 看下效果吧:

 

 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. 如何排序:

 由时间问题请容我下回分解!!

 

源码下载:

      请遵守 LGPL英文 LGPL中文 协议!  下载.

 

 

作者:houfeng
出处:http://houfeng.cnblogs.com
本文版权归作者和博客园共有,未经作者同意请保留此声明.
posted @ 2010-07-16 18:01 Houfeng 阅读(2900) 评论(14) 编辑 收藏

 回复 引用 查看   
#1楼 2010-07-16 19:12 icjyw.com      
已推荐,好文,好技术
 回复 引用 查看   
#2楼 2010-07-16 21:07 顾磊(kyo-yo)      
好东西.推荐+1
 回复 引用 查看   
#3楼 2010-07-16 21:35 aito      
单元格的编辑当失去焦点如何实现将新数据写入数据库?
 回复 引用 查看   
#4楼 2010-07-16 23:15 phrmgb      
学习了
 回复 引用 查看   
#5楼 2010-07-17 09:11 金色海洋(jyk)      
发现了一个bug,当地址字段里的内容比较多的时候,显示方式很怪异。

恩,确实很怪异。

大家可以试一试,双击td,随便写点,多写点,然后看看效果。然后在调整一下宽度。

 回复 引用 查看   
#6楼[楼主] 2010-07-17 10:51 侯锋      
@金色海洋(jyk)
引用金色海洋(jyk):
发现了一个bug,当地址字段里的内容比较多的时候,显示方式很怪异。

恩,确实很怪异。

大家可以试一试,双击td,随便写点,多写点,然后看看效果。然后在调整一下宽度。

有什么怪异的?详说一下!

 回复 引用 查看   
#7楼 2010-07-17 13:51 guoqiang.liu      
好,很好!
很强大啊。推荐+1

 回复 引用 查看   
#9楼 2010-07-17 18:33 ilovedotnet      
简单实用,很不错!继续努力,加个分页功能吧,哈哈!
 回复 引用 查看   
#10楼 2010-07-18 20:10 AD钙      
很严重的问题就是排序后alt背景有问题。
不知道是否可以设置最小列宽,如果没有的话拖动改变列宽,当列宽小到一定程度时候就无法再拖回来了。

双击单元格后可以实现编辑功能,如果这样的就要考虑开发combox和验证功能,此表格插件必定会很庞大臃肿。
TableBody.find('.header').clone().prependTo(TableHead);
.head这样CLASS命名问题很大很容易重复。
jQuery直接这么找.head不太好吧 尤其对于表格插件效率很重要

还有你那张照片太傻了

 回复 引用 查看   
#11楼[楼主] 2010-07-18 21:36 侯锋      
@AD钙
嘿嘿,有时间完善下。
照片太傻?汗!没办法长的就这样!

 回复 引用 查看   
#12楼 2010-07-24 12:59 Vincent.Q      
是的,确实不错!支持一下
 回复 引用 查看   
#13楼 2010-10-12 22:04 阿宝QQ      
顶一下
 回复 引用 查看   
#14楼 2012-02-11 13:53 Liran      
可否分页?