Làm cách nào để jQuery clone () và thay đổi id?


127

Tôi cần phải sao chép các id và sau đó thêm một số sau khi nó thích quá id1, id2vv Mỗi lần bạn nhấn bản sao bạn đặt các bản sao sau số mới nhất của id.

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

Câu trả lời:


209

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


Các yếu tố được xáo trộn, lấy ID cao nhất

Giả sử bạn có nhiều yếu tố với ID thích klon--5nhưng được xáo trộn (không theo thứ tự). Ở đây chúng tôi không thể đi :lasthoặc :firstdo đó chúng tôi cần một cơ chế để lấy ID cao nhất:

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 cho bản demo làm việc :) và Cảm ơn đã xem qua câu trả lời của tôi. Tôi đã cập nhật bài viết cũng đã thêm một bản demo hoạt động jsfiddle.net/HGtmR/4
Selvakumar Arumugam

cũng có thể có một nút bên trong div loại bỏ div id hiện tại?
user1324780

1
@ user1324780 Có, nhưng bạn nên đăng nó dưới dạng câu hỏi mới. Dù sao đầu mối là để tìm .closest(div[id^=id]).removediv đó.
Selvakumar Arumugam

1
hoàn toàn phù hợp với nhu cầu của tôi Nó giúp tôi tiết kiệm nhiều giờ phát triển nhất! cảm ơn
Nicolas Manzini

43

Cập nhật: Như Roko C.Bulijan đã chỉ ra .. bạn cần sử dụng .insertSau đó để chèn nó sau div đã chọn. Cũng xem mã được cập nhật nếu bạn muốn nó được nối vào cuối thay vì bắt đầu khi được nhân bản nhiều lần. BẢN GIỚI THIỆU

Mã số:

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

Thử,

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

Nếu bạn muốn một bộ đếm tự động, hãy xem bên dưới,

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

18
Bạn đã bỏ lỡ một cơ hội tuyệt vời để sử dụng 'id'+ ++ idtrong mã của bạn.
Blazemonger

@ RokoC.Buljan Bạn đã đúng, nhưng câu hỏi là làm thế nào để thay đổi attr của yếu tố nhân bản và vì vậy tôi đã bỏ lỡ để thông báo .after. Xem câu trả lời cập nhật.
Selvakumar Arumugam

:) +1 để làm tròn thành 5! ;) sử dụng tốt đẹp của [id^=id]:lastChúc mừng.
Roko C. Buljan

điều này có thể được áp dụng cho tên là tốt?
Optiq

5

Đây là giải pháp đơn giản nhất làm việc cho tôi.

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

2

Tôi đã tạo ra một giải pháp tổng quát. Hàm bên dưới sẽ thay đổi id và tên của đối tượng nhân bản. Trong hầu hết các trường hợp, bạn sẽ cần số hàng vì vậy Chỉ cần thêm thuộc tính "data-row-id" vào đối tượng.

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

Cái này cũng hoạt động

 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.