当前位置:编程学习 > JAVA >>

利用 jQuery Clone 复制行

最近客串了一把前端,有行复制的功能用 jQuery 来实现了。感觉比以前原生js用 CreateElement 要简单多了,但还是遇到了一些陷阱比如IE7的bug,这里记录下来。先看看 table 的样子:这里3行是一组,按下"Copy"连值复制,按下"Add"只增加行不复制值。calendar 使用的是 jQuery UI 里的 datepicker
下图只是一个简单的demo,没有复杂的样式表:

\

为了灵活对应不同的表格,提取了一个共通的 js 来处理,作为使用前提:
1. table 必须有 id;
2. 有 id 的 tr 才会被复制;(tr的id从1开始编号)
3. table 内所有id都必须以 xxx_n 编号


[javascript] function RowCopyUtility(opts) { 
  // 表格Id  
  this.tableId = opts.tableId; 
  // 分组内有多少行  
  this.rowGroupNumber = opts.rowGroupNumber; 
  // 一组内Button对应的方法Map(key=Button value, value=对应方法名)  
  // 所有方法都应以 function (idx) 方式调用  
  this.buttonHandlers = opts.buttonHandlers; 
   
  this._countForRowsGroup = -1; 
  this._keyForRow = -1; 
 
  this.getTargetRowGroup = function(groupIdx) { 
 
    var rows = []; 
    if (groupIdx > 0) { 
      for(var i=1; i<this.rowGroupNumber+1; i++) { 
        rows[i-1] = $("#row" + i + "_" + groupIdx); 
      } 
    } else { 
      for(var i=0; i<this.rowGroupNumber; i++) { 
        rows[i] = $("#" + this.tableId + " tr[id]").eq(i); 
      } 
    } 
    return rows; 
  }; 
 
  this.addRow = function (groupIdx, needCopyValue) { 
 
    if (this._countForRowsGroup == -1) { 
      this._countForRowsGroup = ($("#" + this.tableId + " tr[id]").length - 1)/this.rowGroupNumber; 
      this._keyForRow =  parseInt($("#" + this.tableId + " tr[id]:not(#row_add):last").attr("id").split("_")[1]) + 1; 
    } 
 
    if (groupIdx == 0) { 
      var firstRow = $("#" + this.tableId + " tr[id]:first"); 
      var currentIdx = firstRow.attr("id").split("_")[1]; 
      groupIdx = currentIdx; 
    } 
 
    var regForId = new RegExp("^(\\w+_)" + groupIdx + "$"); 
    var regForName = new RegExp("^(\\w+_)" + groupIdx + "$"); 
    var regForRadioId = new RegExp("^(\\w+_)" + groupIdx + "(.*)$"); 
 
    var targetRows = this.getTargetRowGroup(groupIdx); 
 
    // 重要:注意闭包参数的作用域  
    var idx = this._keyForRow;  www.zzzyk.com
 
    for(var i=0; i<targetRows.length; i++) { 
      // clone target rows  
      var cloneRow = targetRows[i].clone(false); 
      var newRowId = cloneRow.attr("id").split("_")[0] + "_" + idx; 
      cloneRow.attr("id", newRowId); 
 
      var radios = []; 
      cloneRow.find("[id]").each(function() { 
          var id = $(this).attr("id"); 
          var oldId = id; 
          var name = $(this).attr("name"); 
          
          id = id.replace(regForId, "$1" + idx); 
          $(this).attr("id", id); 
          
          var newname = name.replace(regForName, "$1" + idx); 
          $(this).attr("name", newname); 
           
          if ($(this).hasClass("hasDatepicker")) { 
              $(this).removeClass("hasDatepicker"); 
          } 
          
          if ($(this).attr("type") == "checkbox") { 
              if($(this).next().attr("for") != "") { 
                  $(this).next().attr("for", id); 
              } 
              if (!needCopyValue) { 
                  $(this).attr("checked", ""); 
              } 
          } 
          else if ($(this).attr("type") == "radio") {            
              id = id.replace(regForRadioId, "$1" + idx); 
              $(this).attr("id", id); 
          
              var radio = new Object(); 
              radio.id = id; 
              radio.oldId = oldId; 
              radio.name = name; 
              radio.newname = newname; 
              // IE7's Bug  
              radio.checked = document.getElementById(oldId).checked; 
            &

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,