Vous vous demandez pourquoi je ne peux pas obtenir document.getElementById("my_div").innerHTML
pour mettre à jour le DOM lorsque je réassigne la variable. Par exemple:
<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>
Dans le journal, je peux voir la variable se réaffecter lorsque je clique, mais le innerHTML de my_div reste inchangé. Pourquoi est-ce?
Après plusieurs années d'expérience supplémentaire ...
Pour ceux qui débutent (comme moi) et se sont retrouvés à demander la même chose, il y a deux concepts importants à comprendre:
var myDivValue = element.innerHTML
Créerait une référence/adresse à innerHTML et chaque fois que j'attribuerais une nouvelle valeur à cette référence, je pourrais simplement mettre à jour le contenu, mais ce n'est pas comme ça que ça marche.element.innerHTML
(Qui était vide) et affectais la valeur à myDivValue
, puis dans myDivValue = "Hello";
, J'assignais une nouvelle valeur à myDivValue
, donc bien sûr, il ne mettrait jamais à jour element.innerHTML
.La partie déroutante: lorsque vous utilisez l'opérateur d'affectation (=
) Dans JS, il n'est pas explicite que vous attribuez une référence ou une valeur (var referenceName = reference_to_thing
Vs var containerName = newValue
),
Comme beaucoup l'ont dit dans les réponses, la bonne façon de procéder consiste à affecter l'élément document.getElementById("my_div")
à myDiv
:
var myDiv = document.getElementById("my_div")
Et maintenant que j'ai un référence à l'élément appelé myDiv
, je peux mettre à jour la propriété innerHTML
quand je veux:
myDiv.innerHTML = "Hello" // innerHTML is now "Hello"
myDiv.innerHTML = "Goodbye" // Changed it to "Goodbye"
innerHTML
correspond à une chaîne. Je ne sais pas pourquoi vous vous attendriez à quelque chose de différent. Considère ceci:
var a = 'foo'; // now a = 'foo'
var b = a; // now a = 'foo', b = 'foo'
b = 'bar'; // now a = 'foo', b = 'bar'
Réaffecter b
ne change pas a
.
Modifié pour ajouter: Au cas où ce ne serait pas clair d'après ce qui précède, si vous voulez changer innerHTML
, vous pouvez simplement lui assigner directement:
document.getElementById("my_div").innerHTML = "Hello";
Vous n'avez pas besoin et ne pouvez pas utiliser de variable intermédiaire.
var myDivValue = document.getElementById("my_div").innerHTML;
stocke la valeur de innerHTML, innerHTML contient une valeur de chaîne, pas un objet. Donc, aucune référence à l'elem n'est possible. Vous devez stocker directement l'objet pour modifier ses propriétés.
var myDiVElem = document.getElementById("my_div");
myDiVElem.innerHTML = 'Hello'; // this makes the change
vous devez réaffecter l'élément après avoir défini innerHTML/externalHTML:
let indexInParent=[].slice.call(elem.parentElement.children).indexOf(elem);
elem.innerHTML=innerHTML;
elem=elem.parentElement.children[indexInParent];
Pour les futurs googleurs, mon problème était que j'appelais les éléments pluriels.
document.getElementsByClassName(‘class’).innerHTML
Il a donc renvoyé un tableau et non un élément unique. Je l'ai changé au singulier.
document.getElementByClassName(‘class’).innerHTML
Cela m'a permis de mettre à jour la valeur innerHTML.
vous devez définir la valeur innerHTML comme
var myDivValue = document.getElementById("my_div").innerHTML = "Hello";