Wondering why I can't get document.getElementById("my_div").innerHTML
to update the DOM when I re-assign the variable. For example:
<div id="my_div" onclick="clicky();">
Bye.
</div>
<script type="text/javascript" charset="utf-8">
function clicky() {
var myDivValue = document.getElementById("my_div").innerHTML;
myDivValue = "Hello";
console.log(myDivValue);
}
</script>
In the log I can see the variable get re-assigned when I click, but the innerHTML of my_div remains unchanged. Why is this?
After several years more experience...
For those just starting out (like I was) and found yourself asking the same thing, there are two important concepts that need to be understood:
var myDivValue = element.innerHTML
would create a reference/address to innerHTML and every time I assigned a new value to that reference, I could just update content, but that's not how it works.element.innerHTML
value (which was blank) and assigning the value to myDivValue
, then in myDivValue = "Hello";
, I was assigning a new value to myDivValue
, so of course it would never update element.innerHTML
.The confusing part: when using the assignment operator (=
) in JS, it's not explicit that you're either assigning a reference or value (var referenceName = reference_to_thing
vs. var containerName = newValue
),
As many have said in the answers, the right way to do this is to assign the document.getElementById("my_div")
element to myDiv
:
var myDiv = document.getElementById("my_div")
And now that I have a reference to the element called myDiv
, I can update the innerHTML
property whenever I like:
myDiv.innerHTML = "Hello" // innerHTML is now "Hello"
myDiv.innerHTML = "Goodbye" // Changed it to "Goodbye"
People can struggle and complain about innerHTML not working. Such things usually occur because of human error, when strings are not appropriately defined, or there are some mistakes in JavaScript code.
dangerouslySetInnerHTML is an attribute under DOM elements in React. According to the official documentation, dangerouslySetInnerHTML is React's replacement for using innerHTML in the browser DOM.
When changing a html element with a function using innerHTML, the html element changes, but immediately the page reloads and the element is set back to his original value.
innerHTML
evaluates to a string. I'm not sure why you would expect anything different. Consider this:
var a = 'foo'; // now a = 'foo'
var b = a; // now a = 'foo', b = 'foo'
b = 'bar'; // now a = 'foo', b = 'bar'
Re-assigning b
doesn't change a
.
Edited to add: In case it's not clear from the above, if you want to change innerHTML
, you can just assign to it directly:
document.getElementById("my_div").innerHTML = "Hello";
You don't need, and can't use, an intermediary variable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With