我的jQuery动态表格插件二

简介:

   本篇博客是我写在离职后,昨天刚辞职和交接完任务,准备离开。其实我有很多不舍,但是最终还是选择了离开,许多苦楚都埋在我的心底。哎,趁回成都找工作的机会是该好好休息一下了。 

      在上篇我的jQuery动态表格插件中介绍了插件的基本使用方法.在实际运用的时候出现了一些其他的需求,所以插件再次升级,增加了一些辅助功能.

1EnterToTab:$(selector). EnterToTab(),是的selector中的空间可以回车变为tab键使用,方便用户的输入。

代码简析: IE

其他浏览器:主要针对firefox,因为ff中的时间的键值码,是一个制度属性,所以我们不能通过和ie一样的方式来处理,只有我们自己处理是的下一个可以focus控件focus。

 
  1. View Code   
  2.  
  3. $("input,select", this).not(":button").not(":disabled,:hidden").live("keypress"function(evt) {  
  4.  
  5.                     if (evt.keyCode == 13) {  
  6.  
  7.                         var fields = $(this).parents('form:eq(0),body').find('button,input,textarea,select').not(":disabled,:hidden");  
  8.  
  9.                         var index = fields.index(this);  
  10.  
  11.                         if (index > -1 && (index + 1) < fields.length) {  
  12.  
  13.                             fields.eq(index + 1).focus();  
  14.  
  15.                         }  
  16.  
  17.                         return false;  
  18.  
  19.                     }  
  20.  
  21.                 });  
  22. 复制代码 

2:重新处理的计算列和汇总事件,在原来我们的事件直接绑定的change事件,这样有时在我们的外部手动触发更新的时候,不好的代码容易出现循环调用,而导致内存不足。所以事件采用了,jQuery的命名空间,change.Calculates。并提供了手动更新方法,$(selector).updateCalculates().

3:加入了事件处理,有时我们需要对控件或者样式做一些特殊处理,但是由于table中有很多这样的列是的我们不好定位,所以增加了一系列时间出入jQuery的table 行tr对象,以供特殊处理定位。

主要有:

addRowing:增加行前触发事件:参数arg,属性有cancel可以供取消增加操作,rowTemplate改变某一行的增加行模板。

addRowed:增加行以后,参数为行对象来定位,以供处理特殊的js控件,脚本执行或者css样式处理等等。

removeRowing:删除行之前触发,参数cancel,可以取消操作,row为需要删除的行对象。

removeRowed:删除行之后触发的事件。还没有想到需要什么参数,所以是一个{}对象。我觉得一般不需要什么特殊参数。

4:扩展的对html的控件支持,在上一个版本中默认支持,支持text,label,checkbox,radio,label,td,textarea的取值。其中radio取值选中value,checkbox取值为所有选中行value的号分隔字符串。但是在我们的实际运用中还会用到一些特殊的js控件,如我实际中用到的Jquery EasyUi的ComboTree这些,需要上边提供的事件addRowed中一些js处理,以及获取值getSource中获取值的处理,所以提供了,一个对数据取值getValue的自定义取值委托。

