¿Cómo jQuery clone () y cambiar id?

127

Necesito clonar el id y luego añadir un número después de que como tal id1, id2etc. Cada vez que se golpea el clon se pone el clon después de que el último número de la ID.

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

Respuestas:

210

$('#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>


Elementos revueltos, recupere la ID más alta

Supongamos que tiene muchos elementos con ID como klon--5pero codificados (no en orden). Aquí no podemos buscar :lasto :first, por lo tanto, necesitamos un mecanismo para recuperar la ID más alta:

const $all = $('[id^="klon--"]');
const maxID = Math.max.apply(Math, $all.map((i, el) => +el.id.match(/\d+$/g)[0]).get());
const nextId = maxID + 1;

console.log(`New ID is: ${nextId}`);
<div id="klon--12">12</div>
<div id="klon--34">34</div>
<div id="klon--8">8</div>

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

Roko C. Buljan
fuente
2
+1 para la demostración de trabajo :) y gracias por revisar mi respuesta. He actualizado la publicación también agregué una demostración de trabajo jsfiddle.net/HGtmR/4
Selvakumar Arumugam
¿también es posible tener un botón dentro del div que elimine el div de identificación actual?
user1324780
1
@ user1324780 Sí, es posible, pero debe publicarlo como una nueva pregunta. De todos modos, la pista es encontrar el .closest(div[id^=id])y .removeese div.
Selvakumar Arumugam
1
Se ajusta perfectamente a mi necesidad. ¡Me ahorró horas de desarrollo muy probablemente! gracias
Nicolas Manzini
43

Actualización: como señaló Roko C.Bulijan ... debe usar .insertAfter para insertarlo después del div seleccionado. También vea el código actualizado si desea agregarlo al final en lugar de comenzar cuando se clona varias veces. MANIFESTACIÓN

Código:

   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
   }); 

Tratar,

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

Si desea un contador automático, vea a continuación,

   var cloneCount = 1;
   $("button").click(function(){
      $("#id").clone().attr('id', 'id'+ cloneCount++).insertAfter("#id");
   }); 
Selvakumar Arumugam
fuente
18
Perdiste una gran oportunidad de usar 'id'+ ++ iden tu código.
Blazemonger
@ RokoC.Buljan Tienes razón, pero la pregunta era cómo cambiar el atributo del elemento clonado, así que no noté el .after. Ver respuesta actualizada.
Selvakumar Arumugam
:) +1 para redondearlo a 5! ;) buen uso de [id^=id]:lastFelicidades.
Roko C. Buljan
¿Se puede aplicar esto a los nombres también?
Optiq
5

Esta es la solución más simple que funciona para mí.

$('#your_modal_id').clone().prop("id", "new_modal_id").appendTo("target_container");
Hassan Mehmood
fuente
2

He creado una solución generalizada. La siguiente función cambiará los identificadores y los nombres de los objetos clonados. En la mayoría de los casos, necesitará el número de fila, así que simplemente agregue el atributo "data-row-id" al objeto.

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;
}
Piyush Balapure
fuente
2

Esto tambien funciona

 var i = 1;
 $('button').click(function() {
     $('#red').clone().appendTo('#test').prop('id', 'red' + i);
     i++; 
 });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<div id="test">
  <button>Clone</button>
  <div class="red" id="red">
  </div>
</div>

<style>
  .red {
    width:20px;
    height:20px;
    background-color: red;
    margin: 10px;
  }
</style>

agxhdf
fuente
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>
Hezal M. Tank
fuente