2012-04-12 9 views
91

Ich muss die ID klonen und fügen Sie dann eine Zahl nach wie ID1, ID2 usw. Jedes Mal, wenn Sie klonen Sie den Klon nach der letzten Nummer der ID setzen.Wie zu JQuery Klon() und ändern ID

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

Antwort

151

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

+1

+1 für Working Demo :) und Danke für die Suche über meine Antwort. Ich habe den Beitrag auch eine funktionierende Demo hinzugefügt http://jsfiddle.net/HGtmR/4/ –

+0

ist es auch möglich, eine Schaltfläche innerhalb der div, die die aktuelle ID div entfernt? – user1324780

+1

@ user1324780 Ja, es ist möglich, aber Sie sollten das als eine neue Frage veröffentlichen. Wie auch immer, der Schlüssel ist, das '.closes (div [id^= id])' und '.remove' div zu finden. –

39

Update: Wie Roko C.Bulijan darauf hingewiesen .. Sie benötigen .insertAfter verwenden, um es nach dem ausgewählten div einzufügen. Sehen Sie auch den aktualisierten Code, wenn Sie möchten, dass er an das Ende angehängt wird und nicht, wenn er mehrfach geklont wird. DEMO

Code:

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

Versuchen,

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

Wenn Sie einen automatischen Zähler wollen, dann unten sehen,

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

Sie haben eine großartige Gelegenheit verpasst, "id" + ++ id' in Ihrem Code zu verwenden. – Blazemonger

+0

Können Sie bitte eine funktionierende Demo zur Verfügung stellen? http://jsfiddle.net/HGtmR/ –

+0

@ RokoC.Buljan Sie haben Recht, aber die Frage war, wie man den Attr des geklonten Elements ändern und so habe ich verpasst, das '.after' zu bemerken. Siehe aktualisierte Antwort. –

3

Ich habe eine allgemeine Lösung geschaffen. Die folgende Funktion ändert die IDs und Namen von geklonten Objekten. In den meisten Fällen benötigen Sie die Zeilennummer. Fügen Sie einfach das Attribut "Daten-Zeilen-ID" zum Objekt hinzu.

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