Comment cloner jQuery () et changer l'ID?

127

Je dois cloner l'identifiant, puis ajouter un numéro après comme si id1, id2etc. Chaque fois que vous vous frappez clone mettez le clone après le dernier numéro de l'identifiant.

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

Réponses:

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>


Éléments brouillés, récupérez l'ID le plus élevé

Supposons que vous ayez de nombreux éléments avec des identifiants similaires klon--5mais brouillés (pas dans l'ordre). Ici, nous ne pouvons pas y aller :lastou :first, par conséquent, nous avons besoin d'un mécanisme pour récupérer l'ID le plus élevé:

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
la source
2
+1 pour la démo de travail :) et merci d'avoir regardé ma réponse. J'ai mis à jour le message et ajouté une démo de travail jsfiddle.net/HGtmR/4
Selvakumar Arumugam
est-il également possible d'avoir un bouton à l'intérieur du div qui supprime le div id actuel?
user1324780
1
@ user1324780 Oui, c'est possible, mais vous devriez publier cela comme une nouvelle question. Quoi qu'il en soit, l'indice est de trouver le .closest(div[id^=id])et .removece div.
Selvakumar Arumugam
1
correspond parfaitement à mon besoin. Cela m'a probablement sauvé des heures de développement! merci
Nicolas Manzini
43

Mise à jour: Comme l'a souligné Roko C.Bulijan .. vous devez utiliser .insertAfter pour l'insérer après le div sélectionné. Consultez également le code mis à jour si vous souhaitez qu'il soit ajouté à la fin au lieu de commencer lorsqu'il est cloné plusieurs fois. 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
   }); 

Essayer,

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

Si vous voulez un compteur automatique, voyez ci-dessous,

   var cloneCount = 1;
   $("button").click(function(){
      $("#id").clone().attr('id', 'id'+ cloneCount++).insertAfter("#id");
   }); 
Selvakumar Arumugam
la source
18
Vous avez manqué une excellente opportunité à utiliser 'id'+ ++ iddans votre code.
Blazemonger
@ RokoC.Buljan Vous avez raison, mais la question était de savoir comment changer l'attr de l'élément cloné et j'ai donc manqué de remarquer le .after. Voir la réponse mise à jour.
Selvakumar Arumugam
:) +1 pour l'arrondir à 5! ;) belle utilisation de [id^=id]:lastFélicitations.
Roko C. Buljan
cela peut-il s'appliquer également aux noms?
Optiq
5

C'est la solution la plus simple qui fonctionne pour moi.

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

J'ai créé une solution généralisée. La fonction ci-dessous changera les identifiants et les noms des objets clonés. Dans la plupart des cas, vous aurez besoin du numéro de ligne, donc ajoutez simplement l'attribut "data-row-id" à l'objet.

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
la source
2

Cela fonctionne aussi

 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
la source
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>
Débardeur Hezal M.
la source