Est-il possible de cloner des objets élément html dans JavaScript / JQuery?

101

Je cherche des conseils pour résoudre mon problème.

J'ai un élément html (comme le champ de saisie de la boîte de sélection) dans une table. Maintenant, je veux copier l'objet et en générer un nouveau à partir de la copie, et cela avec JavaScript ou jQuery. Je pense que cela devrait fonctionner d'une manière ou d'une autre, mais je suis un peu désemparé pour le moment.

Quelque chose comme ça (pseudo code):

oldDdl = $("#ddl_1").get(); 

newDdl = oldDdl;

oldDdl.attr('id', newId);

oldDdl.html();
Richard
la source
3
stackoverflow.com/search?q=jquery+copy+element+content a un tas de questions connexes.
Felix Kling

Réponses:

60

En utilisant votre code, vous pouvez faire quelque chose comme ça en JavaScript brut en utilisant la méthode cloneNode () :

// Create a clone of element with id ddl_1:
let clone = document.querySelector('#ddl_1').cloneNode( true );

// Change the id attribute of the newly created element:
clone.setAttribute( 'id', newId );

// Append the newly created element on element p 
document.querySelector('p').appendChild( clone );

Ou en utilisant la méthode jQuery clone () (pas la plus efficace):

$('#ddl_1').clone().attr('id', newId).appendTo('p'); // append to where you want
Boris Guéry
la source
30
Il est TRÈS important de modifier l'ID lorsque vous clonez un élément.
Dragos Durlut
286

Avec JavaScript natif:

newelement = element.cloneNode(bool)

où le booléen indique s'il faut cloner les nœuds enfants ou non.

Voici la documentation complète sur MDN .

Annakata
la source
51
meilleure réponse. n'utilisez pas jquery là où vous n'en avez pas besoin.
luschn
Ça a l'air bien ... mais la compatibilité du navigateur est discutable à partir d'aujourd'hui.
Aniket Suryavanshi le
14
@AniketSuryavanshi Je ne suis pas sûr du 4 février en particulier, mais la compatibilité semble parfaite aujourd'hui
2
Les identifiants et les noms seront dupliqués. Les identifiants DOIVENT être modifiés, les noms POURRAIENT rester tels quels si des noms en double sont attendus.
przemo_li
Dommage que vous perdiez tous les attributs: /
Pieter De Bie
16

Oui, vous pouvez copier les enfants d'un élément et les coller dans l'autre élément:

var foo1 = jQuery('#foo1');
var foo2 = jQuery('#foo2');

foo1.html(foo2.children().clone());

Preuve: http://jsfiddle.net/de9kc/

Tadeck
la source
Les identifiants en double seront un problème avec votre approche
przemo_li
4

C'est en fait très simple dans jQuery:

$("#ddl_1").clone().attr("id",newId).appendTo("body");

Changez .appendTo () bien sûr ...

Philippe Leybaert
la source
2

Vous pouvez utiliser la méthode clone () pour créer une copie.

$('#foo1').html( $('#foo2 > div').clone())​;

FIDDLE ICI

Sushanth -
la source
1

Essaye ça:

$('#foo1').html($('#foo2').children().clone());
Oscar Jara
la source
0

En une seule ligne:

$('#selector').clone().attr('id','newid').appendTo('#newPlace');
Tamas Czinege
la source
1
Je ne pense pas que cela aidera car la valeur de votre attribut est une chaîne qui ne changera pas.
Jamie R Rytlewski
0

Vous devez sélectionner "# foo2" comme sélecteur. Ensuite, récupérez-le avec html ().

Voici le html:

<div id="foo1">

</div>
<div id="foo2">
    <div>Foo Here</div>
</div>​

Voici le javascript:

$("#foo2").click(function() {
    //alert("clicked");
    var value=$(this).html();
    $("#foo1").html(value);
});​

Voici le jsfiddle: http://jsfiddle.net/fritzdenim/DhCjf/

Franz Noel
la source