Introducción al DOM en JavaScript
Introducción al DOM en JavaScript
Unidad 4: DOM
Presentación:
JavaScript, es un lenguaje de programación de páginas web de lado del cliente, esto
significa, que cuando estamos viendo una página que utiliza JavaScript, hemos descargado
el código a nuestro navegador y nuestro navegador lo está ejecutando de acuerdo con las
acciones realizadas en la página.
Objetivos:
Que los participantes:
Bloques temáticos:
1. DOM
En esta Unidad los participantes se encontrarán con diferentes tipos de actividades que, en
el marco de los fundamentos del MEC*, los referenciarán a tres comunidades de
aprendizaje, que pondremos en funcionamiento en esta instancia de formación, a los
efectos de aprovecharlas pedagógicamente:
Es importante que todos los participantes realicen algunas de las actividades sugeridas y
compartan en los foros los resultados obtenidos.
El carácter constructivista y colaborativo del MEC nos exige que todas las actividades
realizadas por los participantes sean compartidas en los foros.
Tomen nota
Las actividades son opcionales y pueden realizarse en forma individual, pero siempre es
deseable que se las realice en equipo, con la finalidad de estimular y favorecer el trabajo
colaborativo y el aprendizaje entre pares. Tenga en cuenta que, si bien las actividades son
opcionales, su realización es de vital importancia para el logro de los objetivos de
aprendizaje de esta instancia de formación. Si su tiempo no le permite realizar todas las
actividades, por lo menos realice alguna, es fundamental que lo haga. Si cada uno de los
participantes realiza alguna, el foro, que es una instancia clave en este tipo de cursos,
tendrá una actividad muy enriquecedora.
Asimismo, también tengan en cuenta cuando trabajen en la Web, que en ella hay de todo,
cosas excelentes, muy buenas, buenas, regulares, malas y muy malas. Por eso, es
necesario aplicar filtros críticos para que las investigaciones y búsquedas se encaminen a
la excelencia. Si tienen dudas con alguno de los datos recolectados, no dejen de consultar
al profesor-tutor. También aprovechen en el foro proactivo las opiniones de sus compañeros
de curso y colegas.
DOM permite a los programadores web acceder y manipular las páginas HTML como si
fueran documentos XML. De hecho, DOM se diseñó originalmente para manipular de forma
sencilla los documentos XML.
A pesar de sus orígenes, DOM se ha convertido en una utilidad disponible para la mayoría
de lenguajes de programación (Java, PHP, JavaScript) y cuyas únicas diferencias se
encuentran en la forma de implementarlo.
El DOM es el conjunto de objetos predefinidos que nos permite acceder a todos los
elementos de una página y a ciertas características específicas del navegador.
¿Qué es el DOM?
El DOM es una jerarquía de objetos predefinidos que describen los elementos de la página
web que está mostrando el navegador, así como otras características del proceso de
navegación (como son el historial, el tamaño de la ventana de navegación o el contenido
de la barra de estado del navegador).
[Link]("¡Hola mundo!");
Árbol de nodos
Una de las tareas habituales en la programación de aplicaciones web con JavaScript
consiste en la manipulación de las páginas web. De esta forma, es habitual obtener el valor
almacenado por algunos elementos (por ejemplo los elementos de un formulario), crear un
elemento (párrafos, cajas, etc.) de forma dinámica y añadirlo a la página, aplicar una
animación a un elemento (que aparezca/desaparezca, que se desplace, etc.).
Todas estas tareas habituales son muy sencillas de realizar gracias a DOM. Sin embargo,
para poder utilizar las utilidades de DOM, es necesario "transformar" la página original. Una
página HTML normal no es más que una sucesión de caracteres, por lo que es un formato
muy difícil de manipular. Por ello, los navegadores web transforman automáticamente todas
las páginas web en una estructura más eficiente de manipular.
Esta transformación la realizan todos los navegadores de forma automática y nos permite
utilizar las herramientas de DOM de forma muy sencilla. El motivo por el que se muestra el
funcionamiento de esta transformación interna es que condiciona el comportamiento de
DOM y por tanto, la forma en la que se manipulan las páginas.
<!doctype html>
<html >
<head>
<title>Página sencilla</title>
</head>
<body>
<p>Esta página es <strong>muy sencilla</strong></p>
</body>
</html>
Cada rectángulo representa un nodo DOM y las flechas indican las relaciones entre nodos.
Dentro de cada nodo, se ha incluido su tipo y su contenido.
La raíz del árbol de nodos de cualquier página HTML siempre es la misma: un nodo de tipo
especial denominado "Documento".
A partir de ese nodo raíz, cada etiqueta HTML se transforma en un nodo de tipo "Elemento".
La conversión de etiquetas en nodos se realiza de forma jerárquica. De esta forma, del nodo
raíz solamente pueden derivar los nodos HEAD y BODY. A partir de esta derivación inicial,
cada etiqueta HTML se transforma en un nodo que deriva del nodo correspondiente a su
"etiqueta padre".
<title>Página sencilla</title>
● El contenido de la etiqueta genera a su vez otro nodo de tipo "Texto" que deriva del
nodo generado por <strong>.
Tipos de nodos
La especificación completa de DOM define 12 tipos de nodos, aunque las páginas HTML
habituales se pueden manipular manejando solamente cuatro o cinco tipos de nodos:
● Document, nodo raíz del que derivan todos los demás nodos del árbol.
● Element, representa cada una de las etiquetas HTML. Se trata del único nodo que
puede contener atributos y el único del que pueden derivar otros nodos.
● Attr, se define un nodo de este tipo para representar cada uno de los atributos de las
etiquetas HTML, es decir, uno por cada par atributo=valor.
● Text, nodo que contiene el texto encerrado por una etiqueta HTML.
Los otros tipos de nodos existentes que no se van a considerar son DocumentType,
CDataSection, DocumentFragment, Entity, EntityReference, ProcessingInstruction y
Notation.
Una vez construido automáticamente el árbol completo de nodos DOM, ya es posible utilizar
las funciones DOM para acceder de forma directa a cualquier nodo del árbol. Como acceder
a un nodo del árbol es equivalente a acceder a "un trozo" de la página, una vez construido
el árbol, ya es posible manipular de forma sencilla la página: acceder al valor de un
elemento, establecer el valor de un elemento, mover un elemento de la página, crear y
añadir nuevos elementos, etc.
DOM proporciona dos métodos alternativos para acceder a un nodo específico: acceso a
través de sus nodos padre y acceso directo.
Las funciones que proporciona DOM para acceder a un nodo a través de sus nodos padre
consisten en acceder al nodo raíz de la página y después a sus nodos hijos y a los nodos
hijos de esos hijos y así sucesivamente hasta el último nodo de la rama terminada por el
nodo buscado.
Sin embargo, cuando se quiere acceder a un nodo específico, es mucho más rápido
acceder directamente a ese nodo y no llegar a el descendiendo a través de todos sus nodos
padre.
Por ese motivo, no se van a presentar las funciones necesarias para el acceso jerárquico
de nodos y se muestran solamente las que permiten acceder de forma directa a los nodos.
getElementsByTagName()
La función getElementsByTagName(nombreEtiqueta) obtiene todos los elementos de la
página HTML cuya etiqueta sea igual que el parámetro que se le pasa a la función.
El siguiente ejemplo muestra cómo obtener todos los párrafos de una página HTML:
El valor que se indica delante del nombre de la función (en este caso, document) es el nodo
a partir del cual se realiza la búsqueda de los elementos. En este caso, como se quieren
obtener todos los párrafos de la página, se utiliza el valor document como punto de partida
de la búsqueda.
El valor que devuelve la función es un array con todos los nodos que cumplen la condición
de que su etiqueta coincide con el parámetro proporcionado. El valor devuelto es un array
de nodos DOM, no un array de cadenas de texto o un array de objetos normales. Por lo
tanto, se debe procesar cada valor del array de la forma que se muestra en las siguientes
secciones.
De la misma forma, se podrían recorrer todos los párrafos de la página con el siguiente
código:
getElementsByName()
La función getElementsByName() busca los elementos cuyo atributo name sea igual al
parámetro proporcionado. En el siguiente ejemplo, se obtiene directamente el único párrafo
con el nombre indicado:
Normalmente el atributo name es único para los elementos HTML que lo definen, por lo que
es un método muy práctico para acceder directamente al nodo deseado.
getElementById()
La función getElementById() es la más utilizada cuando se desarrollan aplicaciones web
dinámicas. Se trata de la función preferida para acceder directamente a un nodo y poder
leer o modificar sus propiedades.
Acceder a los nodos y a sus propiedades es sólo una parte de las manipulaciones
habituales en las páginas. Las otras operaciones habituales son las de crear y eliminar
nodos del árbol DOM, es decir, crear y eliminar "trozos" de la página web.
Como hemos visto, un elemento HTML sencillo, como por ejemplo un párrafo, genera dos
nodos: el primer nodo es de tipo Element y representa la etiqueta <p> y el segundo nodo
es de tipo Text y representa el contenido textual de la etiqueta <p>
.Por este motivo, crear y añadir a la página un nuevo elemento HTML sencillo consta de
cuatro pasos diferentes:
4. Añadir el nodo Element a la página, en forma de nodo hijo del nodo correspondiente
al lugar en el que se quiere insertar el elemento.
De este modo, si se quiere añadir un párrafo simple al final de una página HTML, es
necesario incluir el siguiente código JavaScript:
Eliminación de nodos
Eliminar un nodo del árbol DOM de la página es mucho más sencillo que añadirlo.
<p id="provisional">...</p>
Así, para eliminar un nodo de una página HTML se invoca a la función removeChild() desde
el valor parentNode del nodo que se quiere eliminar. Cuando se elimina un nodo, también
se eliminan automáticamente todos los nodos hijos que tenga, por lo que no es necesario
borrar manualmente cada nodo hijo.
Una vez que se ha accedido a un nodo, el siguiente paso natural consiste en acceder y/o
modificar sus atributos y propiedades. Mediante DOM, es posible acceder de forma sencilla
a todos los atributos HTML y todas las propiedades CSS de cualquier elemento de la
página.
A continuación, se obtiene el atributo href del enlace mediante [Link]. Para obtener
por ejemplo el atributo id, se utilizaría [Link].
Las propiedades CSS no son tan fáciles de obtener como los atributos HTML. Para obtener
el valor de cualquier propiedad CSS del nodo, se debe utilizar el atributo style. El siguiente
ejemplo obtiene el valor de la propiedad margin de la imagen:
El único atributo HTML que no tiene el mismo nombre en HTML y en las propiedades DOM
es el atributo class. Como la palabra class está reservada por JavaScript, no es posible
utilizarla para acceder al atributo class del elemento HTML.
En su lugar, DOM utiliza el nombre className para acceder al atributo class de HTML:
querySelectorall y querySelector
Hemos visto que JavaScript provee métodos para acceder y manipular nodos del DOM, en
concreto getElementById, getElementsByTagName y getElementsByName, que nos
permiten acceder a un elemento por su valor de atributo id, o a la colección de elementos
cuya etiqueta es de un determinado tipo o tiene como atributo name un valor concreto.
Veremos ahora métodos que nos permiten acceder a cualquier nodo identificado por un
selector CSS específico.
Se consigue que los elementos <a> (links) dentro de elementos <div> cuyo atributo class
es “destacado” y están dentro de un elemento con id menu1 se muestren con color de fondo
amarillo.
Por ejemplo para seleccionar todas las etiquetas de títulos de un documento podemos usar
Esta instrucción nos devuelve un array de nodos del DOM que cumplen con la
especificación del selector CSS. Los índices del array serán 0, 1, 2, … hasta un número
indeterminado (que dependerá del número de nodos que cumplan con el selector).
Los nodos estarán ordenados según su orden de aparición en el árbol del DOM que define
el documento HTML.
La sintaxis es:
Típicamente el array de nodos (o el nodo individual) obtenido con estos métodos los
almacenaremos dentro de una variable JavaScript para después realizar algún tipo de
tratamiento. Por ejemplo:
Una vez tenemos una colección de nodos en una variable, podemos recorrerla usando un
bucle for. Por ejemplo:
Los métodos querySelector se pueden aplicar sobre document como hemos visto (para
seleccionar todos los nodos hijos del nodo raíz que cumplen un criterio), pero también sobre
un nodo especificado obtenido de otra manera. Por ejemplo:
Aquí primero se obtiene el nodo cuyo id es “calculadora” y después se obtienen todos los
nodos hijos de calculadora cuyo que son elementos span con class=”numero” que se
encuentran dentro de un elemento con un valor class=”teclas”
Lo que vimos:
En esta unidad trabajamos con DOM
Lo que viene:
Trabajaremos con eventos.