customerFunction: null//column:列,func:获取Value function

 
  1. 查看   
  2.  
  3. <script type="text/javascript">  
  4.  
  5.         window.FiannceBudget = new Array(); //[200, 300, 200, 300, 44];  
  6.  
  7.         window.FiannceBudget["1"] = 200;  
  8.  
  9.         window.FiannceBudget["2"] = 402;  
  10.  
  11.         window.FiannceBudget["5"] = 121;  
  12.  
  13.         window.FiannceBudget["6"] = 345;//类型6(费用2-)自用的id)的预算额。  
  14.  
  15.         window.TreeSource = [{  
  16.  
  17.             "id": -1,  
  18.  
  19.             "text""费用1",  
  20.  
  21.             "iconCls""icon-ok",  
  22.  
  23.             "children": [{  
  24.  
  25.                 "id": 1,  
  26.  
  27.                 "text""公用",                  
  28.  
  29.             }, {  
  30.  
  31.                 "id": 2,  
  32.  
  33.                 "text""自用",  
  34.  
  35.                 "state""open" 
  36.  
  37. }]  
  38.  
  39.             },  
  40.  
  41. {  
  42.  
  43.     "id": -1,  
  44.  
  45.     "text""费用2",  
  46.  
  47.     "iconCls""icon-ok",  
  48.  
  49.     "children": [{  
  50.  
  51.         "id": 5,  
  52.  
  53.         "text""公用" 
  54.  
  55.     }, {  
  56.  
  57.         "id": 6,  
  58.  
  59.         "text""自用",  
  60.  
  61.         "state""open" 
  62.  
  63. }]  
  64.  
  65.     }  
  66.  
  67.    
  68.  
  69. ];              
  70.  
  71. </script>  
  72. 复制代码 

 Html前台代码:

 
  1. View Code   
  2.  
  3. <div>  
  4.  
  5.         <table style="width: 100%;" border="1" cellpadding="0" cellspacing="0" class="TableStyle">  
  6.  
  7.             <thead>  
  8.  
  9.                 <tr>  
  10.  
  11.                     <td>  
  12.  
  13.                         序号  
  14.  
  15.                     </td>  
  16.  
  17.                     <td>  
  18.  
  19.                         费用类型  
  20.  
  21.                     </td>  
  22.  
  23.                     <td>  
  24.  
  25.                         预算额  
  26.  
  27.                     </td>  
  28.  
  29.                     <td>  
  30.  
  31.                         审批额  
  32.  
  33.                     </td>  
  34.  
  35.                     <td>  
  36.  
  37.                         差补(预算额)  
  38.  
  39.                     </td>  
  40.  
  41.                     <td style="width: 150px;">  
  42.  
  43.                         <a class="add">  
  44.  
  45.                             <img alt="增加" src="Image/add.png" style="border: 0px; width: 16px; height: 16px" />增加</a>&nbsp;&nbsp;  
  46.  
  47.                         <a class="delete" style="cursor: hand;">  
  48.  
  49.                             <img alt="删除" src="Image/delete.png" style="border: 0px; width: 16px; height: 16px" />删除</a>  
  50.  
  51.                     </td>  
  52.  
  53.                 </tr>  
  54.  
  55.             </thead>  
  56.  
  57.             <tbody>  
  58.  
  59.                 <asp:Literal ID="Literal1" runat="server"></asp:Literal>  
  60.  
  61.                 <tr fixed="true" xmlitem="total"><!—汇总列-à  
  62.  
  63.                     <td colspan="2" align="center" style="">  
  64.  
  65.                         合计:  
  66.  
  67.                     </td>  
  68.  
  69.                     <td>  
  70.  
  71.                         <input readonly='readonly' type="text" id="totalBudget" property='totalBudget' />  
  72.  
  73.                     </td>  
  74.  
  75.                     <td>  
  76.  
  77.                         <input readonly='readonly' type="text" id="totalReal" property='totalReal' />  
  78.  
  79.                     </td>  
  80.  
  81.                     <td>  
  82.  
  83.                         <input readonly='readonly' type="text" id="totalReduction" property='totalReduction' />  
  84.  
  85.                     </td>  
  86.  
  87.                     <td align="center">  
  88.  
  89.                     </td>  
  90.  
  91.                 </tr>  
  92.  
  93.             </tbody>  
  94.  
  95.         </table>  
  96.  
  97.     </div>  
  98.  
  99. <asp:HiddenField ID="HiddenField1" runat="server" />  
  100.  
  101.    
  102.  
  103. Jquery dynamicTable code:  
  104.  
  105. <script type="text/javascript">  
  106.  
  107.         $(function() {  
  108.  
  109.             var rowTemplate = "<tr >" +  
  110.  
  111.                     "<td style='text-align: center;'>" +  
  112.  
  113.                         "<label class='rownum' property='SortNum'>" +  
  114.  
  115.                       " </label>" +  
  116.  
  117.                     "</td>" +  
  118.  
  119.                     "<td>" +  
  120.  
  121.                         "<input property='FinanceType'   style=' width:200px;'/>" +  
  122.  
  123.                     "</td>" 
  124.  
  125.                     +  
  126.  
  127.                     "<td >" +  
  128.  
  129.                    "<input readonly='readonly' property='FinanceBudget'> " +  
  130.  
  131.                    " </td>" +  
  132.  
  133.          " <td>" +  
  134.  
  135.                      " <input type='text' class='number' property='FinanceReal' />" +  
  136.  
  137.                    " </td>" +  
  138.  
  139.                    " <td >" +  
  140.  
  141.                      " <input readonly='readonly' property='FinanceReduction'> " +  
  142.  
  143.                    " </td>" +  
  144.  
  145.                     "<td align='center' style='width:150px; text-align:center;'><a class='deleterow' style='cursor:hand;'>" +  
  146.  
  147.                                  "<img alt='删除' src='Image/delete.png' style='border: 0px; width: 16px; height: 16px' />删除</a></td>" +  
  148.  
  149.                 "</tr>";  
  150.  
  151.             //初始化原来页面ComboTree  
  152.  
  153.             var ctree = $(":[property='FinanceType']");  
  154.  
  155.             ctree.each(function() {  
  156.  
  157.                 $(this).combotree({ "onBeforeSelect"function(node) { if (node.id == -1) { return false; } }, "onChange"function(newvalue, oldvalue) {  
  158.  
  159.                     $(this).val(newvalue).trigger("change");  
  160.  
  161.                 }  
  162.  
  163.                 }).combotree("loadData", TreeSource.slice(0));  
  164.  
  165.    
  166.  
  167.             });  
  168.  
  169.             //  
  170.  
  171.             var tab = $("table").dynamicTable(  
  172.  
  173.                 {  
  174.  
  175.                     addTrigger: ".add",  
  176.  
  177.                     removeTrigger: [{ selector: ".delete", handler: "first" }, { selector: ".deleterow", handler: "current"}],  
  178.  
  179.                     rowTemplate: rowTemplate,  
  180.  
  181.                     addPosition: -1,  
  182.  
  183.                     DefaultRowCount: 3,  
  184.  
  185.                     Calculates: [{ selector: "#totalBudget"column"FinanceBudget", func: "sum" }, { selector: "#totalReal"column"FinanceReal", func: "sum" }, { selector: "#totalReduction"column"FinanceReduction", func: "sum"}],  
  186.  
  187.                     CalculatesColumn: [{ trigger: ["FinanceType""FinanceReal"], column'FinanceBudget', func: function(o, rowobj, $tr) {  
  188.  
  189.                         var v = parseFloat(rowobj.FinanceType);  
  190.  
  191.                         v = window.FiannceBudget[v];  
  192.  
  193.                         $(o).val(v);  
  194.  
  195.                         var $FinanceReal = $tr.find(":[property='FinanceReal']");  
  196.  
  197.                         var v1 = parseFloat($FinanceReal.val());  
  198.  
  199.                         if (!isNaN(v1)) {  
  200.  
  201.                             if (v1 > v) {  
  202.  
  203.                                 $FinanceReal.val(v);  
  204.  
  205.                                 v1 = v;  
  206.  
  207.                             }  
  208.  
  209.                         } else {  
  210.  
  211.                             $FinanceReal.val(0.00); //  
  212.  
  213.                             v1 = 0;  
  214.  
  215.                         }  
  216.  
  217.                         var b = (v - v1);  
  218.  
  219.                         if (isNaN(b))  
  220.  
  221.                             b = 0;  
  222.  
  223.                         $tr.find(":[property='FinanceReduction']").val(b.toString());  
  224.  
  225.                         $($tr).parent().parent().updateCalculates(); //更新计算  
  226.  
  227.                     }  
  228.  
  229. }]  
  230.  
  231.                     ,  
  232.  
  233.                         addRowed: function(arg) {  
  234.  
  235.                             var ctree = $(":[property='FinanceType']", arg);  
  236.  
  237.                             var $FinanceBudget = $(":[property='FinanceBudget']", arg);  
  238.  
  239.                             ctree.combotree({ "onBeforeSelect"function(node) { if (node.id == -1) { return false; } }, "onChange"function(newvalue, oldvalue) {  
  240.  
  241.                                 $FinanceBudget.val(window.FiannceBudget[newvalue]);  
  242.  
  243.                                 ctree.val(newvalue);  
  244.  
  245.                                 ctree.trigger("change.CalculatesColumn");  
  246.  
  247.                             }  
  248.  
  249.                             }).  
  250.  
  251.                                   combotree("loadData", TreeSource.slice(0));  
  252.  
  253.                         }  
  254.  
  255.                     });  
  256.  
  257.             $("#Button1").bind("click"function() {  
  258.  
  259.    
  260.  
  261.                 alert(tab.getSource({ saveSelector: "#HiddenField1" }));  
  262.  
  263.             })  
  264.  
  265.             $(".number").live("keyup"function() {  
  266.  
  267.                 this.value = this.value.replace(/[^-\d\.]/g, '');  
  268.  
  269.             }).live("keydown"function(e) {  
  270.  
  271.                 if (e.which == 189) {  
  272.  
  273.                     // $(this).val(-1 * parseFloat($(this).val())).trigger("change");  
  274.  
  275.                     e.stopPropagation();  
  276.  
  277.                     e.preventDefault();  
  278.  
  279.                 } else if (e.which == 190) {  
  280.  
  281.                     if ($(this).val().indexOf(".") != -1) {  
  282.  
  283.                         e.stopPropagation();  
  284.  
  285.                         e.preventDefault();  
  286.  
  287.                     }  
  288.  
  289.                 }  
  290.  
  291.             });  
  292.  
  293.         });  
  294.  
  295.     </script>  
  296. 复制代码 

