How to jQuery clone() and change id?

2019-01-01 07:15发布

问题:

I need to clone the id and then add a number after it like so id1, id2, etc. Everytime you hit clone you put the clone after the latest number of the id.

$(\"button\").click(function() {
    $(\"#id\").clone().after(\"#id\");
}); 

回答1:

$(\'#cloneDiv\').click(function(){


  // get the last DIV which ID starts with ^= \"klon\"
  var $div = $(\'div[id^=\"klon\"]:last\');

  // Read the Number from that DIV\'s ID (i.e: 3 from \"klon3\")
  // And increment that number by 1
  var num = parseInt( $div.prop(\"id\").match(/\\d+/g), 10 ) +1;

  // Clone it and assign the new ID (i.e: from num 4 to ID \"klon4\")
  var $klon = $div.clone().prop(\'id\', \'klon\'+num );

  // Finally insert $klon wherever you want
  $div.after( $klon.text(\'klon\'+num) );

});
<script src=\"https://code.jquery.com/jquery-3.1.0.js\"></script>

<button id=\"cloneDiv\">CLICK TO CLONE</button> 

<div id=\"klon1\">klon1</div>
<div id=\"klon2\">klon2</div>



回答2:

Update: As Roko C.Bulijan pointed out.. you need to use .insertAfter to insert it after the selected div. Also see updated code if you want it appended to the end instead of beginning when cloned multiple times. DEMO

Code:

   var cloneCount = 1;;
   $(\"button\").click(function(){
      $(\'#id\')
          .clone()
          .attr(\'id\', \'id\'+ cloneCount++)
          .insertAfter(\'[id^=id]:last\') 
           //            ^-- Use \'#id\' if you want to insert the cloned 
           //                element in the beginning
          .text(\'Cloned \' + (cloneCount-1)); //<--For DEMO
   }); 

Try,

$(\"#id\").clone().attr(\'id\', \'id1\').after(\"#id\");

If you want a automatic counter, then see below,

   var cloneCount = 1;
   $(\"button\").click(function(){
      $(\"#id\").clone().attr(\'id\', \'id\'+ cloneCount++).insertAfter(\"#id\");
   }); 


回答3:

I have created a generalised solution. The function below will change ids and names of cloned object. In most cases, you will need the row number so Just add \"data-row-id\" attribute to the object.

function renameCloneIdsAndNames( objClone ) {

    if( !objClone.attr( \'data-row-id\' ) ) {
        console.error( \'Cloned object must have \\\'data-row-id\\\' attribute.\' );
    }

    if( objClone.attr( \'id\' ) ) {
        objClone.attr( \'id\', objClone.attr( \'id\' ).replace( /\\d+$/, function( strId ) { return parseInt( strId ) + 1; } ) );
    }

    objClone.attr( \'data-row-id\', objClone.attr( \'data-row-id\' ).replace( /\\d+$/, function( strId ) { return parseInt( strId ) + 1; } ) );

    objClone.find( \'[id]\' ).each( function() {

        var strNewId = $( this ).attr( \'id\' ).replace( /\\d+$/, function( strId ) { return parseInt( strId ) + 1; } );

        $( this ).attr( \'id\', strNewId );

        if( $( this ).attr( \'name\' ) ) {
            var strNewName  = $( this ).attr( \'name\' ).replace( /\\[\\d+\\]/g, function( strName ) {
                strName = strName.replace( /[\\[\\]\']+/g, \'\' );
                var intNumber = parseInt( strName ) + 1;
                return \'[\' + intNumber + \']\'
            } );
            $( this ).attr( \'name\', strNewName );
        }
    });

    return objClone;
}


标签: jquery clone