Jak sklonować () jQuery i zmienić id?

127

Muszę sklonować identyfikator, a następnie dodać numer po to podoba tak id1, id2itp Everytime trafisz klon umieścić klona po najnowszym numerze id.

$("button").click(function() {
    $("#id").clone().after("#id");
}); 
user1324780
źródło

Odpowiedzi:

211

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


Zaszyfrowane elementy, odzyskaj najwyższy identyfikator

Załóżmy, że masz wiele elementów z identyfikatorami takimi jak, klon--5ale pomieszane (nie w kolejności). Tutaj nie możemy iść :lastlub :firstdlatego potrzebujemy mechanizmu do pobrania najwyższego ID:

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
źródło
2
+1 za działające demo :) i dzięki za przejrzenie mojej odpowiedzi. Zaktualizowałem post, dodałem również działające demo jsfiddle.net/HGtmR/4
Selvakumar Arumugam
czy możliwe jest również umieszczenie przycisku wewnątrz elementu div, który usuwa bieżący identyfikator div?
user1324780
1
@ user1324780 Tak, jest to możliwe, ale powinieneś zadać to jako nowe pytanie. W każdym razie wskazówką jest znalezienie .closest(div[id^=id])i .removetego div.
Selvakumar Arumugam
1
idealnie pasują do moich potrzeb. Najprawdopodobniej zaoszczędziło mi to godzin pracy! dzięki
Nicolas Manzini
43

Aktualizacja: Jak zauważył Roko C.Bulijan ... musisz użyć .insertAfter, aby wstawić go po wybranym div. Zobacz także zaktualizowany kod, jeśli chcesz, aby był dołączony na końcu zamiast zaczynać po wielokrotnym klonowaniu. PRÓBNY

Kod:

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

Próbować,

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

Jeśli chcesz mieć automatyczny licznik, zobacz poniżej,

   var cloneCount = 1;
   $("button").click(function(){
      $("#id").clone().attr('id', 'id'+ cloneCount++).insertAfter("#id");
   }); 
Selvakumar Arumugam
źródło
18
Przegapiłeś świetną okazję do wykorzystania 'id'+ ++ idw swoim kodzie.
Blazemonger
@ RokoC.Buljan Masz rację, ale pytanie brzmiało, jak zmienić atr sklonowanego elementu, więc nie zauważyłem .after. Zobacz zaktualizowaną odpowiedź.
Selvakumar Arumugam
:) +1, aby zaokrąglić do 5! ;) niezłe wykorzystanie [id^=id]:lastCongrats.
Roko C. Buljan
czy można to również zastosować do imion?
Optiq
5

To najprostsze rozwiązanie, które działa dla mnie.

$('#your_modal_id').clone().prop("id", "new_modal_id").appendTo("target_container");
Hassan Mehmood
źródło
2

Stworzyłem uogólnione rozwiązanie. Poniższa funkcja zmieni identyfikatory i nazwy sklonowanego obiektu. W większości przypadków będziesz potrzebować numeru wiersza, więc po prostu dodaj atrybut „data-row-id” do obiektu.

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
źródło
2

To też działa

 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
źródło
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
źródło