Come clonare jQuery () e cambiare id?


127

Ho bisogno di clonare l'id e quindi aggiungere un numero dopo che in questo modo id1, id2e così via Ogni volta che si preme il clone si mette il clone dopo l'ultimo numero della id.

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

Risposte:


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>


Elementi criptati, recupera ID più alto

Supponi di avere molti elementi con ID simili klon--5ma criptati (non in ordine). Qui non possiamo cercare :lasto :first, quindi, abbiamo bisogno di un meccanismo per recuperare l'ID più alto:

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>


2
+1 per la demo di lavoro :) e grazie per aver esaminato la mia risposta. Ho aggiornato il post anche aggiunto una demo funzionante jsfiddle.net/HGtmR/4
Selvakumar Arumugam

è anche possibile avere un pulsante all'interno del div che rimuove l'attuale div id?
user1324780,

1
@ user1324780 Sì, è possibile, ma è necessario pubblicarlo come nuova domanda. Comunque l'indizio è trovare il div .closest(div[id^=id])e .removequello.
Selvakumar Arumugam,

1
si adatta perfettamente alle mie necessità. Mi ha risparmiato molto probabilmente ore di sviluppo! grazie
Nicolas Manzini il

43

Aggiornamento: Come ha sottolineato Roko C.Bulijan .. devi usare .insertAfter per inserirlo dopo il div selezionato. Vedi anche il codice aggiornato se vuoi che venga aggiunto alla fine anziché iniziare quando viene clonato più volte. DEMO

Codice:

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

Provare,

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

Se vuoi un contatore automatico, vedi sotto,

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

18
Hai perso una grande opportunità da utilizzare 'id'+ ++ idnel tuo codice.
Blazemonger,

@ RokoC.Buljan Hai ragione, ma la domanda era come cambiare l'attrazione dell'elemento clonato e così mi sono perso di notare .after. Vedi la risposta aggiornata.
Selvakumar Arumugam,

:) +1 per arrotondare a 5! ;) buon uso di [id^=id]:lastcomplimenti.
Roko C. Buljan,

questo può essere applicato anche ai nomi?
Optiq,

5

Questa è la soluzione più semplice che funziona per me.

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

2

Ho creato una soluzione generalizzata. La funzione seguente cambierà ID e nomi dell'oggetto clonato. Nella maggior parte dei casi, avrai bisogno del numero di riga, quindi aggiungi l'attributo "data-id-riga" all'oggetto.

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

2

Anche questo funziona

 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>


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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.