Capítol 9 · Part B

La pàgina parla: DOM

Benvingut a la Part B del curs! A partir d'ara JavaScript no es queda dins la consola: pot canviar la pàgina web en directe. Cada vegada que executis el codi veuràs dues coses: la pàgina viva (a dalt) i la consola (a sota).

⚠ Important

En aquesta part del curs el simulador NO pot aturar automàticament un bucle infinit. Si el teu programa es queda penjat (la pàgina no respon), tanca la pestanya i torna-la a obrir. Revisa sempre que els teus bucles tinguin una condició de sortida abans d'executar.

Què és el DOM

Una pàgina web és un document HTML: una col·lecció d'elements (títols, paràgrafs, botons…) organitzats en forma d'arbre. JavaScript veu aquesta estructura com un objecte gegant anomenat DOM (Document Object Model). A través del DOM, pots:

  • Llegir el contingut de qualsevol element.
  • Modificar el text, els colors, l'estil…
  • Afegir i eliminar elements.

L'objecte central és document. És com el Math que vam veure abans: no l'has de declarar, ja existeix. T'hi pots referir des de qualsevol part del codi.

Buscar un element: document.querySelector

Per fer alguna cosa amb un element de la pàgina, primer cal trobar-lo. La funció més potent és document.querySelector("selector"). El selector és el mateix que faries servir en CSS:

  • "h1" — el primer element <h1> de la pàgina.
  • "p" — el primer paràgraf.
  • "#titol" — l'element amb id="titol".
  • ".destacat" — el primer element amb class="destacat".

El simulador següent té la pàgina:

<h1>Hola, món!</h1>
<p>Aquesta és la meva pàgina.</p>

Executa i veuràs que querySelector retorna un objecte que representa l'element trobat:

Llegir i canviar el text: .textContent

Quan tens un element, la propietat .textContent et dona el text de dins. Pots llegir-lo:

O pots canviar-lo, assignant un nou valor. Observa la pàgina viva quan executis:

El text del <h1> ha canviat a la pàgina viva. Aquest és el moment màgic: JavaScript ha modificat HTML que ja era a la pantalla.

Canviar l'estil: .style

Cada element té una propietat .style que et permet modificar el seu CSS directament. Els noms de les propietats CSS amb guió (com background-color o font-size) es transformen en camelCase: backgroundColor, fontSize.

Els valors són sempre strings, exactament com els escriuries en CSS. Per a mides cal escriure les unitats: "48px", no 48.

Algunes propietats útils:

  • .style.color — color del text
  • .style.backgroundColor — color de fons
  • .style.fontSize — mida de lletra ("24px")
  • .style.fontWeight — gruix ("bold")
  • .style.textAlign — alineació ("center")
  • .style.border — vora ("2px solid black")
  • .style.padding — espaiat intern

Tots a l'hora: querySelectorAll

querySelector retorna només el primer element que troba. Si vols tots els elements que coincideixen, fas servir querySelectorAll, que retorna una col·lecció que pots recórrer amb un bucle:

Tots els <li> han canviat alhora. Aquest és un patró molt habitual: trobar molts elements i fer-los alguna cosa a tots.

Una alternativa: getElementById

Hi ha una altra forma de trobar un element, especialment quan tens un id únic: document.getElementById("nom-id"). És equivalent a document.querySelector("#nom-id"), però sense necessitat del #:

Es coneix també com a "getElementById" i és potser la forma més antiga i ràpida. querySelector és més modern i flexible (admet qualsevol selector CSS), però getElementById encara s'usa molt.

.textContent vs .innerHTML

A part de .textContent, hi ha una altra propietat anomenada .innerHTML. La diferència és important:

  • .textContent — només text. Si poses "<b>hola</b>", es mostra exactament així, amb les etiquetes visibles.
  • .innerHTML — interpreta HTML. Si poses "<b>hola</b>", l'etiqueta es renderitza i es veu "hola" en negreta.

Per defecte, fes servir sempre .textContent. .innerHTML només quan vulguis afegir HTML real (com fer una llista) i estiguis segur que el text no ve de l'usuari (per evitar problemes de seguretat).

Errors típics

1. Buscar un element que no existeixquerySelector retorna null si no troba res. Si intentes accedir a una propietat de null, el codi peta:

L'error és TypeError: Cannot set properties of null. Sempre comprova el resultat si no estàs segur que l'element existeixi.

2. Confondre style amb noms CSS amb guió — recorda que els noms van en camelCase, no com al CSS:

// CSS:
background-color: red;
font-size: 24px;

// JavaScript:
element.style.backgroundColor = "red";   // ✓
element.style.fontSize = "24px";          // ✓

// Això NO funciona:
element.style.background-color = "red";   // ✗ ERROR
element.style["background-color"] = "red"; // ✓ (alternativa amb claudàtors)

3. Oblidar les unitats — moltes propietats CSS necessiten unitats explícites (px, em, %):

La consola mostra que fontSize ha quedat com a string buit: el navegador ha ignorat l'assignació. Has d'escriure "48px".

Exercici

Tens una pàgina amb un <h1> i tres paràgrafs. Escriu el codi perquè:
  1. El títol passi a dir "JSCat mola".
  2. El títol tingui el color "purple".
  3. Tots els paràgrafs tinguin el color de fons "lightyellow".

Has de fer servir document.querySelector i document.querySelectorAll. Quan executis, ho veuràs a la pàgina viva.

Resum

  • El DOM és la representació de la pàgina HTML com a objecte JavaScript. L'objecte principal és document.
  • document.querySelector("selector") troba el primer element. El selector és sintaxi CSS: "h1", "#id", ".classe".
  • document.querySelectorAll("selector") en retorna tots, en una col·lecció que pots recórrer.
  • document.getElementById("id") és una alternativa més directa per a ids únics.
  • element.textContent llegeix o canvia el text de l'element.
  • element.innerHTML permet canviar HTML real, però vés amb compte.
  • element.style.X modifica el CSS. Els noms van en camelCase: backgroundColor, no background-color.
  • Si l'element no existeix, querySelector retorna null — comprova abans d'accedir a propietats.