Documente Academic
Documente Profesional
Documente Cultură
DOM
El Document Object Model o DOM ('Modelo de Objetos del Documento o Modelo en Objetos
para la Representacin de Documentos') es esencialmente una interfaz de programacin de
aplicaciones (API) que proporciona un conjunto estndar de objetos para representar
documentos HTML y XML, un modelo estndar sobre cmo pueden combinarse dichos objetos,
y una interfaz estndar para acceder a ellos y manipularlos. A travs del DOM, los programas
pueden acceder y modificar el contenido, estructura y estilo de los documentos HTML y XML,
que es para lo que se dise principalmente.
El responsable del DOM es el World Wide Web Consortium (W3C).
Con el DOM, todos los elementos HTML se insertan en un rbol cuyos nodos son las etiquetas
HTML y las hojas, los valores propiamente dichos de las etiquetas. Por medio de JavaScript
podemos acceder y modificar este rbol de etiquetas y hacer que la pgina vare luego que ya
se haya mostrado en el navegador.
Mediante el DOM podemos acceder al contenido y estilo de cada etiqueta del documento y
modificarlo de acuerdo a algn evento.
Mediante el DOM podemos insertar, borrar, modificar etiquetas HTML. Podemos acceder a la
hoja de estilo definida a la pgina y dinmicamente agregar, modificar o borrar propiedades.
Todos esto sin tener que recargar la pgina del servidor, es decir todo se hace en el cliente
(navegador) mediante JavaScript.
La primera funcin que nos provee el DOM a travs del objeto document es:
document.getElementById("nombre del Id de la etiqueta HTML")
Nos retorna una referencia a la etiqueta en s misma. Con esta referencia podemos acceder a
sus propiedades como puede ser su contenido, color, fuente, etc.
Ejemplo : Dispondremos una etiqueta <h1> en la pgina y luego por medio de dos botones
cambiaremos su color, y su tamao de fuente.
El archivo html es el siguiente (dom1.html)
<html>
<head>
<title>Problema</title>
<script language="javascript" type="text/javascript">
function cambiarColor()
{
var tit=document.getElementById('titulo');
tit.style.color='#ff0000';
}
function cambiarTamanoFuente()
{
var tit=document.getElementById('titulo');
tit.style.fontSize=60;
}
</script>
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1 id="titulo">Este es un ttulo dinmico</h1>
<input type="button" value="Cambiar Color" onClick="cambiarColor()">
<input type="button" value="Cambiar Tamao de Fuente"
onClick="cambiarTamanoFuente()">
</body>
</html>
Crearemos una pgina con dos div que contengan tres prrafos cada uno, en uno insertaremos
saltos de lnea entre prrafos y en otro los dispondremos todos en la misma lnea y veremos la
cantidad de hijos que tiene cada div:
dom2.html
<html>
<head>
<title>Problema</title>
<script language="javascript" type="text/javascript">
segundo
En IE nos cuenta 3 divs pero en Firefox y Chrome al preguntar al div cuantos hijos tiene,
responder 7 .
Esto es porque FireFox crea el rbol de nodos de la siguiente manera:
<div id="bloque">
<p>Este es el primer prrafo</p>
Entre la etiqueta <div id="bloque"> y la etiqueta <p> hay un salto de lnea (crea un nodo de
texto, este es el primer nodo).
Luego el primer prrafo es el segundo nodo.
Entre el primer prrafo y el segundo hay otro salto de lnea (este es el tercer nodo) y as
sucesivamente. Si contamos los prrafos y saltos de lnea podremos contabilizar los 7 hijos.
Si no dejamos el salto de lnea entre una prrafo y otro y tampoco dejamos espacios despus
del div y antes del cerrado del div, los hijos sern 3.
Es importante notar que el texto contenido en una etiqueta no pertenece al nodo, sino que se
encuentra en otro nodo especial que lo llamaremos nodo texto.
En este rbol de nodos podemos identificar que todos los rectngulos que no tienen bordes
redondeados son nodos texto.
Ahora para acceder a dichos nodos podemos hacerlo a partir del nodo padre con la propiedad
childNodes.
Dom3.html
Cambiar el texto que contiene una etiqueta h1 Acceder al nodo de texto mediante la referencia de la
etiqueta h1.
<html>
<head>
<title>Problema</title>
<script language="javascript" type="text/javascript">
function cambiarTexto()
{
var tit=document.getElementById('titulo');
tit.childNodes[0].nodeValue='Ahora vemos el nuevo ttulo';
// tit.innerHTML='Ahora vemos el nuevo ttulo';
}
</script>
</head>
<body>
<h1 id="titulo">Este es el ttulo original</h1>
<input type="button" value="Cambiar Texto" onClick="cambiarTexto()">
</body>
</html>
La propiedad InnerHTML fue definida inicialmente para el IE y luego se volvi un estndar de hecho,
permite ahorrar lneas de cdigo, como veremos ms adelante.
Ejercicio dom4.html
Definir una etiqueta h1 con el texto "1". Luego, rescatar el valor que tiene el nodo de texto,
convertirlo a entero con la funcin parseInt de JavaScript, sumarle uno y finalmente asignrselo
a la propiedad nodeValue del nodo de texto (es decir mostramos un contador). Observar que
ocurre si no se usa la funcin parseInt
Si tenemos la referencia a un nodo podemos obtener fcilmente la referencia del nodo padre
mediante la propiedad parentNode.
Veamos un ejemplo sencillo donde obtenemos la referencia de un prrafo contenido en un div.
Luego por medio de esta referencia obtenemos la referencia al div y cambiamos el color de
fondo del div.
Dom5.html
<html>
<head>
<title>Problema</title>
<script language="javascript" type="text/javascript">
function cambiarColor()
{
var puntero=document.getElementById('parrafo1');
var padre=puntero.parentNode;
padre.style.backgroundColor='#ff0000';
}
</script>
</head>
<body>
<div>
<p id="parrafo1">Este es el primer prrafo</p><p>Este
prrafo</p><p>Este es el tercer prrafo</p>
</div>
<input type="button" value="Cambiar color de fondo del div"
onClick="cambiarColor()">
</body>
</html>
es
el
segundo
el
segundo
prrafos"
Habamos visto anteriormente que podemos acceder a todos los hijos de un nodo por medio
del vector childNodes. Otra forma de acceder al primer y ltimo nodo hijo es por medio de las
propiedades firstChild (retorna la referencia del primer hijo, es lo mismo que poner
obj.childNodes[0]) y obj.lastChild (retorna la referencia del ltimo hijo, es sinnimo de poner
obj.childNodes[obj.childNodes.length-1])
Veamos con un ejemplo como utilizar estas dos propiedades, dispondremos tres prrafos
dentro de un div y luego cambiaremos el color del primer y ltimo prrafo (Para hacerlo
compatible entre IExplorer y FireFox dispondremos todos los prrafos en la misma lnea, lo
mismo que el comienzo y fin del div)
(dom7.html)
<html>
<head>
<title>Problema</title>
<script language="javascript" type="text/javascript">
function accederParrafos()
{
var puntero=document.getElementById('parrafos');
puntero.firstChild.style.color='#ff0000';
puntero.lastChild.style.color='#ff0000';
}
</script>
</head>
<body>
<div id="parrafos"><p>Este es el primer prrafo</p><p>Este
prrafo</p><p>
Este es el tercer prrafo</p></div>
<input type="button" value="Modificar color del primer y ltimo
prrafo" onClick="accederParrafos()">
</body>
</html>
es
el
segundo
Hay que tener en cuenta que en el vector lista se almacena la referencia a todas las etiquetas
de tipo prrafo (p) de la pgina. Luego para acceder al contenido de cada prrafo debemos
hacerlo mediante el vector childNodes y mediante la propiedad nodeValue acceder al texto
contenido en dicho prrafo. Disponemos el subndice cero en la propiedad childNodes ya que
los prrafos definidos en el ejemplo tienen como hijo slo un texto. Para agregar un punto al
final de cada prrafo slo debemos almacenar el contenido actual ms el string '.':
for(f=0;f<lista.length;f++)
{
lista[f].childNodes[0].nodeValue=lista[f].childNodes[0].nodeValue + '.';
}
Ejercicio
Disponemos de la pagina web como la siguiente
<body>
<div id="bloque1">
<h1>Primer Bloque de prrafos.</h1>
<p>Este es el primer prrafo</p>
<p>Este es el segundo prrafo</p>
<p>Este es el tercer prrafo</p>
</div>
<div id="bloque2">
<h1>Segundo Bloque de prrafos.</h1>
<p>Este es el primer prrafo</p>
<p>Este es el segundo prrafo</p>
<p>Este es el tercer prrafo</p>
</div>
<input type="button" value="Agregar
onClick="cambiarParrafos()">
</body>
</html>
un
punto
al
final
de
cada
prrafo"
Modificar el ejercicio anterior para que slo ponga puntos a los prrafos del segundo
bloque.
Para la creacin de un nodo de texto disponemos del siguiente mtodo de la clase document:
var nt=document.createTextNode('Texto del nodo');
Para aadirlo luego a un prrafo por ejemplo debemos llamar al mtodo appendChild:
var nparrafo=document.getElementById('parrafo');
nparrafo.appendChild(nt);
Veamos un ejemplo en el que cada vez que se presione un botn se aada un nodo de texto a
un prrafo mostrando cuntos nodos de texto se han aadido: (dom9.html)
<html>
<head>
<title>Problema</title>
<script language="javascript" type="text/javascript">
var contador=1;
function agregar()
{
var nt=document.createTextNode('Nuevo texto '+contador+'-');
var nparrafo=document.getElementById('parrafo');
nparrafo.appendChild(nt);
contador++;
}
</script>
</head>
<body>
<p id="parrafo">Texto inicial:</p>
<input type="button" value="Agregar nodo de texto" onClick="agregar()">
</body>
</html>
Ejercicio
Hacerlo con la propiedad innerHTML
Ejercicio
Ampliar el ejercicio anterior para que permita eliminar nodos. Para ello disponemos
de la funcin removeChild
(dom10.html)
Ejercicio (dom11.html)
Con la siguiente pgina web y usando las funciones del DOM sacar por pantalla
1.
2.
3.
4.
Ejercicio (dom12.html)
Dado una web con un texto insertar dos botones para aumentar o disminuir la letra de la web.
Ejercicio (dom13.html)
Partiendo del cdigo dado crear las funciones sube() y baja(), para subir o bajar un elemento del
formulario.
10
Ejercicio (dom14.html)
Usando una imagen de un mapa(plano.gif) como base de 600x600 px y la propiedad clip , usar los
botones para visualizar las partes de la imagen . Crear las funciones necesarias para mover el clip de 10
en 10 px.