Czy można klonować obiekty elementów HTML w JavaScript / JQuery?

101

Szukam wskazówek, jak rozwiązać mój problem.

Mam element html (jak pole wejściowe pola wyboru) w tabeli. Teraz chcę skopiować obiekt i wygenerować nowy z kopii, a to za pomocą JavaScript lub jQuery. Myślę, że to powinno jakoś działać, ale w tej chwili jestem trochę nieświadomy.

Coś takiego (pseudo kod):

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

newDdl = oldDdl;

oldDdl.attr('id', newId);

oldDdl.html();
Richard
źródło
3
stackoverflow.com/search?q=jquery+copy+element+content zawiera kilka powiązanych pytań.
Felix Kling

Odpowiedzi:

60

Używając swojego kodu, możesz zrobić coś takiego w zwykłym JavaScript, używając metody 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 );

Lub używając metody clone () jQuery (nie jest to najbardziej wydajna):

$('#ddl_1').clone().attr('id', newId).appendTo('p'); // append to where you want
Boris Guéry
źródło
30
BARDZO ważne jest zmodyfikowanie ID podczas klonowania elementu.
Dragos Durlut
286

Z natywnym JavaScript:

newelement = element.cloneNode(bool)

gdzie Boolean wskazuje, czy klonować węzły potomne, czy nie.

Oto pełna dokumentacja dotycząca MDN .

annakata
źródło
51
najlepsza odpowiedź. nie używaj jquery tam, gdzie go nie potrzebujesz.
luschn
Wygląda dobrze ... ale zgodność przeglądarek jest dziś wątpliwa.
Aniket Suryavanshi
14
@AniketSuryavanshi Nie jestem pewien w szczególności 4 lutego, ale kompatybilność wygląda dziś idealnie
2
Identyfikatory i nazwiska zostaną zduplikowane. ID MUSZĄ zostać zmienione, nazwy MOGĄ pozostać niezmienione, jeśli oczekuje się zduplikowanych nazw.
przemo_li
Szkoda, że ​​tracisz wszystkie atrybuty: /
Pieter De Bie
16

Tak, możesz skopiować elementy potomne jednego elementu i wkleić je do drugiego:

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

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

Dowód: http://jsfiddle.net/de9kc/

Tadeck
źródło
Duplikaty identyfikatorów będą problemem z Twoim podejściem
przemo_li
4

W jQuery jest to bardzo proste:

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

Zmień .appendTo () oczywiście ...

Philippe Leybaert
źródło
2

Możesz użyć metody clone () , aby utworzyć kopię.

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

FIDDLE TUTAJ

Sushanth -
źródło
1

Spróbuj tego:

$('#foo1').html($('#foo2').children().clone());
Oscar Jara
źródło
0

W jednej linii:

$('#selector').clone().attr('id','newid').appendTo('#newPlace');
Tamas Czinege
źródło
1
Nie sądzę, żeby to pomogło, ponieważ wartość atrybutu to ciąg znaków, który się nie zmieni.
Jamie R Rytlewski
0

Musisz wybrać "# foo2" jako swój selektor. Następnie pobierz za pomocą html ().

Oto html:

<div id="foo1">

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

Oto javascript:

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

Oto jsfiddle: http://jsfiddle.net/fritzdenim/DhCjf/

Franz Noel
źródło