É possível clonar objetos de elemento html em JavaScript / JQuery?


100

Estou procurando algumas dicas de como resolver meu problema.

Eu tenho um elemento html (como o campo de entrada da caixa de seleção) em uma tabela. Agora quero copiar o objeto e gerar um novo a partir da cópia, e isso com JavaScript ou jQuery. Eu acho que isso deve funcionar de alguma forma, mas estou um pouco sem noção no momento.

Algo assim (pseudocódigo):

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

newDdl = oldDdl;

oldDdl.attr('id', newId);

oldDdl.html();

3
stackoverflow.com/search?q=jquery+copy+element+content tem um monte de perguntas relacionadas.
Felix Kling

Respostas:


60

Usando seu código, você pode fazer algo assim em JavaScript simples usando o método 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 usando o método jQuery clone () (não o mais eficiente):

$('#ddl_1').clone().attr('id', newId).appendTo('p'); // append to where you want

30
É MUITO importante modificar o ID ao clonar um elemento.
Dragos Durlut,

284

Com JavaScript nativo:

newelement = element.cloneNode(bool)

onde o booleano indica se é para clonar nós filhos ou não.

Aqui está a documentação completa sobre MDN .


50
melhor resposta. não use jquery onde você não precisa.
luschn

Parece bom ... mas a compatibilidade do navegador é questionável a partir de hoje.
Aniket Suryavanshi

13
@AniketSuryavanshi Não tenho certeza sobre 4 de fevereiro em particular, mas a compatibilidade parece perfeita hoje

2
IDs e nomes serão duplicados. Os IDs PRECISAM ser alterados, os nomes PODEM ser deixados como estão se forem esperados nomes duplicados.
przemo_li

É uma pena que você perca todos os atributos: /
Pieter De Bie

16

Sim, você pode copiar os filhos de um elemento e colá-los no outro elemento:

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

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

Prova: http://jsfiddle.net/de9kc/


IDs duplicados serão um problema com sua abordagem
przemo_li

4

Na verdade, é muito fácil no jQuery:

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

Altere .appendTo () é claro ...


2

Você pode usar o método clone () para criar uma cópia.

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

FIDDLE AQUI


1

Experimente isto:

$('#foo1').html($('#foo2').children().clone());

0

Em uma linha:

$('#selector').clone().attr('id','newid').appendTo('#newPlace');

1
Não acho que isso vá ajudar, pois o valor do seu atributo é uma string que não muda.
Jamie R Rytlewski

0

Você precisa selecionar "# foo2" como seu seletor. Então, pegue com html ().

Aqui está o html:

<div id="foo1">

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

Aqui está o javascript:

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

Aqui está o jsfiddle: http://jsfiddle.net/fritzdenim/DhCjf/

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.