jQuery clone form增加name,class,id,data-id ..etc的所有属性

时间:2015-12-08 19:16:46

标签: javascript jquery forms function clone

我们的表单包含多个字段,我们需要通过jQuery

  • 克隆字段时需要增加其名称,类,ID,数据ID和标签。

如何增加这些ID

块后顺序-1-选择

或者像这样的名字

名=" xform_demo [块后顺序-1]

您可以查看此表单代码 在codepen http://codepen.io/earngate/pen/NxPOZz/

HTML

    <table id="section-table-section-start1" data-id="section-start1" class="form-table form-table-section no-border form-table-section-indented">
    <tr>
    <th scope="row">
    <div class="xform_field_th">
    Block</div>
    </th>
    <td>
    <fieldset id="xform_demo-switch-fold-1" class=" xform-container-switch" data-id="switch-fold-1" data-type="switch">
    <div class="switch-options">
    <label class="cb-enable selected" data-id="switch-fold-1"><span>On</span></label>
    <label class="cb-disable" data-id="switch-fold-1"><span>Off</span></label>
    <input class="checkbox checkbox-input" id="switch-fold-1" name="xform_demo[switch-fold-1]" value="1" type="hidden"></div>
    </fieldset></td>
    </tr>
    <tr class="fold">
    <th scope="row">
    <div class="xform_field_th">
    Text logo</div>
    </th>
    <td>
    <fieldset id="xform_demo-block-cat-title-1" class="xform-container-text " data-id="block-cat-title-1" data-type="text">
    <input id="block-cat-title-1" name="xform_demo[block-cat-title-1]" value class="regular-text " type="text" size="20"></fieldset></td>
    </tr>
    <tr class="fold">
    <th scope="row">
    <div class="xform_field_th">
    </div>
    </th>
    <td>
    <fieldset id="xform_demo-block-post-order-1" class=" xform-container-select" data-id="block-post-order-1" data-type="select">
    <div style="width: 40%;" id="s2id_block-post-order-1-select" class="select2-container xform-select-item select2-allowclear">
    <a href="javascript:void(0)" class="select2-choice" tabindex="-1">
    <span id="select2-chosen-2" class="select2-chosen">first-choise</span><abbr class="select2-search-choice-close"></abbr>
    <span class="select2-arrow" role="presentation"><b role="presentation">
    </b></span></a><label for="s2id_autogen2" class="select2-offscreen">
    </label>
    <input id="s2id_autogen2" aria-labelledby="select2-chosen-2" class="select2-focusser select2-offscreen" aria-haspopup="true" role="button" type="text" size="20">
    <div class="select2-drop select2-display-none select2-with-searchbox">
    <div class="select2-search">
    <label for="s2id_autogen2_search" class="select2-offscreen"></label>
    <input placeholder id="s2id_autogen2_search" aria-owns="select2-results-2" spellcheck="false" class="select2-input"  type="text" size="20">
    </div>
    <ul id="select2-results-2" class="select2-results" role="listbox">
    </ul>
    </div>
    </div>
    <select title tabindex="-1" id="block-post-order-1-select" name="xform_demo[block-post-order-1]" class="xform-select-item " style="width: 40%; display: none;" rows="6">
    <option></option>
    <option value="Desc" selected="selected">Lates</option>
    <option value="rand">Random Posts</option>
    </select></fieldset></td>
    </tr>
    <tr style="border-bottom: medium none;" class="compiler fold">
    <th scope="row">
    <div class="xform_field_th">
    Block Style</div>
    </th>
    <td>
    <fieldset id="xform_demo-block_type_1" class=" xform-container-image_select" data-id="block_type_1" data-type="image_select">
    <div class="xform-table-container">
    <ul class="xform-image-select">
    <li class="xform-image-select">
    <label class=" xform-image-select-selected xform-image-select block_type_1_1" for="block_type_1_1">
    <input class=" compiler noUpdate " id="block_type_1_1" name="xform_demo[block_type_1]" value="node" checked="checked" type="radio"><img src="1-3.png" alt="node" class style=" width: 100%; "></label></li>
    <li class="xform-image-select">
    <label class=" xform-image-select block_type_1_2" for="block_type_1_2">
    <input class=" compiler noUpdate  noUpdate " id="block_type_1_2" name="xform_demo[block_type_1]" value="nodey" type="radio"><img src="1-4.png" alt="nodey" class style=" width: 100%; "></label></li>
    </ul>
    </div>
    </fieldset></td>
    </tr>
    <tr style="display: none;" class="xform-section-indent-start">
    <th scope="row"></th>
    <td></td>
    </tr>
    </table>