在上一篇文章我的jQuery动态表格插件中有人问我如果在后台处理,数据,我所以在本次demo中特别利用dataset处理成为datatable:这里的处理时存在一个静态变量ds中。

 
  1. View Code   
  2.  
  3. public partial class dynamicTableDemo1 : System.Web.UI.Page  
  4.  
  5. {  
  6.  
  7.     private static System.Data.DataSet ds;  
  8.  
  9.     protected void Page_Load(object sender, EventArgs e)  
  10.  
  11.     {  
  12.  
  13.         if (IsPostBack)  
  14.  
  15.         {  
  16.  
  17.               
  18.  
  19.         }  
  20.  
  21.     }  
  22.  
  23.    
  24.  
  25.     protected void BindTable()  
  26.  
  27.     {  
  28.  
  29.         if (ds != null && ds.Tables["item"] != null)  
  30.  
  31.         {  
  32.  
  33.             List<string> list = new List<string>();  
  34.  
  35.             foreach (System.Data.DataRow item in ds.Tables["item"].Rows)  
  36.  
  37.             {  
  38.  
  39.                 list.Add(string.Format("<tr >" +  
  40.  
  41.                     "<td style='text-align: center;'>" +  
  42.  
  43.                         "<label class='rownum' property='SortNum'>" +  
  44.  
  45.                       " </label>" +  
  46.  
  47.                     "</td>" +  
  48.  
  49.                     "<td>" +  
  50.  
  51.                         "<input property='FinanceType'   style=' width:200px;' {0}/>" +  
  52.  
  53.                     "</td>" 
  54.  
  55.                     +  
  56.  
  57.                     "<td >" +  
  58.  
  59.                    "<input readonly='readonly' property='FinanceBudget' {1}> " +  
  60.  
  61.                    " </td>" +  
  62.  
  63.          " <td>" +  
  64.  
  65.                      " <input type='text' class='number' property='FinanceReal' value='{2}' />" +  
  66.  
  67.                    " </td>" +  
  68.  
  69.                    " <td >" +  
  70.  
  71.                      " <input readonly='readonly' property='FinanceReduction' value='{3}'> " +  
  72.  
  73.                    " </td>" +  
  74.  
  75.                     "<td align='center' style='width:150px; text-align:center;'><a class='deleterow' style='cursor:hand;'>" +  
  76.  
  77.                                  "<img alt='删除' src='Image/delete.png' style='border: 0px; width: 16px; height: 16px' />删除</a></td>" +  
  78.  
  79.                                  "</tr>", item["FinanceType"].ToString() == "" ? "" : "value='" + item["FinanceType"] + "'", item["FinanceBudget"].ToString() == "" ? "" : "value='" + item["FinanceBudget"] + "'", item["FinanceReal"], item["FinanceReduction"]));  
  80.  
  81.             }  
  82.  
  83.             Literal1.Text = string.Join("",list.ToArray());  
  84.  
  85.         }  
  86.  
  87.     }  
  88.  
  89.    
  90.  
  91.     protected void button1_click(object sender, EventArgs e)  
  92.  
  93.     {  
  94.  
  95.         var xml = HiddenField1.Value;  
  96.  
  97.         ds = new System.Data.DataSet();  
  98.  
  99.         ds.ReadXml(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)));  
  100.  
  101.         BindTable();  
  102.  
  103.     }  
  104.  
  105. }  
  106. 复制代码 

 

