En JS, il est possible de manipuler le DOM.
Celui-ci se compose d'éléments appelés DOM Element ou Node
Nous allons voir dans un premier temps comment récupérer ces éléments pour les stocker dans des variables afin de les manipuler par la suite
La page entière est considérée comme un DOM Element. On y accède en JS avec la variable document
const foo = document.getElementById('hey')
console.log(foo)
const foo = document.getElementsByClassName('hey')
console.log(foo)
const foo = document.getElementsByTagName('section')
console.log(foo)
const foo = document.querySelector('.toto')
console.log(foo)
const foo = document.querySelectorAll('.toto')
console.log(foo)
☝️ le tableau renvoyé n'est pas tout à fait un tableau
Si on tente par exemple un for ... in ... dessus, on va se retrouver avec des clées non désirées
const foo = document.querySelectorAll('.toto')
for(const key in foo)
{
console.log(key)
}
Alors qu'un for ... of ... va fonctionner
const foo = document.querySelectorAll('.toto')
for(const element of foo)
{
console.log(element)
}
Une bonne astuce consiste à transformer ce "genre de tableau" en un vrai tableau
Pour cela, deux façons de faire
Avec Array.from()
const foo = document.querySelectorAll('p')
const bar = Array.from(foo)
Avec le spread operator
const foo = document.querySelectorAll('p')
const bar = [...foo]
querySelector et querySelectorAll ont rendu obsolète les autres méthodes
⚠️ N'utilisez que ces deux là dans un souci de simplicité
Une fois l'élément récupéré, il est possible de le modifier
// Modifie l'attribut test (le créé s'il n'existe pas)
foo.setAttribute('test', 'coucou')
// Récupère l'attribut "test"
console.log(foo.getAttribute('test'))
// Supprime l'attribut "class"
foo.removeAttribute('class')
// Modifie le style
foo.style.backgroundColor = 'green'
foo.style.width = '200px'
foo.style.height = '200px'
foo.style.height = '200px'
foo.style.webkitBorderRadius = '100px'
foo.style.mozBorderRadius = '100px'
foo.style.borderRadius = '100px'
// Rajoute une classe
foo.classList.add('toto')
// Rajoute plusieurs classes
foo.classList.add('lorem', 'ipsum')
// Supprime une classe
foo.classList.remove('lorem')
// Demande si contient la classe
console.log(foo.classList.contains('ipsum'))
// Remplace le contenu par "hey"
foo.textContent = 'hey'
// Remplace le contenu par du HTML
foo.innerHTML = '<span>hey</span>'
La différence avec textContent est la possibilité d'écrire du HTML qui sera interprété comme tel
// Supprime du DOM
foo.remove()
// Place bar à la fin de l'élément foo
foo.append(bar)
⚠️ append est le successeur de appendChild et n'est pas supporté sur certains vieux navigateurs
// Place bar au début de l'élément foo
foo.prepend(bar)
⚠️ prepend n'est pas supporté sur certains vieux navigateurs
// Créé un span et stock dans la variable "toto"
const toto = document.createElement('span')
// Lui ajoute la class "toto"
toto.classList.add('toto')
// Lui ajoute du texte
toto.textContent = 'Coucou, je suis toto'
// Le rajoute au DOM dans l'élément foo
foo.append(toto)
Il est possible de récupérer la valeur d'un input que ce soit un input text, un select, un textarea, etc.
<input value="test" type="text" class="my-awesome-input">
const input = document.querySelector('.my-awesome-input')
console.log(input.value)
⚠️
Récupérer un élément dans la page demande pas mal de ressources pour le navigateur
Il faut minimiser cette pratique autant que possible