Programación Web - Módulo 5 - Manipulando El DOM Con JavaScript
Programación Web - Módulo 5 - Manipulando El DOM Con JavaScript
el DOM con
JavaScript
Vicent Moncho Mas
Gemma Subirana Grau
PID_00220488
CC-BY-NC-ND • PID_00220488 Manipulando el DOM con JavaScript
Los textos e imágenes publicados en esta obra están sujetos –excepto que se indique lo contrario– a una licencia de
Reconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v.3.0 España de Creative Commons. Podéis copiarlos, distribuirlos
y transmitirlos públicamente siempre que citéis el autor y la fuente (FUOC. Fundación para la Universitat Oberta de Catalunya),
no hagáis de ellos un uso comercial y ni obra derivada. La licencia completa se puede consultar en http://creativecommons.org/
licenses/by-nc-nd/3.0/es/legalcode.es
CC-BY-NC-ND • PID_00220488 Manipulando el DOM con JavaScript
Índice
2. Formularios dinámicos..................................................................... 21
2.1. Control del cursor y del foco ..................................................... 21
2.1.1. Enviar el cursor a un campo determinado .................... 22
2.1.2. Avanzar el foco mediante la tecla intro ........................ 23
2.1.3. Enviar formularios con la tecla Intro ............................ 24
2.1.4. Tabulación automática .................................................. 25
2.2. Control de los campos del formulario ........................................ 26
2.2.1. Desactivar campos ......................................................... 26
2.2.2. Ocultar y mostrar controles .......................................... 26
2.2.3. Permitir sólo un tipo de datos en un campo ................. 28
2.3. Validación de campos ................................................................. 31
3. Posicionamiento dinámico.............................................................. 36
3.1. Propiedades CSS de posicionamiento ......................................... 36
3.2. Un poco de historia: Navegadores 4.x ........................................ 38
3.2.1. Capas en Netscape 4 ...................................................... 38
3.2.2. Capas en Internet Explorer 4 ........................................ 40
3.3. CSS-P en navegadores DOM W3C .............................................. 41
3.4. Posicionamiento cross-platform ................................................. 41
3.4.1. Detección del navegador ............................................... 42
3.5. Fundamentos de la animación ................................................... 43
3.5.1. Posicionamiento ............................................................ 44
CC-BY-NC-ND • PID_00220488 Manipulando el DOM con JavaScript
Actividades.................................................................................................. 57
CC-BY-NC-ND • PID_00220488 5 Manipulando el DOM con JavaScript
El hecho anterior obliga a que el programador web sea consciente de que algún
código puede funcionar de manera distinta o simplemente no funcionar en
cierta versión del navegador de un fabricante determinado; por ello, es muy
importante que se pueda conocer, antes de ejecutar un script, cuál es el cliente
que lo interpretará.
donde "subcadena" debe ser substituido por la subcadena del navegador que
se quiera consultar.
El mismo código anterior puede servir para detectar el sistema operativo sobre
el que se ejecuta el navegador, ya que éste se identifica en la cadena que de-
vuelve el método userAgent.
Web recomendada
var ficheroCSS;
if (document.implementation.hasFeature("CSS2","2.0")){
ficheroCSS = "estiloCSS2.css";
} else {
ficheroCSS = "estiloCSS1.css";
}
document.write(" ");("<link rel='stylesheet' type='text/css' href='"+ficheroCSS +"'>");
El abuso de las ventanas emergentes ha llegado a tal punto que los navegadores
actuales disponen de una utilidad para bloquearlas configurable por el usuario.
Esto ya indica que de cara a realizar una programación con un cierto nivel de
usabilidad, se debe intentar evitar el uso de ventanas emergentes e incluir en
la ventana actual todo el contenido.
<html>
<head>
<script type="text/javascript">
function abraF()
{
ventana=window.open('','','width=200,height=100');
ventana.document.write("<p>Mi ventana </p>");
CC-BY-NC-ND • PID_00220488 9 Manipulando el DOM con JavaScript
function maximiza()
{
ventana.moveTo(0,0);
ventana.resizeTo(screen.availWidth,screen.availHeight);
ventana.focus();
}
</script>
</head>
<body>
</body>
</html>
var nuevaVentana;
function traeLaVentana(url){
if (!nuevaVentana || nuevaVentana.closed) {
nuevaVentana = window.open(url, "Nueva", "status, height=200, width=300");
} else {
nuevaVentana.focus();
}
}
<html>
<script type="text/JavaScript">
//Se define una variable global que almacenará una referencia a la ventana
var nuevaVentana;
//La siguiente función genera y llena de contenido la nueva ventana
function creaVentana(){
//Comprobamos que no esté creada
if (!nuevaVentana || nuevaVentana.closed) {
nuevaVentana = window.open("","Nueva", "status, height=200, width=300");
//Retrasamos la escritura 50 ms para evitar problemas
setTimeout("pintaVentana()",50);
} else if (nuevaVentana.focus) {
//La ventana está abierta y es accesible; se trae al primer plano
nuevaVentana.focus();
}
}
function pintaVentana(){
//Montamos el contenido de la nueva ventana
var contenido = "<html><head><title>Segunda ventana</title></head>";
CC-BY-NC-ND • PID_00220488 11 Manipulando el DOM con JavaScript
Respecto al código anterior, sólo cabe comentar que la llamada a la escritura del
contenido a la ventana recién creada se realiza utilizando el temporalizador, ya
que se puede dar el caso de que no se haya finalizado la creación de la pantalla
y ya se esté intentando pintar sobre ella (este efecto puede darse debido a la
ejecución en paralelo del código que se da en los nuevos navegadores).
Otro aspecto que se debe tener en cuenta es que la variable nuevaVentana al-
macena una referencia a la ventana recién creada y es el mecanismo de acceso
a la nueva ventana desde la principal.
window.opener.document.forms[0].BT1.value
Igual que ocurre con las ventanas modales, el uso de marcos también ha ge-
nerado controversia por parte de los programadores. Las características de los
marcos los hacen útiles en algunos casos específicos. La aplicación más común
es la de dividir la página en un marco de contenido y un pequeño marco en el
que se situará el índice. Con esta estructura, el usuario navega por el marco de
contenido guardando el marco de índice de manera estable (incluso se puede
utilizar como contenedor de ciertas variables que deben permanecer).
Los marcos son, a su vez, un objeto Window y, por lo tanto, se pueden utilizar
las propiedades y métodos del objeto Window. Respecto al acceso a los marcos,
éste se puede implementar a partir del array frames[ ] del objeto Window, que
contiene una referencia a cada uno de los marcos que se han definido.
<html>
<head>
<script type="text/JavaScript">
function marcoVacio(){
return "<html><body></body></html>";
}
</script>
</head>
<frameset rows="50,*">
<frame name="frame1" id="frame1" src="menu.html">
<frame name="frame2" id="frame2"
src="JavaScript:parent.marcoVacio()">
</frameset>
</html>
if (top.location.href == self.location.href) {
top.location.href ="conjuntoMarcos.html";}
CC-BY-NC-ND • PID_00220488 14 Manipulando el DOM con JavaScript
El código compara los URL de las ventanas referidas como top y self; si son la
misma, significa que el documento es el único que se carga en la ventana del
navegador y, por lo tanto, la estructura de frames ocupa la página inicial del
navegador y no está cargada en un marco.
parent.otroFrame.location.href = "nuevaPagina";
Por lo tanto, se puede llamar a la anterior función con los dos parámetros que
indican las páginas web que se cargarán en cada uno de los marcos. La función
puede ser variada a gusto del programador para introducir más parámetros (se
podrían pasar como parámetro los nombres de los frames) e incluso se podrían
modificar para que cargaran el contenido HTML a partir de código JavaScript.
CC-BY-NC-ND • PID_00220488 15 Manipulando el DOM con JavaScript
top.location.href = "nuevaPagina.html"
if (top != self) {
top.location.href = location.href;
}
De hecho, el anterior código puede utilizarse para evitar que una estructura de
marcos se cargue en un marco de otra estructura de marcos. Para ello, el código
anterior sólo debería cargarse en la página que define la estructura de marcos.
Desde el script, se quiere forzar la carga de una nueva página web, es decir,
se quiere forzar la navegación al siguiente destino (seguramente como conse-
cuencia de un evento de usuario o de navegador). Para realizar la carga de la
nueva página en la ventana del navegador o marco actual, simplemente se
asigna el URL a la propiedad location.href:
location.href = "http://www.uoc.edu";
location.hash = "fase3";
</select>
function navega(eleccion){
var url = destinos.options[destinos.selectedIndex].value;
if (url) {
location.href = url;
}
}
En el caso de que se quiera utilizar la sintaxis del DOM estándar, se puede rea- Nota
lizar, en primer lugar, la asignación del evento al objeto Select de la siguiente
Hay que tener en cuenta que
manera: esta asignación hay que ha-
cerla después de la creación
del objeto Select "destinos",
document.getElementById("destinos").onchange = navega; ya que en caso contrario se es-
taría haciendo referencia a un
objeto que aún no existe.
y la función manejadora se puede reescribir de modo que utilice el objeto
Event y que sea compatible tanto con el modelo de objetos del DOM estándar
como con IE, de la siguiente manera:
function navega(evento){
evento=(evento) ? evento : ((event) ? event : null);
if (evento) {
var elemento = (evento.target) ? evento.target : ((evento.srcElement) ?
evento.srcElement : null);
if (elemento && elemento.tagName.toLowerCase() == "select" && elemento.value) {
location.href = elemento.value;
}
}
}
Una primera técnica que permite el paso de valores o variables entre distintas Ved también
páginas utiliza una combinación entre las funciones de manejo de cookies y
Las funciones de manejo de
los eventos onunload y onload del objeto Document. cookies fueron tratadas en el
apartado 4 del módulo "Orien-
tación a objetos en JavaScript"
A continuación, se presenta un ejemplo en el que se almacena el valor de un de esta asignatura.
<script type="text/JavaScript">
function guardaDatos() {
var datos = document.forms[0].nombre.value;
CC-BY-NC-ND • PID_00220488 18 Manipulando el DOM con JavaScript
asignaCookie("Nombre",datos,30);
}
</script>
El principal problema que puede surgir al utilizar cookies son las posibles op-
ciones en la configuración de seguridad del navegador del cliente.
<body onunload="almacenaDatos()">
<script type="text/JavaScript">
function leeValores(){
if (typeof top.nombre != "undefined") {
document.forms[0].nombre.value = top.nombre;
}
}
</script>
<body onload="leeValores()">
Para finalizar este subapartado, una de las técnicas más utilizadas se basa en el
paso de las variables mediante el URL que abre la nueva página. Estos datos se
pasarán como una cadena de búsqueda que se añadirá al URL de la siguiente
página y se incluirá un script en la página posterior que se encargará de leer
la cadena de búsqueda y recuperar los datos.
<script type="text/JavaScript">
function navega(url) {
var datosApasar = document.forms[0].nombre.value;
location.href = url + "?" + encodeURIComponent(datosApasar);
}
</script>
<script type="text/JavaScript">
function leeDatos() {
var buscaCadena = decodeURIComponent(location.search.substring(1,
location.search.length));
if (buscaCadena.length > 0) {
document.forms[0].userName.value = buscaCadena;
}
}
</script>
<body onload="leeDatos()">
2. Formularios dinámicos
En este apartado se van a estudiar algunas técnicas que permitirán realizar las
acciones básicas en el manejo de formularios; en particular, se verán técnicas
relacionadas con:
Cuando se entra en la web de Google, el usuario sólo debe introducir las cade-
nas clave que buscar y pulsar la tecla Intro. Se trata de un proceso muy simple y
es uno de los factores del éxito de Google, pero detrás de este funcionamiento
existe código que hace que el campo de texto de búsqueda reciba el foco en
cuanto se abra la página de inicio.
El código que envía el cursor al primer campo de texto del formulario es muy
simple. En el ejemplo que se presenta a continuación, el código se enlaza al
manejador del evento onload del objeto Document, ya que de esta manera,
una vez cargada la página web, la primera acción que se realizará será mover
el foco al campo de destino:
<body onload="document.formulario.campo.focus()">
<body onload="document.formulario.campo.focus();
document.formulario.campo.select()">
Los métodos que permiten estas acciones son focus() y select(), pero deben ser
llamados en un cierto punto del código (desde la función de validación). Para
ello, a continuación, se plantea una función que encapsula estos dos métodos:
Sobre la función anterior, se debe tener en cuenta que es válida para campos
de tipo texto, ya que en el caso de botones de opción o listas desplegables la
selección del contenido no tiene ningún sentido.
El movimiento entre los distintos campos del formulario se realiza con la tecla
de tabulación, pero el usuario está más habituado al uso de la tecla Intro, por
lo que a continuación se va a presentar una técnica que permite navegar por
los distintos campos del formulario utilizando la tecla Intro.
Se utiliza el evento keypress en cada campo desde el que debe avanzar el foco
a otro campo del formulario. El manejador de eventos llamará a la función
siguienteFoco(), que se presenta a continuación:
Por lo tanto, en el último campo del formulario se deberá llamar a una función
que acabe con una llamada al método submit() del objeto Form. A continua-
ción, se presenta un ejemplo de esta función:
<html>
<head>
</head>
<body>
<form id="formulari">
<P>
<LABEL for="nombre">Nombre: </LABEL>
<INPUT type="text" id="nombre"><BR>
<LABEL for="apellido">Apellido: </LABEL>
<INPUT type="text" id="apellido"><BR>
<LABEL for="email">email: </LABEL>
<INPUT type="text" id="email"><BR>
<INPUT type="radio" name="sexo" value="Varón" onkeypress="return tramesaAmbEnter(event)">
Varón<BR>
<INPUT type="radio" name="sexo" value="Mujer" onkeypress="return tramesaAmbEnter(event)">
Mujer<BR>
</P>
</form>
<script type="text/javascript">
function envioConEnter(evt){
evt = (evt) ? evt : event;
var destino = (evt.target) ? evt.target : evt.srcElement;
var codCaracter = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
if (codCaracter == 13 || codCaracter == 3) {
formulari.submit();
}
}
</script>
</body>
</html>
onkeypress="return envioConEnter(event)"
Un detalle que considerar es que el objeto Form debe tener definido el mane-
jador de eventos onsubmit="return false", ya que de esta manera se obliga a
que sólo el método submit() del script sea capaz de realizar el envío.
Existen formularios en los que cierta información se introduce en un conjunto Campos de texto con
combinado de campos de texto, que se caracterizan por una longitud definida longitud definida
<html>
<head>
</head>
<body>
<form id="formulario" onsubmit="return false">
Número de la tarjeta:
<input type="text" id="nt1" size="5" maxlength="4" onkeyup="mouFocus(this, 'nt2', event)" />
<input type="text" id="nt2" size="5" maxlength="4" onkeyup="mouFocus(this, 'nt3', event)" />
<input type="text" id="nt3" size="5" maxlength="4" onkeyup="mouFocus(this, 'nt4', event)" />
<input type="text" id="nt4" size="5" maxlength="4" />
</form>
<script type="text/javascript">
</script>
</body>
</html>
En este subapartado, se van a estudiar los dos mecanismos que permiten des-
activar y ocultar campos mediante unos ejemplos sencillos.
document.formulario.campoTexto.disabled = true;
document.formulario.campoTexto.disabled = false;
<form name="cuestionario">
CC-BY-NC-ND • PID_00220488 27 Manipulando el DOM con JavaScript
...
<p>3. ¿Quieres conocer los nuevos modelos?<br />
<input type="radio" id="resp0" name="respuesta" onclick="gestDecision(event)"
/>No
<input type="radio" id="resp1" name="respuesta" onclick="gestDecision(event)"
/>Si
<div id="conocerModelos" style="display:none; margin-left:20px">
</p>
<p>
3a. ¿Cuál es tu marca preferida?
<select name="modelos">
<option value="">Elige uno:</option>
<option value="1">Ferrari</option>
<option value="2">Mercedes</option>
<option value="3">BMW</option>
</select>
</p>
</div>
<p>4. ¿Cuántos años tiene tu actual vehículo?
<select name="edadVehiculo">
<option value="">Elige una opción:</option>
<option value="1">Menos de 3 años:</option>
<option value="2">Entre 3 y 7 años</option>
<option value="3">Más de 7 años</option>
</select>
</p>
...
</form>
function gestDecision(evt) {
evt = (evt) ? evt : event;
var campo = (evt.target) ? evt.target : evt.srcElement;
var capa = document.getElementById("conocerModelos");
if (campo.id =="resp1") {
capa.style.display = "block";
} else {
capa.style.display = "none";
}
}
CC-BY-NC-ND • PID_00220488 28 Manipulando el DOM con JavaScript
function soloNumeros(evt){
evt = (evt) ? evt : event;
var codCaracter = (evt.keyCode) ? evt.keyCode : (evt.wich) ?
evt.which : 0;
if (codCaracter > 31 && (codCaracter < 48 || codCaracter > 57)) {
alert("Introduce sólo valores numéricos!!!");
return false;
}
return true;
}
function soloLetras(evt){
evt = (evt) ? evt : event;
var codCaracter = (evt.keyCode) ? evt.keyCode : (evt.which) ?
evt.which : 0;
if (codCaracter > 31 && (codCaracter < 65 || codCaracter > 90) && (codCaracter <
97 || codCaracter > 122)) {
alert("Introduce sólo letras!!!");
return false;
}
return true;
}
CC-BY-NC-ND • PID_00220488 29 Manipulando el DOM con JavaScript
La misma estructura de función sirve para definir una función que obligue a la
entrada de ciertos valores simples, como "Y" o "N", "0" o "1", o cualquier com-
binación que se defina. Por ejemplo, la siguiente función sólo permite la in-
troducción de los valores "Y" o "N", tanto en mayúsculas como en minúsculas:
function soloYoN(evt){
evt = (evt) ? evt : event;
var codCaracter = (evt.keyCode) ? evt.keyCode : (evt.which) ? evt.which : 0;
if (codCaracter > 31 && codCaracter != 78 && codCaracter != 89 &&
codCaracter != 110 && codCaracter != 121) {
alert("Introduce sólo los valores 'Y' o 'N'");
return false;
}
return true;
}
Nombre Dec Hex Car. Dec Hex Car. Dec Hex Car. Dec Hex Car.
Inicio de 1 01 SOH 33 21 ! 65 41 A 97 61 a
cabecera
Fin de 3 03 ETX 35 23 # 67 43 C 99 63 c
texto
backspa- 8 08 BS 40 28 ( 72 48 H 104 68 h
ce
CC-BY-NC-ND • PID_00220488 30 Manipulando el DOM con JavaScript
Nombre Dec Hex Car. Dec Hex Car. Dec Hex Car. Dec Hex Car.
Tabula- 9 09 HT 41 29 ) 73 49 I 105 69 i
dor hori-
zontal
Salto de 10 0A LF 42 2A * 74 4A J 106 6A j
línea
Tabula- 11 0B VT 43 2B + 75 4B K 107 6B k
dor ver-
tical
Salto de 12 0C FF 44 2C , 76 4C L 108 6C l
página
Retorno 13 0D CR 45 2D - 77 4D M 109 6D m
de carro
Shift 15 0F SI 47 2F / 79 4F O 111 6F o
dentro
Nombre Dec Hex Car. Dec Hex Car. Dec Hex Car. Dec Hex Car.
Separa- 29 1D GS 61 3D = 93 5D ] 125 7D }
dor gru-
pos
function noVacio(elem) {
var cadena = elem.value;
if(cadena == null || cadena.length == 0) {
alert("Atención, el campo es obligatorio.")
return false;
} else {
return true;
}
CC-BY-NC-ND • PID_00220488 32 Manipulando el DOM con JavaScript
La función anterior realiza dos validaciones sobre el contenido del campo: que
contenga un valor nulo o una cadena de texto vacía, ya que se trata de dos
opciones similares pero ambas se deben comprobar.
function esNumerico(elem) {
var cadena = elem.value;
var unDecimal = false;
var unCaracter = 0;
//Se asegura que el contenido está en formato string
cadena = cadena.toString();
for (var i = 0; i < cadena.length; i++) {
unCaracter = cadena.charAt(i).charCodeAt(0);
// Se comprueba si tiene un signo negativo en el primer carácter
if (unCaracter == 45) {
if (i == 0) {
continue;
} else {
alert("Sólo el primer caracter puede ser el signo negativo.");
return false;
}
}
// Se comprueba el punto decimal
if (unCaracter == 46) {
if (!unDecimal) {
unDecimal = true;
continue;
} else {
alert("Sólo un.decimal en un número.");
return false;
}
}
//No se admiten caracteres fuera del rango 0-9
if (unCaracter < 48 || unCaracter > 57) {
alert("Introduce sólo números.");
return false;
}
}
return true;
}
CC-BY-NC-ND • PID_00220488 33 Manipulando el DOM con JavaScript
function longitud(elem,long) {
var cadena = elem.value;
var long = parseInt(long);
if (cadena.length != long) {
alert("El campo no contiene los "+ long +" caracteres requeridos");
return false;
} else {
return true;
}
}
function esCorreoE(elem) {
var cadena = elem.value;
cadena = cadena.toLowerCase();
if (cadena.indexOf("@") > 1) {
var addr = cadena.substring(0, cadena.indexOf("@"));
var dominio = cadena.substring(cadena.indexOf("@") + 1, cadena.length);
// Al menos es necesario un dominio en la cadena de la dirección
if (dominio.indexOf(".") == -1) {
alert("Verifica que el dominio sea correcto");
return false;
}
// Se revisa carácter por carácter
for (var i = 0; i < addr.length; i++) {
unCaracter = addr.charAt(i).charCodeAt(0);
// El punto no esta permitido en esta porción
if ((i == 0 && (unCaracter == 45 || unCaracter == 46)) ||
(i == addr.length - 1 && unCaracter == 46)) {
alert("Verifica la porción del nombre de usuario");
return false;
}
//Se comprueban caracteres validos (- . _ 0-9 a-z)
if (unCaracter == 45 || unCaracter == 46 || unCaracter == 95 ||
(unCaracter > 47 && unCaracter < 58) ||
CC-BY-NC-ND • PID_00220488 34 Manipulando el DOM con JavaScript
3. Posicionamiento dinámico
1)�position
• absolute: este valor provoca que el elemento queda fuera del flujo de HTML
y su posición queda relativa a la esquina superior izquierda de la página.
CC-BY-NC-ND • PID_00220488 37 Manipulando el DOM con JavaScript
Los objetos pueden quedar superpuestos sobre otros elementos del flujo
de la página.
• relative: este valor provoca que el elemento ocupe el mismo lugar que
ocuparía si no estuviera posicionado y se desplaza de su posición el valor
que se indique.
2)�top�y�left
Estos dos valores definen la posición de la capa, de manera que se define desde
la parte superior izquierda de la región que lo incluye (normalmente la región
coincide con la ventana del navegador).
3)�height�y�width
4)�clip
La región se define indicando las propiedades top, right, bottom y left del
rectángulo, que deben ser indicadas en píxeles y tomar como referencia el
elemento contenedor y no la página completa. La sintaxis es la siguiente:
Se debe tener en cuenta que el espacio reservado para toda la capa se mantiene
inalterado, aunque no sea visible. Además, es posible mover el clip modifican-
do los parámetros de posicionamiento de la capa sobre la que está definido
para conseguir el efecto deseado.
5)�visibility
6)�z-index
Con la aparición de CSS-P en los navegadores 4.x, la mayor parte de los pro-
blemas fueron debidos a que Netscape 4 introdujo una etiqueta propietaria
<layer> que no era compatible con IE 4 y que fue abandonada en las poste-
riores versiones del navegador.
Propiedad Descripción
clip Referencia al objeto clip de recorte de la capa. Este objeto se define con las pro-
piedades top, right, bottom y left.
<div id="capaNN" style="position: absolute; top: 100px; left: 100px; width: 100px;
height: 50px; background-color: #ffff99">Capa creada con div!</div>
De hecho, el acceso a las capas creadas con la etiqueta <div> se realizaba uti-
lizando la colección layers[ ]. Por ejemplo, el acceso a la capa anterior se rea-
lizaba con la siguiente sintaxis:
document.layers['capaNN'];
Pero, sin lugar a dudas, la característica que hizo perder terreno a Netscape
fue que éste no reflejaba de manera dinámica los cambios producidos en la
propiedad style, lo que implica que no se podían modificar las propiedades de
manera dinámica. Es decir, si se modificaba un atributo de la propiedad style
de la etiqueta <div> o cualquier propiedad de la etiqueta <layer> mediante
un script, esta modificación no se reflejaba en la página.
document.all['capaIE'].style.left += 10;
document.all['capaIE'].style.backgroundColor = 'orange';
Una de las características que hay que tener en cuenta cuando se usen los
atributos CSS en JavaScript es que la sintaxis de los atributos cambia cuando
éstos se utilizan desde JavaScript. Es decir, en el ejemplo anterior en la creación
de la etiqueta <div> se ha especificado el color de fondo mediante el atributo
background-color, mientras que en el código script esta propiedad del objeto
style se denomina backgroundColor.
background-color - backgroundColor
CC-BY-NC-ND • PID_00220488 41 Manipulando el DOM con JavaScript
El acceso a las capas en los navegadores que cumplen la especificación DOM de Ved también
W3C se realiza con métodos de acceso ya explicados. De esta manera, cuando
Los métodos de acceso a las
el nodo (o capa) ya está referenciado en una variable, la manipulación de sus capas en los navegadores que
atributos CSS se realiza a partir de su objeto style (de manera similar a la que cumplen la especificación
DOM de W3C se trataron en el
se implementó en Internet Explorer). apartado 2 del módulo "Intro-
ducción al DOM" de esta asig-
natura.
Por ejemplo, dada la siguiente capa:
<div id="capaDOM" style="position: absolute; top: 100px; left: 100px; width: 100px;
height: 100px; background-color: "#ffff99">Capa creada con div!</div>
document.getElementById("capaDOM").style.backgroundColor = "orange";
De esta manera, es posible manipular las propiedades del objeto style de cual-
quier objeto del documento, pero la manipulación de reglas definidas median-
te selectores en una hoja de estilo externa se realiza a partir de una colección
styleSheets[ ] definida en un objeto Document y que se especifica en el DOM2
para CSS. Mediante esta colección, se accede a las reglas de bloque definidas y
se manipulan directamente mediante los métodos insertRule() y deleteRule().
Como se ha visto en los subapartados anteriores, los mecanismos con los que
se accede y se interactúa con los objetos en Internet Explorer 4 y en Netscape 4
y en los navegadores basados en el DOM son distintos. Afortunadamente, este
problema tiene solución y además la solución es abierta, en el sentido de que,
si aparecen nuevos problemas con versiones posteriores de los navegadores,
se pueden tratar siguiendo la misma estrategia.
En el caso de que las funciones que se definen dependan del navegador que las
ejecute, se puede utilizar la técnica explicada en el apartado 1.1.1 para detectar
el navegador y utilizar una estructura condicional a las funciones.
function hide(nombreCapa) {}
function show(nombreCapa){}
function setX(nombreCapa,coorX){}
function setY(nombreCapa,coorY){}
function setZ(nombreCapa, indiceZ){}
function setHeight(nombreCapa, altura){}
function setWidth(nombreCapa, ancho){}
Para ello, en primer lugar se crea una función que es utilizada por las funciones
anteriores y cuyo objetivo es la asignación a una variable la referencia de la
capa, ya que cada navegador tiene un mecanismo distinto para realizar una
referencia a las capas:
function getElement(nombreCapa){
return document.getElementById(nombreCapa);
}
function hide(nombreCapa){
//Se recupera la referencia a la capa y se asigna el atributo hidden
var capa = getElement(nombreCapa);
capa.style.visibility = 'hidden';
}
function show(nombreCapa){
//Se recupera la referencia a la capa y se asigna el atributo visible
var capa = getElement(nombreCapa);
capa.style.visibility = 'visible';
}
function setX(nombreCapa,x){
//Se recupera la referencia a la capa y se asigna la coordenada
var capa = getElement(nombreCapa);
capa.style.left=x+"px";
}
CC-BY-NC-ND • PID_00220488 43 Manipulando el DOM con JavaScript
• Posicionamiento.
• Definición del recinto.
• Definición del movimiento.
• Temporalización.
3.5.1. Posicionamiento
function getX(nombreCapa){
var capa = getElement(nombreCapa);
return(parseInt(capa.style.left))
}
function getY(nombreCapa){
var capa = getElement(nombreCapa);
return(parseInt(capa.style.top))
}
posX = getX("bola");
setX("bola",posX+10);
paso = paso*-1;
actualizará paso al valor –10 invirtiendo con este simple código el sentido del
movimiento, tanto en horizontal como vertical.
Ahora bien, si la animación necesita que los movimientos en los sentidos ver-
tical y horizontal sean independientes, se pueden definir dos variables pasoX
y pasoY.
Otro aspecto que se debe considerar son los límites del recinto en los que se va
a realizar la animación, de manera que si se está programando una animación
autónoma (sin intervención del usuario), cuando la capa llegue al límite del
recinto ésta debe o bien situarse en otro extremo del recinto o bien cambiar el
sentido y/o dirección del movimiento (variable paso).
3.5.3. Temporalización
Por otra parte, en cierto momento será necesario que la función mueve() deje
de ejecutarse, y para ello se debe cancelar la función setInterval().
clearInterval(repite);
moverá la capa "capa1" desde la posicioón inicial (100, 100) hasta la posición
final (300, 300) siguiendo una línea recta y a 10 de velocidad.
La función anterior empieza con la creación del contenedor anima que se en-
carga de almacenar los valores para la animación. La llamada a la función ani-
maRecta() asigna los valores iniciales del objeto anima y a continuación relle-
na sus propiedades con los valores pasados como parámetros o calculados a
partir de éstos.
<ul class="menu">
<li><a href="#">Inicio</a></li>
<li><a href="#">Tipo y requisitos</a>
<ul>
<li><a href="#">Jubilación</a></li>
<li><a href="#">Pensión</a></li>
<li><a href="#">Jubilación por invalidez</a></li>
<li><a href="#">Jubilación por edad avanzada</a></li>
</ul>
</li>
<li><a href="#">Reajustes</a></li>
<li><a href="#">Contacto</a></li>
</ul>
Se utiliza CSS para aplicar formato. En primer lugar se sitúa cada elemento al
lado del otro y no debajo del otro, tal como se sitúan por defecto las listas. Al
elemento individual se le asigna el valor position:relative, para que, cuando una
nueva lista parta del elemento se pueda posicionar correctamente utilizando
position:absolute.
ul.menu {
float:right;
display:block;
margin-top: 38px;
list-style-type:none;
}
.menu li {
line-height:18px;
CC-BY-NC-ND • PID_00220488 51 Manipulando el DOM con JavaScript
font-size:13px;
position:relative;
float:left;
}
.menu li a {
color: #000;
text-transform:uppercase;
padding: 5px 20px;
text-decoration:none;
}
.menu li a:hover {
background: #9c0101;
color: white;
}
.menu li ul {
display:none;
position:absolute;
top:20px;
width: 240px;
background-color: #f4f4f4;
padding:0;
list-style-type:none;
}
.menu li ul li {
width: 200px;
border: 1px solid #9c0101;
border-top:none;
padding: 10px 20px;
}
.menu li ul li:first-child {
border-top: 1px solid #9c0101;
}
.menu li ul li a {
width: 240px;
margin: 0;
padding:0;
}
.menu li ul li a:hover {
width: 240px;
CC-BY-NC-ND • PID_00220488 52 Manipulando el DOM con JavaScript
margin: 0;
color: #9c0101;
background:none;
}
Introducción�jQuery:
Al igual que se han creado librerías a lo largo del curso, jQuery es una librería
JavaScript que simplifica el tratamiento de documentos HTML, el manejo de
eventos, la creación de animaciones y las interacciones vía Ajax. Además es
multiplataforma, de manera que está testada en los siguientes navegadores:
Internet Explorer 6.0+, FireFox 2.0+, Safari 2.0+, Opera 9.0+ y Chrome.
http://docs.jquery.com/Downloading_jQuery#Current_Release,
A partir de este momento ya se pueden utilizar las funciones jQuery. Las fun-
ciones básicas se presentan a continuación:
También incorpora métodos para modificar los atributos asociados a los com-
ponentes o nodos del árbol DOM:
<script type="text/javascript">
// la función ready asociada al documento asegura que el código se ejecuta
//cuando la página está totalmente cargada en el cliente
$(document).ready(function() {
//se obtienen todos los enlaces y se asocia una función al evento onclick
$("a").clic(function(event){
// cuando se produce el evento se asigna un estilo css de color de fondo en el enlace
$(this).css({backgroundColor:'red'});
});
});
</script>
El W3C define CSS como "un mecanismo simple para añadir estilo (por ejem-
plo, fuentes, colores, espacios) en documentos Web". Por lo tanto, las hojas de
estilo CSS (Cascading Style Sheets) son un mecanismo para aplicar formato a los
documentos HTML (y a documentos en otros lenguajes estructurados, como
XML), separando el contenido de las páginas de su apariencia.
El W3C, como no podía ser de otra manera, es el organismo que dicta también
los estándares sobre las CSS. Se empezó a discutir en 1995 sobre la utilización
de las hojas de estilo CSS para incluirlas en las especificaciones 3.0 del HTML,
pero las discusiones se extendieron tanto que al final se impusieron las exten-
siones propuestas por Netscape, lo que dio lugar a la versión 3.2 del HTML,
aunque la versión 3.0 del Explorer ya las soportaba en cierta medida.
Son muchos los motivos que llevan al programador de espacios web al uso de
hojas de estilo. A continuación, se enumeran los más destacados:
CC-BY-NC-ND • PID_00220488 55 Manipulando el DOM con JavaScript
En ciertas web se permite que los usuarios definan un "skin", que no es más
que el aspecto que tiene la web. Además, se puede implementar a partir de
carga de una nueva página CSS cuando el usuario seleccione el nuevo aspecto.
document.getElementById("estiloPorDefecto").href="estiloNuevo.css";
Por otra parte, es posible activar o desactivar una hoja de estilo de la página;
para ello se utiliza la propiedad disabled del objeto StyleSheet:
document.styleSheets[1].disabled = true;
Actividades
Seleccionad 5 ejemplos de la siguiente página web:
http://www.htmlpoint.com/dhtml/index.html
Implementadlos y comentad en el foro los problemas con los que os habéis encontrado y las
características interesantes que habéis descubierto.