D'accord, j'ai déjà utilisé JavaScript, mais la chose la plus utile que j'ai écrite est un sélecteur de style CSS. Donc, je suis un peu nouveau pour cela. Disons que j'ai un code HTML comme celui-ci:
<div id="foo">
<div class="bar">
Hello world!
</div>
</div>
Comment pourrais-je changer "Hello world!" à "Au revoir le monde!" ? Je sais comment document.getElementByClass et document.getElementById fonctionnent, mais j'aimerais être plus précis. Désolé si cela a été demandé avant.
Eh bien, vous devez d’abord sélectionner les éléments avec une fonction comme getElementById
.
var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];
getElementById
ne renvoie qu'un seul noeud, mais getElementsByClassName
renvoie une liste de noeuds. Comme il n'y a qu'un seul élément avec ce nom de classe (pour autant que je sache), vous pouvez obtenir le premier (c'est à cela que sert le [0]
, c'est comme un tableau).
Ensuite, vous pouvez changer le code HTML avec .textContent
.
targetDiv.textContent = "Goodbye world!";
var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];
targetDiv.textContent = "Goodbye world!";
<div id="foo">
<div class="bar">
Hello world!
</div>
</div>
Vous pouvez le faire comme ça:
var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
list[0].innerHTML = "Goodbye world!";
}
ou, si vous voulez le faire avec moins de vérification d'erreur et plus de brièveté, vous pouvez le faire en une seule ligne, comme ceci:
document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";
En explication:
id="foo"
.class="bar"
.innerHTML
de cet élément pour en modifier le contenu.Mises en garde: certains navigateurs plus anciens ne prennent pas en charge getElementsByClassName
(par exemple, les anciennes versions de IE). Cette fonction peut être mise en place si elle est manquante.
C’est la raison pour laquelle je recommande d’utiliser une bibliothèque dotée de la prise en charge intégrée du sélecteur CSS3 plutôt que de s’inquiéter de la compatibilité du navigateur (laissez l’autre personne faire tout le travail). Si vous voulez juste une bibliothèque pour le faire, alors Sizzle fonctionnera très bien. Dans Sizzle, cela se ferait comme ceci:
Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";
jQuery a la bibliothèque Sizzle intégrée et dans jQuery, ce serait:
$("#foo .bar").html("Goodbye world!");
Si cela doit fonctionner dans IE 7 ou inférieur, vous devez vous rappeler que getElementsByClassName n'existe pas dans tous les navigateurs. Pour cette raison, vous pouvez créer votre propre getElementsByClassName ou essayer ceci.
var fooDiv = document.getElementById("foo");
for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) {
childNode = fooDiv.childNodes[i];
if (/bar/.test(childNode.className)) {
childNode.innerHTML = "Goodbye world!";
}
}
Fonction récursive:
function getElementInsideElement(baseElement, wantedElementID) {
var elementToReturn;
for (var i = 0; i < baseElement.childNodes.length; i++) {
elementToReturn = baseElement.childNodes[i];
if (elementToReturn.id == wantedElementID) {
return elementToReturn;
} else {
return getElementInsideElement(elementToReturn, wantedElementID);
}
}
}
La façon la plus simple de le faire est:
function findChild(idOfElement, idOfChild){
let element = document.getElementById(idOfElement);
return element.querySelector('[id=' + idOfChild + ']');
}
ou mieux lisible:
findChild = (idOfElement, idOfChild) => {
let element = document.getElementById(idOfElement);
return element.querySelector(`[id=${idOfChild}]`);
}