的jQuery

    $(document).ready(function () {
    $('table#section-table-section-start1').after('<input class="add_btn" id="add_btn" type="button" value="Add New">');

    $(".add_btn").click(function(e) {
    var avails = $(this).prevAll();
    var cnt = avails.length + 1;

    $('#section-table-section-start1:last').clone().insertAfter("#section-table-section-start1:last").append( $('<input class="del_btn"  type="button" value="Delete this">') );

    $("input.del_btn").css({"float":"right","background-color":"#c00","color":"#fff"});

    e.preventDefault();
    });

    $("body").on('click',".del_btn", function() {
    $(this).parent().remove();
    });

    });

你能帮忙吗

2 个答案:

答案 0 :(得分:4)

所以问题似乎是&#34;如何增加多个节点的多个属性中的数量。&#34; 我将其缩小到增加多个属性中的 last 整数,以保持简单。

您可以创建一个简单的函数来增加一个节点的一个属性的数量,然后针对您需要的元素和属性重复它:

/* Increase the last number for an attribute of an jQuery element, if possible */
function inc ( node, property ) { // .prop does not work with data-id so must use .attr
   var number = node.attr( property ) ? node.attr( property ).match( /\d+(?=\D*$)/ ) : null;
   if ( number === null ) return; // Abort if has no attribute or no number in it
   node.attr( property, node.attr( property ).replace( /\d+(?=\D*$)/, +number[0]+1 ) );
}

var last = $('[id^=section-table-section-start]:last'), cloned = last.clone();

// For each element with any attribute we need, including the cloned table
cloned.find( '[name],[class],[id],[data-id],[for]' ).add( cloned ).each( function(){
   var me = $( this );
   // Loop and increment each property
   $.each( [ 'name', 'className', 'id', 'data-id', 'for' ], function( i, property ) { 
      inc( me, property );
   });
});

有几种方法可以进行循环。

  • 这里我们抓住所有元素并循环每个元素。
  • 如果属性较少,则可以为每个属性而不是inc手动调用$.each
  • 或者你可以先循环每个属性并找到元素,这样你就可以创建更多的jQ对象但是检查更少的属性。

您可能还注意到我更改了您的克隆代码,因为使用自动增加ID时,您无法再通过ID选择最后一个表。

以下是完整代码:

&#13;
&#13;
$( function () {
   function inc ( element, property ) {
      var number = element.attr( property ) ? element.attr( property ).match( /\d+(?=\D*$)/ ) : null;
      if ( number === null ) return;
      element.attr( property, element.attr( property ).replace( /\d+(?=\D*$)/, +number[0]+1 ) );
   }

   $('table#section-table-section-start1').after('<input class="add_btn" id="add_btn" type="button" value="Add New">');

   $(".add_btn").click(function(e) {
      var last = $('[id^=section-table-section-start]:last'), cloned = last.clone();
      cloned.find( '[name],[class],[id],[data-id],[for]' ).add( cloned ).each( function(){
         var me = $( this );
         $.each( [ 'name', 'className', 'id', 'data-id', 'for' ], function( i, property ) {
            inc( me, property );
         });
      });
      cloned.insertAfter( last );
      if ( ! cloned.find( '.del_btn' ).length ) {
         cloned.append( 
            $( '<input class="del_btn"  type="button" value="Delete this">' )
               .css({"float":"right","background-color":"#c00","color":"#fff"})
         );
      }
      e.preventDefault();
   });

   $("body").on('click',".del_btn", function() { $(this).parent().remove(); });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<table id="section-table-section-start1" data-id="section-start1" class="form-table form-table-section no-border form-table-section-indented">
   <tr>
      <th scope="row">
         <div class="xform_field_th">
            Block</div>
      </th>
      <td>
         <fieldset id="xform_demo-switch-fold-1" class=" xform-container-switch" data-id="switch-fold-1" data-type="switch">
            <div class="switch-options">
               <label class="cb-enable selected" data-id="switch-fold-1">
                  <span>On</span>
               </label>
               <label class="cb-disable" data-id="switch-fold-1">
                  <span>Off</span>
               </label>
               <input class="checkbox checkbox-input" id="switch-fold-1" name="xform_demo[switch-fold-1]" value="1" type="hidden"/>
            </div>
         </fieldset>
      </td>
   </tr>
   <tr class="fold">
      <th scope="row">
         <div class="xform_field_th">
            Text logo</div>
      </th>
      <td>
         <fieldset id="xform_demo-block-cat-title-1" class="xform-container-text " data-id="block-cat-title-1" data-type="text">
            <input id="block-cat-title-1" name="xform_demo[block-cat-title-1]" value class="regular-text " type="text" size="20"/>
         </fieldset>
      </td>
   </tr>
   <tr class="fold">
      <th scope="row">
         <div class="xform_field_th">
         </div>
      </th>
      <td>
         <fieldset id="xform_demo-block-post-order-1" class=" xform-container-select" data-id="block-post-order-1" data-type="select">
            <div style="width: 40%;" id="s2id_block-post-order-1-select" class="select2-container xform-select-item select2-allowclear">
               <a href="javascript:void(0)" class="select2-choice" tabindex="-1">
                  <span id="select2-chosen-2" class="select2-chosen">first-choise</span>
                  <abbr class="select2-search-choice-close"/>
                  <span class="select2-arrow" role="presentation">
                     <b role="presentation">
                     </b>
                  </span>
               </a>
               <label for="s2id_autogen2" class="select2-offscreen">
               </label>
               <input id="s2id_autogen2" aria-labelledby="select2-chosen-2" class="select2-focusser select2-offscreen" aria-haspopup="true" role="button" type="text" size="20"/>
               <div class="select2-drop select2-display-none select2-with-searchbox">
                  <div class="select2-search">
                     <label for="s2id_autogen2_search" class="select2-offscreen"/>
                     <input placeholder id="s2id_autogen2_search" aria-owns="select2-results-2" spellcheck="false" class="select2-input"  type="text" size="20"/>
                  </div>
                  <ul id="select2-results-2" class="select2-results" role="listbox">
                  </ul>
               </div>
            </div>
            <select title tabindex="-1" id="block-post-order-1-select" name="xform_demo[block-post-order-1]" class="xform-select-item " style="width: 40%; display: none;" rows="6">
               <option/>
               <option value="Desc" selected="selected">Lates</option>
               <option value="rand">Random Posts</option>
            </select>
         </fieldset>
      </td>
   </tr>
   <tr style="border-bottom: medium none;" class="compiler fold">
      <th scope="row">
         <div class="xform_field_th">
                        Block Style</div>
      </th>
      <td>
         <fieldset id="xform_demo-block_type_1" class=" xform-container-image_select" data-id="block_type_1" data-type="image_select">
            <div class="xform-table-container">
               <ul class="xform-image-select">
                  <li class="xform-image-select">
                     <label class=" xform-image-select-selected xform-image-select block_type_1_1" for="block_type_1_1">
                        <input class=" compiler noUpdate " id="block_type_1_1" name="xform_demo[block_type_1]" value="node" checked="checked" type="radio"/>
                        <img src="1-3.png" alt="node" class style=" width: 100%; "/>
                     </label>
                  </li>
                  <li class="xform-image-select">
                     <label class=" xform-image-select block_type_1_2" for="block_type_1_2">
                        <input class=" compiler noUpdate  noUpdate " id="block_type_1_2" name="xform_demo[block_type_1]" value="nodey" type="radio"/>
                        <img src="1-4.png" alt="nodey" class style=" width: 100%; "/>
                     </label>
                  </li>
               </ul>
            </div>
         </fieldset>
      </td>
   </tr>
   <tr style="display: none;" class="xform-section-indent-start">
      <th scope="row"/>
      <td/>
   </tr>
</table>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

在谈到可能的解决方案之前,我会试着解释一下,以确认我对问题陈述的理解是正确的......

  1. 您有一些HTML将被克隆以附加到容器上
  2. 按钮将触发追加
  3. 克隆HTML上的多个属性中的计数器必须递增
  4. OP和我建议的解决方案都没有考虑其他常见情况:

    1. 删除元素时必须发生的事情:
      • 计算器会重新计算吗?
      • 是否允许计数器中的空白?
      • 等...
    2. 无论如何,现在谈论解决方案,我不会使用OP中给出的代码。相反,我会提供一般方法,并将实际实施留作家庭作业:

      <强> HTML:

      <!-- Container which will hold your elements -->
      <div class="container">
          <!-- Original element, this block will be duplicated -->
          <div class="element">
              <input id="input1id" class="input1class" name="input1name" />
          </div>
      </div>
      <button type="button" id="trigger">Append Copy</button>
      

      <强> jQuery的:

          $(document).ready(function(){
              // HTML to copy. Used an uncommon string (@@) as place holder for actual counter
              var elementCopy = '<div class="element">'+
      '       <input id="input@@id" class="input@@class" name="input@@name" />'+
      '   </div>';
      
              $('#trigger').on('click', function() {
                  var count = $('.element').length;   // number of elements with class "element"
                  var counter = count + 1;    // Counter to use for new element(s)
                  var clone = elementCopy.replace(/\@\@/g, counter);      // Substitute counter for all @@ in elementCopy; note the 'g' switch (global) in regex
                  $('.container').append(clone);  // Finally append new HTML
              })
          });
      

      检查this fiddle