JavaScript cloneNode() method explained

Let's learn how JavaScript cloneNode() method works

Posted on July 07, 2021


The JavaScript cloneNode() method allows you to copy an HTML element rendered on the browser and place it on another part of your website.

It offers you the convenience of duplicating a complex HTML element and modify just what you need rather than creating the same element from scratch.

The method accepts one optional boolean parameter specifying whether you want to “deep clone” the element or not:

Element.cloneNode(deepClone);

Let’s see an example of what cloneNode() method can do for you next.

The cloneNode() method in action

Suppose you have the following HTML <body> structure:

<body>
  <div id="first">
    <h1 class="header">First Header</h1>
    <p class="paragraph">First paragraph</p>
  </div>
  <div id="second">
    <h1 class="header">Second Header</h1>
  </div>
</body>

You’d like to have the same <p> tag inside the <div id="second"> element, so you select the <p> element using querySelector() method and append it to the second <div> as shown below:

let firstP = document.querySelector("#first .paragraph");
let secondH = document.querySelector("#second");

secondH.appendChild(firstP);

But the appendChild() method would move the firstP element out from the first <div> to the second one:

<body>
  <div id="first">
    <h1 class="header">First Header</h1>
  </div>
  <div id="second">
    <h1 class="header">Second Header</h1>
    <p class="paragraph">First paragraph</p>
  </div>
</body>

Now the first <div> element doesn’t have the <p> tag as its child. To copy the <p> tag instead of moving it, you need to call the cloneNode() method on the <p> element itself.

After retrieving the element, call the cloneNode() method as follows:

let firstP = document.querySelector("#first .paragraph");
cloneP = firstP.cloneNode();

Now you can add the cloned element to the second <div> with appendChild() method:

let firstP = document.querySelector("#first .paragraph");
cloneP = firstP.cloneNode();

let secondH = document.querySelector("#second");
secondH.appendChild(cloneP);

This way, both <div> elements would have a <p> tag as their child:

<body>
  <div id="first">
    <h1 class="header">First Header</h1>
    <p class="paragraph">First paragraph</p>
  </div>
  <div id="second">
    <h1 class="header">Second Header</h1>
    <p class="paragraph"></p>
  </div>
</body>

You may notice that the second <p> tag is empty. This is because the cloneNode() method clones only the element and its attributes like class, name, or id.

If you want to copy everything inside the element, you need to deep clone the element by passing true as its argument during the method call:

let firstP = document.querySelector("#first .paragraph");
cloneP = firstP.cloneNode(true);

With the deepClone parameter set to true, the cloneNode() method will copy everything inside the element that you call it from. This is especially useful when you’re cloning an element with many child elements like an ul list element.

The cloned element is a perfecly valid regular HTML element object, so you can change its properties like innerText or innerHTML and call on the setAttribute() method to set its attributes as you require.

What you do with the cloned element is up to you.

Related articles:

Grab the free JavaScript book today 👍

Learn the building blocks of JavaScript programming language like data types, functions, objects, arrays and classes.

Use the knowledge from the book to build a small but solid program.

Learn more
JavaScript Introduction Book