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

      在上篇我的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. 复制代码