APÉNDICE. EVENTOS EN JAVASCRIPT. MANEJO DE EVENTOS EN Navigator 4 y en Explorer 4.
Esta parte pretende ser una continuación de la parte de eventos en JavaScript,
aunque si deseais conocer más acerca de la gestión de eventos, podreis ver este tutorial.
Tratamiento de eventos.
El tratamiento de eventos en JavaScript se puede hacer de dos formas:
- En las etiquetas: Se pueden incluir los manejadores de evento con los eventos de muchas de las etiquetas, para
esto se emplea la siguiente sintasix:
<ETIQUETA manejador="Sentencias JavaScript">
Ejemplo:
Código fuente:
<FORM><INPUT TYPE="BUTTON" VALUE="Boton"
onClick="alert('Has pulsado el boton'); return false;"</INPUT>
</FORM>
- Creando manejadores de eventos: Se realiza un captura de eventos utilizando los siguientes paso:
- Preparación del objeto para la captura delos eventos deseados:Se indica cuales
son los eventos que se desea que capture el objeto (ventana,docuemnto o layer). Por ejemplo,
para el caso de una ventana:
window.captureEvents(Event.CLICK)
Para indicar varios eventos se utiliza el caracter |. Por ejemplo, para capturar varios
eventos en un layer:
window.milayer.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
Cuando se indiquen varios objetos que capturen un mismo evento se realiza según la
jerarquía en la que se han definido.
- Definición de la función que atenderáa al evento:Se define la dunción
JavaScript que manejará el evento, con un argumento que es un objeto evento, se define siempre de la
misma forma y debe devolver
true o false :
function miManejador(e) {
......tratamiento del evento ...
}
- Registro de la función como manejador para ese evento:Para esto basta con
asignar el nombre de la función al manejador del evento. Por ejemplo:
document.milayer.onmousedown=miManejador
En el siguiente ejemplo, el objeto document captura el evento
MouseDown :
<script language="JavaScript1.2"> <!--
/*Preparación del objeto document para la captura del evento MOUSEDOWN*/
document.captureEvents(Event.MOUSEDOWN);
/*Definición de la función manejador del evento*/
function fun(e) {
alert ("Se ha capturado un evento del tipo: " + e.type);
alert ("La posición x es " + e.layerX);
alert ("La posición y es " + e.layerY);
if (e.modifiers && Event.ALT_MASK)
alert ("La tecla ALT estaba pulsada cuando se produjo el evento.");
return true;
}
/*Registro de la función como manejador de ese evento*/
document.onMouseDown = fun;
//-->
</script>
Pulsa aquí para ejecutar el ejemplo.
El objeto EVENT (evento).
Los eventos son objetos con las siguientes propiedades:
Propiedad |
Descripción |
type |
Una cadena de texto indicando el tipo del evento. |
target |
Una cadena de texto indicando el objeto al que se ha enviado el evento. |
layerX |
Un número que especifica bien la anchura del objeto cuando es pasado con el evento
resize o la posición horizontal del cursor en pixels relativa al layer en el
que ha ocurrido el evento. layerX es igual que x. |
layerY |
Un número que especifica bien la altura del objeto cuando es pasado con el evento
resize o la posición vertical del cursor en pixels relativa al layer en el
que ha ocurrido el evento. layerY es igual que y. |
pageX |
Un número que especifica la posición horizontal del cursor en pixels relativa a
la página. |
pageY |
Un número que especifica la posición vertical del cursor en pixels relativa a
la página. |
screenX |
Un número que especifica la posición horizontal del cursor en pixels relativa a
la pantalla. |
screenY |
Un número que especifica la posición vertical del cursor en pixels relativa a
la pantalla. |
which |
Un número que especifica el botón del ratón que ha sido pulsado o bien el valor
ASCII de la tecla que ha sido pulsada. |
modifiers |
Una cadena de texto que contiene las teclas modificadoras asociadas con un evento
de ratón o de teclado. Los valores válidos son ALT_MASK, CONTROL_MASK,
SHIFT_MASK y META_MASK. |
data |
Retorna un array de cadenas de texto que contienen las URLs de los objetos "soltados".
Se pasa con el evento dragDrop. |
Tipos de eventos.
Los eventos que existen son los siguientes:
- Eventos de JavaScript 1.0:
Evento |
Descripción |
Asociado a |
Click |
Pulsación sobre un enlace o un elemento de un form |
Ratón |
MouseOver |
Colocación del ratón sobre un enlace |
Ratón |
Load |
Carga de la página. |
Página |
UnLoad |
Salida de la página. |
Página |
Focus |
Seleción de un elemento de un form. |
Teclado/Ratón |
Blur |
Des-seleción de un elemento de un form. |
Teclado/Ratón |
Change |
Edición de un elemento de un elemento text, textarea o cambio de un select en un forma. |
Teclado/Ratón |
Select |
Seleción del campo de entrada de un elemento de un form. |
Teclado/Ratón |
Submit |
Envío de un form. |
Teclado/Ratón |
- Eventos de JavaScript 1.1:
Evento |
Descripción |
Asociado a |
Abort |
Interrupción de la carga de una página o imagen |
Página |
Error |
Error en la carga o ejecuciónde una página o imagen |
Página |
MouseOut |
Salida del ratón de un área o enlace. |
Ratón |
Reset |
Pulsació de un reset en un form. |
Teclado/ratón |
- Eventos de JavaScript 1.2:
Evento |
Descripción |
Asociado a |
DblClick |
Pulsación de doble Click sobre un enlace o un elemento de un form |
Ratón |
DragDrop |
Se produce cuando se deja caer algo sobre la ventana. |
Ratón |
MouseDown |
Pulsación de un botón del Ratón sobre un documento, enlace o form. |
Ratón |
MouseMove |
Movimiento del cursor del Ratón. |
Ratón |
MouseUp |
Liberación de un botón del Rtón sobre un docuemnto, enlace o form. |
Ratón |
KeyDown |
Pulsación de una tecla. |
Teclado |
KeyUp |
Liberación de una tecla. |
Teclado |
KeyPress |
Cobinación de KeyDown y KeyUp. |
Teclado |
Move |
Movimiento de la ventana o un frame. |
Ventana |
Resize |
Redimensionamiento de la ventana o un frame. |
Ventana |
Diferencias entre Netscape e IE.
En el manejo de eventos entre N4 y E4 es uno de los apartados donde más diferencias encontramos entre ambos. Para empezar, ya a un nivel casi abstracto son totalmente diferentes:
- E4 sigue un modelo de tratamiento de eventos "en burbuja",
- N4 utiliza un modelo "de captura".
Lo que esto quiere decir es que el E4 permite que el elemento que recibe un evento decida si desea o no procesarlo, en cuyo caso lo pasa al padre para que lo procese él. La jerarquía es la siguiente: link, layer, document, window, manejador por defecto. En N4 la cosa va alrevés, los eventos se generan y se intentan procesar primero en la parte más alta de la jerarquía, dando la oportunidad de ser procesados al elemento window que si no lo maneja lo pasa al document, y así hasta el elemento generador del evento.
La diferencia práctica entre ambos es que mientras que en E4 cualquier elemento HTML puede generar y procesar cualquier evento, en N4, sólo unos pocos elementos pueden hacerlo (a no ser que utilicemos los nuevos modelos de eventos).
Los problemas nos vienen debido a si queremos código que funcione bien en ambos tipos de navegadores, no podemos pasar los eventos a los manejadores de los elementos padres de los que lo han recibido, ya que la jerarquía está invertida.
La solución es manejar los eventos en funciones simples, y usar sólo los eventos definidos y soportados por N4, ya que esos funcionan bien en ambos.
E4 permite capturar eventos en layers, sin utilizar links, como si toda la zona rectangular del layer actuase como un link. N4 no lo permite de un modo tan directo como E4 (colocando onEvento en el mismo tag).
Sin embargo tenemos una forma de conseguir eso que queremos, y es mediante la definición de scripts localizados dentro de los propios layers. Veamos esto con un ejemplo:
<DIV STYLE="position:absolute; left:10; top:20;"
onMouseOver=" alert('Estoy sobre el layer (E4).'); "
onMouseOut=" alert('Estoy fuera del layer (E4).'); ">
Contenido del layer <br> de ejemplo.
<SCRIPT>
function onMouseOver() {
alert("Estoy sobre el layer (N4).");
}
function onMouseOut() {
alert("Estoy fuera del layer (N4).");
}
</SCRIPT>
</DIV>
Al definir ese layer en un documento, tendríamos que respondería a los eventos de ratón onMouseOver y onMouseOut , sin embargo, para E4 y N4 utilizaría distintos manejadores. Con E4, utiliza los onEvento definidos en la misma cabecera del tag, sin embargo, debido a las diferencias en la forma de tratar los eventos, en N4, utilizaría como manejadores los definidos en el script localizado dentro del layer.
Esta es una forma de tratar los eventos (no todos se pueden manejar de este modo) para conseguir mantener la compatibilidad.
Otra forma es utilizar el modelo de eventos nuevo para tratarlos tal y como requiere tanto N4 como E4. Un ejemplo de esto :
<SCRIPT>
if (document.layers) {n=1;ie=0}
if (document.all) {n=0;ie=1}
if (n) {
pullout1 = document.layer.document.luna
pullout2 = document.layer.document.layer2
document.layer.document.luna.document.receptor.
document.captureEvents(Event.MOUSEUP)
document.layer.document.luna.document.receptor.
document.onmouseup = deslizaNN
}
if (ie) {
pullout1 = luna.style
pullout2 = layer2.style
document.all.receptor.onmouseup = deslizaIE
}
function deslizaIE() {
pullout(pullout2);
}
function deslizaNN(e){
pullout(pullout2);
}
</SCRIPT>
Como vemos, la sistemática a seguir es la siguiente: capturar los eventos que deseemos para cada layer que queramos que responda. Esto, como ya sabemos, se hace de diferente forma en N4 y E4, con lo cual debemos distinguir el navegador utilizado.Al indicar cual es el manejador, debemos tener en cuenta que E4 no pasa el objeto evento a través de la cabecera de la función, tal y como sí hace N4, por lo que es conveniente que definamos funciones separadas como manejadores (tal y como vemos en ese ejemplo) y desde ellas llamemos al código común o específico para cada navegador. En el ejemplo no hacemos uso de los objetos event , aunque eso es un caso particular de este problema.
|