Академический Документы
Профессиональный Документы
Культура Документы
DHTML tiene por objetivo aumentar la funcionalidad de un sitio web. Se puede utilizar para crear animaciones, menes desplegables, mostrar y ocultar partes de una pgina luego que la pgina fue cargada completamente, crear un entramado de capas que con slo el HTML y CSS sera imposible alcanzar. Si bien la funcionalidad de DHTML se puede duplicar con otras herramientas como los Applet de Java o Flash, el DHTML ofrece la ventaja de que no requiere ningn tipo de plug-in para poder utilizarlo. DHTML ofrece a los creadores de pginas web la posibilidad de modificar, cambiar la apariencia, ocultar, mostrar y animar el contenido dinmicamente. Con DHTML podemos, luego de cargada la pgina en el navegador, acceder a cada una de las marcas HTML modificar sus atributos, ocultarlas, volverlas a mostrar y acceder al estilo definido para dicha marca. Debe quedar bien en claro que DHTML no es un lenguaje nuevo sino la combinacin de HTML, CSS y JavaScript. El DHTML es otro de los escalones que debemos dominar para poder introducirnos en el mundo de AJAX.
Por otro lado definimos el archivo estilos.css: #titulo { text-align:center; } #boton1,#boton2 { text-align:center; width:200px; } y el archivo funciones.js:
function cambiarColor() {
En este ejemplo el nodo body tiene 4 hijos, la marca h1 tiene 1 hijo, lo mismo cada marca li tienen un hijo. Los nodos que no tienen descendientes son los nodos hoja. El DOM provee a cada nodo de un vector que almacena la referencia a cada nodo hijo, la propiedad se llama: childNodes Este vector almacena una referencia a cada nodo hijo. <html> <head> <title>Problema</title> <script language="javascript" src="funciones.js" type="text/javascript"></script> </head> <body>
Es importante notar que slo definimos la propiedad id para la marca div, ya que teniendo la referencia de ste podemos acceder a los tres hijos (los tres prrafos).
<div id="bloque"> <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="Cambiar colores" onClick="cambiarColores()"> </body> </html> El archivo javascript funciones.js es el siguiente: function cambiarColores() { var lista=document.getElementById('bloque');
Solucion
<div id="bloque1"><p>Este es el primer prrafo</p><p>Este es el segundo prrafo</p><p>Este es el tercer prrafo</p></div>
Como ya hemos visto rescatamos la referencia a la marca h1 por medio de la funcin getElementById, luego mediante la propiedad childNodes accedemos a la primer componente que tiene la referencia al nodo de tipo texto. Por ltimo asignamos el nuevo texto a la propiedad nodeValue.
y y y
Obtenemos la referencia del prrafo: Ahora accedemos a la propiedad parentNode de la variable inicializada previamente: Finalmente modificamos el color del div:
El mtodo nextSibling retorna la referencia del nodo que se encuentra inmediatamente ms abajo pero a la misma altura un mtodo llamado previusSibling que retorna la referencia del nodo que se encuentra inmediatamente ms arriba nextSibling y previusSibling retornan null en caso de no existir ms nodos en dicho nivel.
} Si queremos la referencia a todas las marcas de la pgina lo hacemos : var lista=document.getElementsByTagName('p'); Si queremos la referencia a todas las marcas similares contenidas en un div lo hacemos: var obj=document.getElementById("bloque2"); var lista=obj.getElementsByTagName('p');
function insertarEnMedio() { var elemento=document.createElement('p'); var nodotexto=document.createTextNode('Prrafo entre segundo y tercero'); elemento.appendChild(nodotexto); var puntero=document.getElementById('p3'); var pa=document.getElementById('parrafos'); pa.insertBefore(elemento,puntero); }
var nuevos=id.cloneNode(true); Ahora es importante tener en cuenta que los nodos clonados tienen el mismo valor en la propiedad id por lo que debemos modificrsela: nuevos.style.id='enlaces'+orden; orden++; id=document.getElementById("enlacesnuevos"); id.appendChild(nuevos); }
<html> <head> <title>Problema</title> <script language="javascript" src="funciones.js" type="text/javascript"></script> <link rel="StyleSheet" href="estilos.css" type="text/css"> </head> <body> <p id="recuadro">Quin descubri Amrica y en que ao fue?</p> Color de fondo: <select onChange="cambiarColorFondo()" id="colorfondo"> <option value="#ffff00">amarillo</option> <option value="#ff0000">rojo</option> <option value="#00ff00">verde</option> <option value="#0000ff">azul</option> </select> estilos.css #recuadro { background-color:#ffff00; border:1px solid #000000; font-size:10px; } funciones.js function cambiarColorFondo() { var pun=document.getElementById('colorfondo'); var punrec=document.getElementById('recuadro'); punrec.style.backgroundColor=pun.value; } Primero obtenemos una referencia al control select: Luego obtenemos una referencia al prrafo: Por ltimo, mediante la referencia al prrafo, accedemos a la propiedad style y mediante sta, a la propiedad CSS respectiva, mediante la propiedad value del select extraemos el valor seleccionado:
Podemos solucionar esta situacin disponiendo un botn para crear un elemento de tipo input cada vez que sea presionado.
<body> <form method="post"> Ingrese su nombre: <input type="text" name="nombre" id="nombre"><br> <fieldset id="fs"> <legend>Ingrese los nombres de sus hijos</legend> <input type="button" onclick="agregarHijo()" value="Presione el botn para agregar un hijo."> <br> </fieldset> <input type="submit" value="Registrar"> </form> </body> funciones.js var cantidad = 0; function agregarHijo() { cantidad++; var nuevohijo = document.createElement('input'); nuevohijo.type = 'text'; nuevohijo.name = 'nombre' + cantidad; nuevohijo.id = 'nombre' + cantidad; document.getElementById('fs').appendChild(nuevohijo); document.getElementById('fs').appendChild(document.createElement('br')); }
Evento onclick
<body> <p onclick="presionParrafo()">Esto es un prrafo<p> <table border="1"> <tr> <td onclick="presionCasilla11()">casilla 1,1</td><td>casilla 1,2</td> </tr> <tr> <td>casilla 2,1</td><td>casilla 2,2</td> </tr> </table> <input type="button" value="botn" onclick="presionBoton()"> </body> El archivo funciones.js es: function presionParrafo() { alert('se presion el prrafo'); } function presionCasilla11() { alert('se presion la casilla 1,1'); } function presionBoton() { alert('se presion el botn'); }
Cuando tenemos varios objetos que generan eventos y todos se asocian con una nica funcin podemos pasar en la llamada a la funcin la referencia del objeto que emite el evento, esto mediante la palabra clave this. <body> <h1 id="titulo">Datos del objeto que emite el evento.</h1> <input type="button" name="boton1" value="boton 1" id="b1" onclick="mostrarAtributos(this)"> <br> <input type="button" name="boton2" value="boton 2" id="b2" onclick="mostrarAtributos(this)"> </body> funciones.js function mostrarAtributos(objeto)
{ var ref=document.getElementById('titulo'); ref.firstChild.nodeValue='Name:'+objeto.name+' Id:'+objeto.id+' Value:'+objeto.value; accedemos a su nodo hijo (es decir al nodo de texto) para mostrar la informacion sobre las propiedades del objeto que gener el evento: }
Eventos onmousedown,onmouseup
El evento onmousedown se dispara cuando presionamos alguno de los botones del mouse y el evento onmouseup cuando dejamos de presionar el botn. <body> <table border="1"> <tr> <td onmousedown="presionar(this)" onmouseup="levantar(this)">Recuadro 1</td><td onmousedown="presionar(this)" onmouseup="levantar(this)">Recuadro 2</td> </tr> </table> </body> funciones.js function presionar(objeto) { objeto.style.background='#ff0'; } function levantar(objeto) { objeto.style.background='#fff'; }
Evento ondblclick
El evento ondblclick se dispara cuando se presiona dos veces seguidas el botn izquierdo del mouse. <body> <div id="recuadro" ondblclick="ocultar(this)"> <h1>Doble clic para ocultar este recuadro</h1> </div> </body> estilos.css #recuadro { color:#aa0; background-color:#ff0; position:absolute; text-align:center; left:40px; top:30px; width:800px; height:70px; } funciones.js function ocultar(objeto)
{ objeto.style.display='none'; } Para ocultar el div accedemos a la propiedad display y le asignamos el valor none.
Evento onmousemove
Este evento se dispara cuando se mueve la flecha del mouse dentro del elemento HTML respectivo. <body id="region" onmousemove="mover(event)"> <p id="corx">coordenada x=</p> <p id="cory">coordenada y=</p> </body> funciones.js function mover(e) { var corx=document.getElementById('corx'); var cory=document.getElementById('cory'); if (window.event) { corx.firstChild.nodeValue='coordenada x='+window.event.clientX; cory.firstChild.nodeValue='coordenada y='+window.event.clientY; } else { corx.firstChild.nodeValue='coordenada x='+e.clientX; cory.firstChild.nodeValue='coordenada y='+e.clientY; } }
Esta funcin la tienen incorporada casi todos los objetos del DOM (recordemos nuestro rbol) Para llamarla debemos hacerla a partir de la referencia de un objeto y pasarle tres parmetros: -El nombre del evento que queremos capturar (load,click,unload etc.) -El nombre de la funcin que se dispara cuando se produce el evento. -El tercer parametro un valor boolean que por ahora le pasaremos el valor false. <html> <head> <title>Problema</title> <script language="javascript" src="funciones.js" type="text/javascript"></script> </head> <body> Este sitio no funciona bien en el IE6. </body> </html> funciones.js window.addEventListener('load',ventanaBienvenida,false); function ventanaBienvenida(e) { var ventana=open('','','status=yes,width=400,height=250'); ventana.document.write("Bienvenido a este sitio."); } no hay ninguna llamada a funciones JavaScript en el archivo HTML, solo incluimos el archivo funciones.js: <script languaje="javascript" src="funciones.js" type="text/javascript"></script> Lo ms importante est ahora ubicado en el archivo funciones.js, fuera de cualquier funcin, es decir se ejecuta cuando comienza a cargarse la pgina es la llamada de la funcin addEventListener a partir del objeto window (recordemos que este objeto se crea automticamente): window.addEventListener('load',ventanaBienvenida,false); Le pasamos como referencia el evento que queremos capturar (load), debe ir entre comillas, el segundo parmetro es la funcin que debe ejecutarse cuando se dispare el evento load y false en el tercer parmetro. Es importante tener en cuenta que el nombre de la funcin no debe llevar parntesis de apertura y cerrado Donde codificamos la funcin debemos indicar un parmetro que contiene informacin til con respecto al evento que se a disparado (si bien en este problema no lo utilizamos en otros problemas ser de vital importancia
,
boton1.addEventListener('click',presionBoton1,false);
var boton2=document.getElementById('b2'); boton2.addEventListener('click',presionBoton2,false); } function presionBoton1(e) { var boton1=document.getElementById('b1'); alert(boton1.getAttribute('value')); } function presionBoton2(e) { var boton2=document.getElementById('b2'); alert(boton2.getAttribute('value')); }
La registracin de los eventos para cada botn lo hacemos en la funcin inicializarEventos (esto no es un capricho sino esto se debe que el navegador debe cargar toda la pgina en memoria para que se cree el rbol de elementos, de no hacerlo de esta manera el mtodo getElementById no retornar la referencia del botn ya que no est creado) Obtenemos la referencia al primer botn y nuevamente mediante el mtodo addEventListener registramos el evento click y la funcin a ejecutarse cuando sea presionado. Este proceso lo hacemos para los dos botones. Solo tienen el objetivo de obtener inicialmente la referencia del botn respectivo y llamar al mtodo getAttibute solicitando el atributo value.
La funcin que se dispara al producirse el evento recibe un parmetro con informacin referente a ese evento.
<body> <h1 id="titulo">Datos del objeto que emite el evento.</h1> <input type="button" name="boton1" value="boton 1" id="b1"> <br> <input type="button" name="boton2" value="boton 2" id="b2"> </body> funciones.js window.addEventListener('load',inicializarEventos,false); function inicializarEventos(e) { var boton1=document.getElementById('b1'); boton1.addEventListener('click',presionBoton,false); var boton2=document.getElementById('b2'); boton2.addEventListener('click',presionBoton,false); } function presionBoton(e) { var boton=e.target; var ref=document.getElementById('titulo'); ref.firstChild.nodeValue='Name:'+boton.name+' Id:'+boton.id+' Value:'+boton.value; } La funcin recibe un parmetro con detalles del evento, entre otros: target: Referencia del objeto que gener el evento(en nuestro problema la referencia del botn b1 o b2) type: El nombre del evento (en nuestro caso click) button: El botn del mouse presionado (0 = izquierdo, 1 = medio, 2 = derecho) keyCode: El caracter del teclado presionado (en caso que corresponda) shiftKey: true o false en caso de estar presionada esta tecla.
text-align:center; left:40px; top:30px; width:800px; height:70px; } funciones.js window.addEventListener('load',inicializarEventos,false); function inicializarEventos(e) { var recu=document.getElementById('recuadro'); recu.addEventListener('dblclick',ocultar,false); } function ocultar(e) { e.target.style.display='none'; }
En el modelo propuesto por Microsoft existe una funcin fundamental llamada: attachEvent Esta funcin la tienen incorporada casi todos los objetos del DOM (recordemos nuestro rbol) Para llamarla debemos hacerla a partir de la referencia de un objeto y pasarle dos parmetros: -El nombre del evento que queremos capturar (onload,onclick,onunload etc.) Es importante notar que debemos antecedirle las letras on a cada evento, esto difiere con la propuesta de la W3C. -El nombre de la funcin que se dispara cuando se produce el evento. <body> Este sitio no funciona bien en el FireFox. </body> funciones.js window.attachEvent('onload',ventanaBienvenida); function ventanaBienvenida() { var ventana=open('','','status=yes,width=400,height=250'); ventana.document.write("Bienvenido a este sitio."); }
funciones.js window.attachEvent('onload',inicializarEventos); function inicializarEventos() { var boton1=document.getElementById('b1'); boton1.attachEvent('onclick',presionBoton1); var boton2=document.getElementById('b2'); boton2.attachEvent('onclick',presionBoton2); } function presionBoton1() { var boton1=document.getElementById('b1'); alert(boton1.getAttribute('value')); } function presionBoton2() { var boton2=document.getElementById('b2'); alert(boton2.getAttribute('value')); }
Hay que tener bien en cuenta que en el Internet Explorer la funcin que se dispara cuando se produce el evento no recibe como parmetro los datos del evento sucedido en lugar de esto inicializa el atributo event del objeto window Los atributos ms importantes de la propiedad event del objeto window son:
var boton2=document.getElementById('b2'); boton2.attachEvent('click',presionBoton); } function presionBoton() { var boton=window.event.srcElement; var ref=document.getElementById('titulo'); ref.firstChild.nodeValue='Name:'+boton.name+' Id:'+boton.id+' Value:'+boton.value; }
function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
El primer parmetro "elemento" es la referencia del objeto que registrar el evento (window, un botn, la referencia de un div etc.), el segundo parmetro indica el nombre del evento a registrar (load, click, unload, dblclick, mouseover etc), el tercer parmetro la referencia de la funcin que se ejecutar cuando se produzca el evento y el ltimo parmetro un valor lgico (por ahora false) El primer if de la funcin verifica si nos encontramos en el navegador Internet Explorer: if (elemento.attachEvent) Es decir si el elemento tiene implementado el mtodo attachEvent significa que es el navegador de Microsoft. Procedemos entonces a llamar al mtodo attachEvent con los parmetros que llegan a la funcin. Por el else verificamos si se trata de un navegador compatible con la especificacin del DOM dada por la W3C: if (elemento.addEventListener) Si es verdadera esta condicin llamamos al mtodo addEventListener con los valores respectivos. <body> Este sitio funciona bien en FireFox e Internet Explorer. </body> </html> funciones.js addEvent(window,'load',ventanaBienvenida,false); function ventanaBienvenida() { var ventana=open('','','status=yes,width=400,height=250'); ventana.document.write("Bienvenido a este sitio."); } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; } El archivo HTML no sufre ningn cambio, esto debido a que todo el cdigo JavaScript se encuentra en un archivo separado llamado funciones.js. Fuera de cualquier funcin llamos a la funcin addEvent: addEvent(window,'load',ventanaBienvenida,false);
Es decir que cuando comienza a cargarse la pgina ya se registra el evento load del objeto window. Veamos que no llamamos a la funcin addEventListener o attachEvent, ya que eso lo hace la funcin addEvent.
{ if (window.event) { var ref=window.event.srcElement; ref.style.display='none'; } else if (e) { var ref=e.target; ref.style.display='none'; } } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
} function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
} } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
function presionTecla(e) { if (window.event) { extraemos la tecla presionada con: var tecla=window.event.keyCode; Si el valor de la tecla presionada es 32 (espacio en blanco) procedemos a mostrar un mensaje y a cancelar la accin por defecto que es agregar el caracter de espacio en blanco dentro del control: if (tecla==32) { window.event.returnValue=false; alert('No se puede ingresar espacios en blanco para un nombre de usuario'); } } else if (e) { extraemos la tecla presionada con: var tecla=e.which; Si el valor de la tecla presionada es 32 (espacio en blanco) procedemos a mostrar un mensaje y a cancelar la accin por defecto que es agregar el caracter de espacio en blanco dentro del control: if(tecla==32) { e.preventDefault(); alert('No se puede ingresar espacios en blanco para un nombre de usuario'); } } } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
var ob; if (window.event) ob=window.event.srcElement; else ob=e.target; alert('Se modific el control:'+ob.getAttribute('id')); } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
addEvent(window,'load',inicializarEventos,false); function inicializarEventos() { addEvent(window,'scroll',cambioScroll,false); } function cambioScroll(e) { var mensaje = document.getElementById("mensaje"); mensaje.style.top = document.body.scrollTop; } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; } Para conocer cual es el valor de scroll vertical la propiedad body del objeto document contiene la propiedad scrollTop. Este valor se lo asignamos a nuestro div. Tengamos en cuenta que si queremos recuperar el valor de scroll horizontal tenemos la propiedad: document.body.scrollLeft
window.event.altKey);
window.event.ctrlKey);
var nt=document.createTextNode('Tecla shift presionada (window.event.shiftKey) ? '+ ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('Nombre del evento (window.event.type) ? ' ob.appendChild(nt);
window.event.shiftKey);
+window.event.type);
insertarBR(ob); var nt=document.createTextNode('El elemento que causo el evento (window.event.srcElement) ? '+ window.event.srcElement); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada x del mouse respecto a la ventana (window.event.clientX) ? '+ window.event.clientX); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada y del mouse respecto a la ventana (window.event.clientY) ? '+ window.event.clientY); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada x del mouse respecto a la pantalla completa (window.event.screenX) ? '+ window.event.screenX); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada y del mouse respecto a la pantalla completa (window.event.screenY) ? '+ window.event.screenY); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada x del mouse respecto al comienzo de la pgina (window.event.offsetX) ? '+ window.event.offsetX); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada y del mouse respecto al comienzo de la pgina (window.event.offsetY) ? '+ window.event.offsetY); ob.appendChild(nt); insertarBR(ob); } function insertarBR(ob) { var elemento=document.createElement('br'); ob.appendChild(elemento); } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
function inicializarEventos() { var ob=document.getElementById('recuadro'); addEvent(ob,'click',presionMouse,false); } function presionMouse(e) { var ob=e.target; while (ob.hasChildNodes()) { ob.removeChild(ob.lastChild); } var nt=document.createTextNode('Tecla alt presionada (e.altKey) ? '+e.altKey); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('Tecla ctrl presionada (e.ctrlKey) ? '+e.ctrlKey); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('Tecla shift presionada (e.shiftKey) ? '+e.shiftKey); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('Nombre del evento (e.type) ? '+ e.type); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('El elemento que causo el evento (e.target) ? '+e.target); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada x del mouse respecto a la ventana (e.clientX) ? '+ e.clientX); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada y del mouse respecto a la ventana (e.clientY) ? '+ e.clientY); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada x del mouse respecto a la pantalla completa (e.screenX) ? '+ e.screenX); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada y del mouse respecto a la pantalla completa (e.screenY) ? '+ e.screenY); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada x del mouse respecto al comienzo de la pgina (e.pageX) ? '+ e.pageX); ob.appendChild(nt); insertarBR(ob); var nt=document.createTextNode('La coordenada y del mouse respecto al comienzo de la pgina (e.pageY) ? '+ e.pageY); ob.appendChild(nt); insertarBR(ob); } function insertarBR(ob) { var elemento=document.createElement('br'); ob.appendChild(elemento); } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; } Como podemos observar indicamos en el cuarto parmetro el valor false, con esto logramos que cuando se dispare el evento click primero lo capture el div interior y luego el div exterior. Luego: ob=document.getElementById('div2i'); addEvent(ob,'click',presionRecuadroInte,true); ob=document.getElementById('div2e'); addEvent(ob,'click',presionRecuadroExte,true); Si pasamos como parmetro a la funcin addEvent el valor true significar que si presionamos el botn del mouse dentro del div interior primero se dispara el evento del div exterior y por ltimo se dispara el evento click del div interior.
} function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; } Cuando ejecutemos la pgina veremos que cada vez que presionemos el mouse dentro del div interior nos mostrar primero el evento registrado para dicho objeto y luego el evento del div contenedor. Esto sucese para los dos div interiores. Esto debido a que el IE permite solo el burbujeo.
<body> <h1>Presione con el mouse en el recuadro interior</h1> <h3>Detencin del burbujeo.</h3> <div id="div1" class="recuadroexterior"> Este es contenido del recuadro exterior. <div id="div2" class="recuadrointerior"> Este es contenido del recuadro interior. </div> Tambin es contenido del recuadro exterior. </div> </body> </html> estilos.css .recuadrointerior { font-family:Courier; font-size:12px; background-color:#ffffcc; border-width:1px; border-style:dotted; border-color:#ffaa00; padding:20px; } .recuadroexterior { font-family:Courier; font-size:12px; background-color:#ff9900; border-width:1px; border-style:dotted; border-color:#ffaa00; padding:20px; } funciones.js addEvent(window,'load',inicializarEventos,false); function inicializarEventos() { var ob=document.getElementById('div1'); addEvent(ob,'click',presionRecuadroExte,false); ob=document.getElementById('div2'); addEvent(ob,'click',presionRecuadroInte,false); } function presionRecuadroInte(event) { alert('se presion el recuadro interior');
if (window.event) { window.event.cancelBubble=true; } else if (event) { event.stopPropagation(); } } function presionRecuadroExte() { alert('se presion el recuadro exterior'); } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
{ elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
Seguramente su popularidad se debe a que podemos ahorrar muchas lneas cuando tenemos que crear bloques con gran cantidad de elementos HTML. Esta propiedad crea automticamente todos los elementos HTML y nodos de texto que le indicamos. <body> Ingrese url:<input type="text" id="text1" value="http://www.lavoz.com.ar" size="30"><br> Ingrese url:<input type="text" id="text2" value="http://www.lanacion.com.ar" size="30"><br> <input type="button" value="Crear enlaces" id="boton1"> <h2>Mediante innerHTML</h2> <div id="enlaces1"> </div> <h2>Mediante mtodos propios del DOM</h2> <div id="enlaces2"> </div> </body> </html funciones.js addEvent(window,'load',inicializarEventos,false); function inicializarEventos() { var ob1=document.getElementById('boton1'); addEvent(ob1,'click',crearEnlaces,false); } function crearEnlaces(e) { //Utilizando el innerHTML var ob1=document.getElementById("enlaces1"); ob1.innerHTML='<a href="'+document.getElementById('text1').value+ '">Enlace 1</a><br>'+'<a href="'+ document.getElementById('text2').value+'">Enlace 2</a>'; //Utilizando los mtodos de DOM unicamente var elemento=document.createElement('a'); var puntero=document.getElementById('enlaces2'); puntero.appendChild(elemento); var nodotexto=document.createTextNode('Enlace 1'); elemento.appendChild(nodotexto); elemento.setAttribute('href',document.getElementById('text1').value); puntero.appendChild(document.createElement('br')); elemento=document.createElement('a'); puntero.appendChild(elemento); nodotexto=document.createTextNode('Enlace 2'); elemento.appendChild(nodotexto); elemento.setAttribute('href',document.getElementById('text2').value); } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; } Como vemos es muy tentadora esta propiedad: var ob1=document.getElementById("enlaces1"); ob1.innerHTML='<a href="'+document.getElementById('text1').value+ '">Enlace 1</a><br>'+'<a href="'+ document.getElementById('text2').value+'">Enlace 2</a>'; Luego la misma actividad pero utilizando los mtodos estndares tenemos: var elemento=document.createElement('a'); var puntero=document.getElementById('enlaces2');
puntero.appendChild(elemento); var nodotexto=document.createTextNode('Enlace 1'); elemento.appendChild(nodotexto); elemento.setAttribute('href',document.getElementById('text1').value); puntero.appendChild(document.createElement('br')); elemento=document.createElement('a'); puntero.appendChild(elemento); nodotexto=document.createTextNode('Enlace 2'); elemento.appendChild(nodotexto); elemento.setAttribute('href',document.getElementById('text2').value);
function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
</body> </html> estilos.css #error{ display:none; color:#f00; background-color:#ff0; font-size:15px; width:400px; border:1px solid #00f; padding:5px; } funciones.js addEvent(window,'load',inicializarEventos,false); function inicializarEventos() { var ob=document.getElementById('confirmar'); addEvent(ob,'click',validar,false); } function validar(e) { var er=document.getElementById('error'); borra todos los nodos de tipo elemento y de texto que tenga el cuadro de mensajes de error, esto es debido a que si comete varias veces el mismo error los mensajes se acumularan dentro del div: while (er.hasChildNodes()) { er.removeChild(er.lastChild); } var usu=document.getElementById('usuario'); var error=false; if (usu.value=='') { error=true; er.appendChild(document.createTextNode('Debe ingresar el nombre de usuario')); er.appendChild(document.createElement('br')); er.style.display='block'; } var cla=document.getElementById('clave'); if (cla.value=='') { error=true; var er=document.getElementById('error'); er.appendChild(document.createTextNode('Debe ingresar la clave.')); er.style.display='block'; } Luego si hay error desactivamos el evento por defecto para el botn submit: if (error) { if (window.event) window.event.returnValue=false; else e.preventDefault(); } } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
Mostrar un Tooltip
Recordemos que un Tooltip es un mensaje que aparece sobre un objeto cuando disponemos la flecha del mouse sobre el, este recuadro nos informa el objetivo de dicho control.
<div class="cuadradito" <div class="cuadradito" <div class="cuadradito" <div class="cuadradito" </body> </html>
es es es es
el el el el
El cdigo HTML no tiene nada de extrao, salvo inicializar la propiedad title de cada div (ese contenido aparecer en el Tooltip) estilos.css .cuadradito{ background-color: #f00; height: 50px; width: 50px; margin:3px; z-index: -1; } #divmensaje { background-color: yellow; position: absolute; visibility: hidden; padding: 5px; z-index: 100; } Por ltimo el archivo js es: addEvent(window,'load',inicializarEventos,false); function inicializarEventos() {
Primero obtenemos la referencia a todos los div de la pgina:
var vec=document.getElementsByTagName('div');
Definimos las funciones que se disparan para los eventos mouseover, mouseout y mousemove
function mostrarToolTip(e) { var d = document.getElementById("divmensaje"); d.style.visibility = "visible"; if (window.event) { e=window.event; texto=e.srcElement.getAttribute('title'); } else texto=e.target.getAttribute('title'); d.style.left = e.clientX + document.body.scrollLeft + 15; d.style.top = e.clientY + document.body.scrollTop + 15; if (d.childNodes.length>0) d.firstChild.nodeValue=texto; else { d.appendChild(document.createTextNode(texto)); } } function ocultarToolTip(e) {
var d = document.getElementById("divmensaje"); d.style.visibility = "hidden"; } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
function coordenadaX(e) { if (window.event) return event.clientX+document.body.scrollTop; else return e.pageX; } function coordenadaY(e) { if (window.event) return event.clientY+document.body.scrollTop; else return e.pageY; } la funcin inicioDrag que se dispara cuando seleccionamos el div, obtiene la coordenada del mouse dentro de la ventana y la posicin actual del div, almacena la diferencia que hay en pxeles entre estos dos valores. Adems registra los eventos mouseMove y mouseUp: function inicioDrag(e) { if (window.event) e=window.event; var eX=coordenadaX(e); var eY=coordenadaY(e); var oX=parseInt(div.style.left); var oY=parseInt(div.style.top); difX=oX-eX; difY=oY-eY; addEvent(document,'mousemove',drag,false); addEvent(document,'mouseup',soltar,false); } La funcin drag se dispara cada vez que mueve la flecha del mouse dentro del div, siempre y cuando se tenga el botn del mouse presionado: function drag(e) { if (window.event) e=window.event; tX=coordenadaY(e)+difY+'px'; tY=coordenadaX(e)+difX+'px'
div.style.top=tX; div.style.left=tY; }
Por ltimo, la funcin soltar se dispara cuando levantamos el dedo del botn del mouse, aqu removemos los eventos mouseMove y mouseUp: function soltar(e) { if (window.event) { document.detachEvent('onmousemove',drag); document.detachEvent('onmouseup',soltar); } else { document.removeEventListener('mousemove',drag,false); document.removeEventListener('mouseup',soltar,false); } } }
function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
slo debemos tener en cuenta la sintaxis de las listas HTML y hacer correctamente los anidamientos de listas:
Siempre dispondremos las listas dentro de un div al que le definimos su id. Luego, desde javascript, obtendremos la referencia de dicho id. Tengamos en cuenta tambin que no inicializamos la propiedad href de los hipervnculos que abren submenes. Ahora veamos lo ms importante que es el cdigo javascript que se encarga de ocultar o mostrar los submens. funciones.js
addEvent(window,'load',inicializarEventos,false); function inicializarEventos() { inicializarMenu('menu1');
} function inicializarMenu(m) { La funcin inicializarMenu primero obtiene la referencia del div que contiene el men: var ob=document.getElementById(m); Seguidamente obtenemos un vector con las referencias a todas las marcas html ul: var menu=ob.getElementsByTagName('ul'); la componente cero del vector tiene la referencia al men principal que siempre estar visible, por lo que al for siguiente lo inicializamos en 1 para saltear esta primer componente, luego dentro del for accedemos a la propiedad display y la fijamos con el valor 'none', con esto ocultamos todas las listas (menos la principal): for(f=1;f<menu.length;f++) { menu[f].style.display='none'; } Seguidamente obtenemos un vector con todos los enlaces del men y todos los submenes: var enlaces=ob.getElementsByTagName('a'); Por ltimo, le adjuntamos la funcin a ejecutarse cuando se produzca el evento click a todos los enlaces: for(f=0;f<enlaces.length;f++) { addEvent(enlaces[f],'click',itemSeleccionado,false); } } La funcin itemSeleccionado se dispara para todos las opciones que contiene el men: function itemSeleccionado(e) { Lo primero que hacemos es obtener una referencia en la variable 'enlace' al objeto que emiti el evento, como sabemos el DOM y el IE guardan la referencia en forma distinta: var enlace; if (window.event) enlace=window.event.srcElement; else enlace=e.target; Seguidamente obtenemos una referencia al objeto padre: var padre=enlace.parentNode; obtenemos un vector con todas las listas contenidas en la misma: var ul=padre.getElementsByTagName('ul'); Si no tiene listas contenidas estamos en un nivel de opcin del men sin subopciones, en caso que el vector tenga elementos la propiedad length almacena la cantidad: if (ul.length>0) { Ahora, si el if se verifica verdadero, analizamos la primera componente del vector ul y si tiene el valor 'none' en la propiedad display la cambiamos por block (esto la hace visible), en caso contrario, ocultamos la lista disponiendo el valor 'none': if (ul[0].style.display=='none') ul[0].style.display='block'; else ul[0].style.display='none'; } } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
<div id="menu"> <ul> <li><a href="http://www.google.com.ar">Google</a></li> <li><a href="#">Peridicos</a> <ul id="submenu"> <li><a href="http://www.lanacion.com.ar">La Nacin</A></li> <li><a href="http://www.clarin.com.ar">El Clarn</A></li> <li><a href="http://www.lavoz.com.ar">La Voz</a></li> </ul> </li> <li><a href="#">Lenguajes</a> <ul id="submenu"> <li><a href="http://www.php.net">PHP</a></li> <li><a href="http://www.rubyonrails.org">Ruby on rails</a></li> <li><a href="http://www.python.org">Python</a></li> </ul> </li> <li><a href="http://www.msn.com">MSN</a></li> </ul> </div> </body> </html> estilos.css #menu { font-family: Arial; margin:0px; padding:0px; } #menu ul { margin:0px; padding:0px; list-style-type:none; } #menu a { display: block; padding: 3px; width: 160px; background-color: #f7f8e8; border-bottom: 1px solid #eee; text-align:center; } #menu a:link, #menu a:visited { color: #f00; text-decoration: none; } #menu a:hover { background-color: #369; color: #fff; } #submenu a { display: block; padding: 3px; width: 160px; background-color: #ffa; border-bottom: 1px solid #eee; text-align:center; } #submenu a:link, #submenu a:visited { color: #000; text-decoration: none; } #submenu a:hover { background-color: #369; color: #fff; }