Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Losing a node reference? (javascript)

Tags:

javascript

dom

So I have this JS code :

var pElt = document.createElement("p");
var aElt = document.createElement("a");
aElt.textContent = "Text";
aElt.href = "#";
pElt.appendChild(aElt);

aElt.style.color = "red";
pElt.innerHTML += "<span> and more text</span>";
//aElt.style.color = "red";

document.getElementById("content").appendChild(pElt);

console.log(aElt); // always show the red attribute

There's probably some answer around here, but I cannot even describe the problem ; so I went with "losing node reference", even though it's not what happens here. (edit: in fact, that's what happens here, silly :))

So... Please try the code as it is. It works, the link is red, everyone is happy. Now comment the "aElt.style.color = "red";" line, then uncomment the other one, two lines below.

... It does not work, the link still appear in black. What I thought is that the pointer linked to my node was either not valid anymore or the aElt was moved to a different memory address. But when I type "console.log(aElt)", it outputs the node correctly (well... I think it does), so I don't get why I can't access it after the .innerHTML change.

What interests me is what happens under the hood :)

Thanks!


index.html :

<!DOCTYPE html>

<html>

    <head>
        <meta charset="utf-8"/>
        <title>Question!</title>
    </head>

    <body>
        <div id="content"></div>
        <script src="script.js"></script>
    </body>

</html>
like image 300
Joubarbe Avatar asked Jan 27 '17 15:01

Joubarbe


1 Answers

When you overwrite the content of the <p> element by setting it's innerHTML, you're effectively turning the <a> back into HTML text, appending the <span> (as text), and then recreating new DOM nodes in the <p>. Your old reference still refers to the original <a> you created.

You could instead create that <span> the same way you created the <a>, and append that node to the <p> instead of overwriting .innerHTML.

like image 60
Pointy Avatar answered Sep 20 '22 17:09

Pointy