Bagaimana cara jQuery clone () dan mengubah id?

127

Saya perlu untuk mengkloning id dan kemudian menambahkan nomor setelah suka begitu id1, id2, dll Setiap kali anda menekan clone Anda meletakkan clone setelah jumlah terbaru dari id.

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

Jawaban:

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>


Elemen acak, dapatkan ID tertinggi

Katakanlah Anda memiliki banyak elemen dengan ID seperti klon--5tetapi diacak (tidak berurutan). Di sini kita tidak bisa mencari :lastatau :first, oleh karena itu kita membutuhkan mekanisme untuk mengambil ID tertinggi:

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
sumber
2
1 untuk demo Kerja :) dan Terima kasih telah melihat jawaban saya. Saya telah memperbarui posting juga menambahkan demo kerja jsfiddle.net/HGtmR/4
Selvakumar Arumugam
apakah juga mungkin untuk memiliki tombol di dalam div yang menghapus div id saat ini?
pengguna1324780
1
@ user1324780 Ya itu mungkin, tetapi Anda harus mempostingnya sebagai pertanyaan baru. Bagaimanapun, petunjuknya adalah menemukan div .closest(div[id^=id])dan .removediv itu.
Selvakumar Arumugam
1
sangat sesuai dengan kebutuhan saya. Kemungkinan besar itu menghemat berjam-jam pengembangan! terima kasih
Nicolas Manzini
43

Pembaruan: Seperti yang ditunjukkan Roko C.Bulijan .. Anda perlu menggunakan .insertAfter untuk memasukkannya setelah div yang dipilih. Juga lihat kode yang diperbarui jika Anda ingin ditambahkan ke bagian akhir alih-alih dimulai saat dikloning beberapa kali. DEMO

Kode:

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

Mencoba,

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

Jika Anda menginginkan penghitung otomatis, lihat di bawah,

   var cloneCount = 1;
   $("button").click(function(){
      $("#id").clone().attr('id', 'id'+ cloneCount++).insertAfter("#id");
   }); 
Selvakumar Arumugam
sumber
18
Anda melewatkan kesempatan besar untuk menggunakan 'id'+ ++ idkode Anda.
Blazemonger
@ RokoC.Buljan Anda benar, tetapi pertanyaannya adalah bagaimana mengubah attr dari elemen kloning sehingga saya melewatkan untuk memperhatikan .after. Lihat jawaban yang diperbarui.
Selvakumar Arumugam
:) +1 untuk membulatkannya menjadi 5! ;) penggunaan [id^=id]:lastSelamat yang bagus.
Roko C. Buljan
bisakah ini diterapkan pada nama juga?
Optiq
5

Ini adalah solusi paling sederhana yang berhasil untuk saya.

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

Saya telah membuat solusi umum. Fungsi di bawah ini akan mengubah id dan nama objek kloning. Dalam kebanyakan kasus, Anda akan membutuhkan nomor baris jadi cukup tambahkan atribut "data-row-id" ke objek.

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
sumber
2

Ini juga berhasil

 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
sumber
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
sumber