Diferencia entre revisiones de «Usuario:Juanda/javascript/Eventos»
De WikiEducator
(→Técnica de los manejadores semánticos=) |
|||
| (24 revisiones intermedias por el mismo usuario no mostrado) | |||
| Línea 10: | Línea 10: | ||
=== Introducción === | === Introducción === | ||
*Todos los elementos de una página tienen asociados eventos que pueden disparar funciones de JavaScript. | *Todos los elementos de una página tienen asociados eventos que pueden disparar funciones de JavaScript. | ||
| − | *Hay eventos asociados a la ventana (etiqueta <body>), a los formularios | + | *Hay eventos asociados a la ventana (etiqueta <body>), a los formularios... que se disparan por el ratón, el teclado, la carga de una página o la multimedia. |
*Un mismo tipo de evento puede estar asociado a elementos html diferentes. | *Un mismo tipo de evento puede estar asociado a elementos html diferentes. | ||
| − | *Aumento considerable de los eventos con html5 | + | *Aumento considerable de los eventos con html5: [http://www.w3schools.com/tags/ref_eventattributes.asp Lista de eventos] |
| − | + | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
| Línea 40: | Línea 39: | ||
<div class="slide"> | <div class="slide"> | ||
| + | |||
=== Manejadores de eventos=== | === Manejadores de eventos=== | ||
JavaScript permite asignar una función a cada uno de los eventos. De esta forma, cuando se produce cualquier evento, JavaScript ejecuta su función asociada. Este tipo de funciones se denominan "event handlers" en inglés y suelen traducirse por "manejadores de eventos": | JavaScript permite asignar una función a cada uno de los eventos. De esta forma, cuando se produce cualquier evento, JavaScript ejecuta su función asociada. Este tipo de funciones se denominan "event handlers" en inglés y suelen traducirse por "manejadores de eventos": | ||
| Línea 46: | Línea 46: | ||
alert('Gracias por pinchar'); | alert('Gracias por pinchar'); | ||
} | } | ||
| + | .... | ||
<input type="button" value="Pinchame y verás" onclick="muestraMensaje()" /> | <input type="button" value="Pinchame y verás" onclick="muestraMensaje()" /> | ||
</html> | </html> | ||
| Línea 52: | Línea 53: | ||
<div class="slide"> | <div class="slide"> | ||
| + | |||
===Captura de errores=== | ===Captura de errores=== | ||
*El '''evento onerror''' se dispara cuando hay un error de script en la página | *El '''evento onerror''' se dispara cuando hay un error de script en la página | ||
| Línea 140: | Línea 142: | ||
<div class="slide"> | <div class="slide"> | ||
*Ejemplo de uso de la variable this | *Ejemplo de uso de la variable this | ||
| − | :Al llamar a una función, debemos pasar this como parámetro.<br> | + | <source lang="html4strict"> |
| + | <div id="contenidos" style="width:150px; height:60px; border:thin solid silver" | ||
| + | onmouseover="this.style.borderColor='black';" | ||
| + | onmouseout="this.style.borderColor='silver';"> | ||
| + | Sección de contenidos... | ||
| + | </div> | ||
| + | </source> | ||
| + | </div> | ||
| + | |||
| + | <div class="slide"> | ||
| + | *Javascript mediante función externa | ||
| + | :Muchas ventajas, pero un inconveniente: No se puede utilizar this | ||
| + | :Solución: Al llamar a una función, debemos pasar this como parámetro.<br> | ||
| + | <source lang="html4strict"> | ||
| + | <div style="width:150px; height:60px; border:thin solid silver" | ||
| + | onmouseover="resalta(this)" onmouseout="resalta(this)"> | ||
| + | Sección de contenidos... | ||
| + | </div> | ||
| + | </source> | ||
| + | </div> | ||
| + | |||
| + | <div class="slide"> | ||
:Varios case responden igual debido a las diferentes respuestas de los navegadores. | :Varios case responden igual debido a las diferentes respuestas de los navegadores. | ||
<source lang="javascript"> | <source lang="javascript"> | ||
| Línea 157: | Línea 180: | ||
} | } | ||
} | } | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
</source> | </source> | ||
| Línea 172: | Línea 192: | ||
Al igual que se intentan separar los contenidos (código html) y el diseño (css), se recomienda separar los contenidos, de su comportamiento (JavaScript). Por ejemplo:<br> | Al igual que se intentan separar los contenidos (código html) y el diseño (css), se recomienda separar los contenidos, de su comportamiento (JavaScript). Por ejemplo:<br> | ||
<source lang="html4strict"> | <source lang="html4strict"> | ||
| − | <input id="pinchable" type="button" value="Pinchame y verás" onclick="alert('Gracias por pinchar');" /> | + | <input id="pinchable" type="button" value="Pinchame y verás" |
| + | onclick="alert('Gracias por pinchar');" /> | ||
</source> | </source> | ||
Se puede transformar en... | Se puede transformar en... | ||
| Línea 183: | Línea 204: | ||
alert('Gracias por pinchar'); | alert('Gracias por pinchar'); | ||
} | } | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
// Elemento XHTML | // Elemento XHTML | ||
| + | <input id="pinchable" type="button" value="Pinchame y verás" | ||
| + | onclick="muestraMensaje()"/> | ||
| + | </source> | ||
| + | |||
| + | *Podemos dar "un paso más" y lograr una separación mayor: | ||
| + | <source lang="javascript"> | ||
| + | function muestraMensaje() { | ||
| + | alert('Gracias por pinchar'); | ||
| + | } | ||
| + | ... | ||
<input id="pinchable" type="button" value="Pinchame y verás" /> | <input id="pinchable" type="button" value="Pinchame y verás" /> | ||
</source> | </source> | ||
| − | |||
| + | *Usaremos la técnica de los manejadores semánticos... | ||
| + | </div> | ||
<div class="slide"> | <div class="slide"> | ||
| − | ===Técnica de los manejadores semánticos=== | + | |
| + | ====Técnica de los manejadores semánticos==== | ||
1. Asignar un identificador único al elemento XHTML mediante el atributo id.<br> | 1. Asignar un identificador único al elemento XHTML mediante el atributo id.<br> | ||
2. Crear una función de JavaScript encargada de manejar el evento.<br> | 2. Crear una función de JavaScript encargada de manejar el evento.<br> | ||
| Línea 205: | Línea 231: | ||
Inconveniente: la página se debe cargar completamente antes de que se puedan utilizar las funciones DOM que asignan los manejadores a los elementos html. ¡Para ello debemos utilizar el '''evento onload'''! | Inconveniente: la página se debe cargar completamente antes de que se puedan utilizar las funciones DOM que asignan los manejadores a los elementos html. ¡Para ello debemos utilizar el '''evento onload'''! | ||
| + | </div> | ||
| + | |||
| + | <div class="slide"> | ||
| + | |||
| + | *Separación de html y javascript | ||
| + | Al igual que se intentan separar los contenidos (código html) y el diseño (css), se recomienda separar los contenidos, de su comportamiento (JavaScript). Por ejemplo:<br> | ||
| + | <source lang="html4strict"> | ||
| + | <input id="pinchable" type="button" value="Pinchame y verás" | ||
| + | onclick="alert('Gracias por pinchar');" /> | ||
| + | </source> | ||
| + | Se puede transformar en... | ||
| + | </div> | ||
| + | |||
| + | <div class="slide"> | ||
| + | <source lang="javascript"> | ||
| + | // Función externa | ||
| + | function muestraMensaje() { | ||
| + | alert('Gracias por pinchar'); | ||
| + | } | ||
| + | // Asignar la función externa al elemento, sin parentesis!!!!! | ||
| + | // se ejecuta una vez que esté cargado todo el DOM (evento onload) | ||
| + | //Si se añaden los paréntesis después del nombre de la función, en realidad se está | ||
| + | //ejecutando la función y guardando el valor devuelto por la función en la propiedad | ||
| + | //onclick de elemento. | ||
| + | window.onload = function() { | ||
| + | document.getElementById("pinchable").onclick = muestraMensaje; | ||
| + | } | ||
| + | // Elemento XHTML | ||
| + | <input id="pinchable" type="button" value="Pinchame y verás" /> | ||
| + | </source> | ||
</div> | </div> | ||
<div class="slide"> | <div class="slide"> | ||
| + | ====Ejemplo: resaltar elementos de un formulario al recibir el foco:==== | ||
<source lang="javascript"> | <source lang="javascript"> | ||
function resalta() { | function resalta() { | ||
| Línea 223: | Línea 280: | ||
} | } | ||
</source> | </source> | ||
| + | </div> | ||
| + | <div class="slide"> | ||
| + | === Obteniendo información de eventos:=== | ||
| + | *Mediante el objeto event. | ||
| + | :Windows considera que el objeto proviene del objeto window. | ||
| + | :el resto de navegadores lo muestran como "un parámetro mágico" de la función | ||
| + | |||
| + | <source lang="javascript"> | ||
| + | //Solución unificada: | ||
| + | function manejadorEventos(elEvento) { | ||
| + | var evento = elEvento || window.event; | ||
| + | } | ||
| + | </source> | ||
</div> | </div> | ||
| + | |||
| + | |||
| + | <div class="slide"> | ||
| + | ====Ejemplo uso del objeto event:==== | ||
| + | <source lang="html4strict"> | ||
| + | function resalta(elEvento) { | ||
| + | var evento = elEvento || window.event; | ||
| + | //el tipo de evento va sin el "on": | ||
| + | switch(evento.type) { | ||
| + | case 'mouseover': | ||
| + | this.style.borderColor = 'black'; | ||
| + | break; | ||
| + | case 'mouseout': | ||
| + | this.style.borderColor = 'silver'; | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | window.onload = function() { | ||
| + | document.getElementById("seccion").onmouseover = resalta; | ||
| + | document.getElementById("seccion").onmouseout = resalta; | ||
| + | } | ||
| + | |||
| + | <div id="seccion" style="width:150px; height:60px; border:thin solid silver"> | ||
| + | Sección de contenidos... | ||
| + | </div> | ||
| + | |||
| + | </source> | ||
| + | </div> | ||
| + | <div class="slide"> | ||
| + | |||
| + | ====Eventos de teclado==== | ||
| + | *Cuando un usuario pulsa una tecla normal, se producen tres eventos seguidos y en este orden: onkeydown, onkeypress y onkeyup. | ||
| + | :El evento onkeydown se corresponde con el hecho de pulsar una tecla y no soltarla. | ||
| + | :El evento onkeypress es la propia pulsación de la tecla | ||
| + | :El evento onkeyup hace referencia al hecho de soltar una tecla que estaba pulsada. | ||
| + | |||
| + | *La forma más sencilla de obtener la información sobre la tecla que se ha pulsado es mediante el evento onkeypress. Sin embargo no todos los navegadores funcionan igual, existen teclas especiales... | ||
| + | </div> | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | <div class="slide"> | ||
| + | ====Ejemplo eventos teclado==== | ||
| + | |||
| + | |||
| + | <source lang="javascript"> | ||
| + | window.onload = function() { | ||
| + | document.onkeyup = muestraInformacion; | ||
| + | document.onkeypress = muestraInformacion; | ||
| + | document.onkeydown = muestraInformacion; | ||
| + | } | ||
| + | |||
| + | function muestraInformacion(elEvento) { | ||
| + | var evento = window.event || elEvento; | ||
| + | |||
| + | var mensaje = "Tipo de evento: " + evento.type + "<br>" + | ||
| + | "Propiedad keyCode: " + evento.keyCode + "<br>" + | ||
| + | "Propiedad charCode: " + evento.charCode + "<br>" + | ||
| + | "Carácter pulsado: " + String.fromCharCode(evento.charCode); | ||
| + | |||
| + | info.innerHTML += "<br>--------------------------------------<br>" + mensaje | ||
| + | } | ||
| + | |||
| + | ... | ||
| + | |||
| + | <div id="info"></div> | ||
| + | </source> | ||
| + | </div> | ||
| + | |||
| + | <div class="slide"> | ||
| + | * Solución independiente del navegador: | ||
| + | <source lang="javascript"> | ||
| + | function manejador(elEvento) { | ||
| + | var evento = elEvento || window.event; | ||
| + | var caracter = evento.charCode || evento.keyCode; | ||
| + | alert("El carácter pulsado es: " + String.fromCharCode(caracter)); | ||
| + | } | ||
| + | |||
| + | document.onkeypress = manejador; | ||
| + | </source> | ||
| + | </div> | ||
| + | |||
| + | <div class="slide"> | ||
| + | ==== Ejemplos eventos de ratón ==== | ||
| + | <source lang="javascript"> | ||
| + | function muestraInformacion(elEvento) { | ||
| + | var evento = elEvento || window.event; | ||
| + | var coordenadaX = evento.clientX; | ||
| + | var coordenadaY = evento.clientY; | ||
| + | /*las coordenadas respecto a la pantalla serían: | ||
| + | var coordenadaX = evento.screenX; | ||
| + | var coordenadaY = evento.screenY; | ||
| + | */ | ||
| + | alert("Has pulsado el ratón en la posición: " + coordenadaX + ", " + coordenadaY); | ||
| + | } | ||
| + | |||
| + | document.onclick = muestraInformacion; | ||
| + | </source> | ||
| + | </div> | ||
| + | |||
| + | |||
| + | |||
</div> | </div> | ||
Última revisión de 20:51 14 oct 2012