最后在上效果图:

后台数据源:

插件基本使用请参见:我的jQuery动态表格插件

本博客中其他jQuery资料:我jQuery系列之目录汇总

插件下载

搜集数据源xml

例如:customerFunction: { "age"function(o) { return o.val() + 1; } },这里定义property为age的取值方式为:其值+1。Jquery EasyUi的ComboTree那么我们可以定义为

customerFunction: { "type"function(o) { return $(o).combotree(getValue)} }.

5:默认行数, DefaultRowCount,在我们的处理中用户经常会要求你能不能初始化就给我们默认几行啊,我难得一个一个的点击增加。如果你也有这样的需求,那么这个属性就可以帮助你轻松的搞定了。

6:增加了xml搜集类型的节点名自定义,在我们的某些处理中为了,搜集某些固定行的数据,但是为对xml其他节点的区分,所以,在本次的版本中增加了一个xmlitem,如xmlitem="total"设置。这个需要时来自我的一个同事的动态行,以及还有动态增加列的需要处理中。

jQuery dynamicTable版本仍会随着用户的需求一步一步的更新。同时也希望大家提出你的宝贵意见,你认为还需要那些功能,或者是对于代码的重构等等。

下面来一个jQuery EasyUi ComboTree的的demo:一个资金预算审批的例子。

先定义费用类型,和combotree的本地数据源,实际中需要我们从后台输出的。

 
  1. View Code   
  2.  
  3. if ($.browser.msie) {  
  4.  
  5.                 $(host).live("keydown"function(evt) {  
  6.  
  7.                     if (event.keyCode == 13) {  
  8.  
  9.                         event.keyCode = 9;//将键值13转化为9(tab);  
  10.  
  11.                     }  
  12.  
  13.                 });  
  14.  
  15.             }  
  16. 复制代码 







本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835106 ,如需转载请自行联系原作者

相关文章
|
JavaScript 前端开发 程序员
Datatables快速入门开发--一款好用的JQuery表格插件
  博主是一个java后端程序员,前端技术会用但不精通,做后台的一些功能经常要涉及表格的展示,分页,搜索,排序等等一系列功能,在经历了一段时间的原始手段,开始接触并使用Datatables,一个jquery表格插件,上手很快,重点是超级好用,有完善的中文文档,今天有空,整理一下Datatable的一些使用方法及注意事项,以便随时查阅.
2841 0
|
JavaScript 缓存 数据处理
上网搜了很多JQuery树型表格插件都不满意,决定自己写
效果图 第一次写简书好激动,就是想和大家分享下   O(∩_∩)O哈哈哈~ 干货来了~~~~~~~~~ 1.  首先是对数据的处理 接口返回的没有结构的数据,只有数据关系 这里要把这些没有结构的数据,进行树型结构处理,你们自己...
771 0
|
移动开发 JavaScript 前端开发
Dynatable – 基于 HTML5 & jQuery 的交互表格插件
  Dynatable 一款有趣的,语义化,交互式的表格插件,使用 jQuery,HTML5 和 JSON 实现。Dynatable 的目的是提供一种简单的、可扩展的 API,能够轻松的浏览和操作大规模的数据集。
1453 0
|
JavaScript
ParamQuery grid – 仿 MS Excel 和 Google Spreadsheet的jquery表格插件
ParamQuery网页表格是一个轻量级的jQuery插件,其灵感来自MS Excel和谷歌电子表格。它是基于jQueryUI 组件库 。它可以免费使用在任何商业或开源项目。 演示: http://paramquery.
1343 0