jueves, 18 de diciembre de 2014

Depuración de Errores

Santos A. laserna López


Cómo depurar errores en Javascript

Dentro de la programación Javascript debemos prestar especial atención, como en cualquier otro lenguaje, a la sintaxis del mismo.

Sin embargo, antes de entrar en los consejos de depuración, hay que tener en cuenta los scripts que estamos utilizando en relación con las versiones de navegadores que son compatibles, y saber que a veces un código preparado para las últimas versiones de los navegadores puede generar problemas con navegadores no tán actualizados.
Cada lenguaje tiene sus normas de escritura, sus órdenes y preferencias, y en el caso de Javascript, cometer un error de un caractér en una línea de código puede suponer la inhabilitación de una parte del código y generar errores de funcionamiento en todo el script.

En lo relativo a la sintaxis se recomienda:

  • Utilizar comentarios para recordar qué está haciendo el script en esa línea de código.
  • Tener cuidado de no confundir variables locales con globales, que pueden tener el mismo nombre.
  • Escribir el código con claridad, mediante saltos de línea, un sangrado adecuado, utilizar llaves {} siempre, aunque no sean obligatorias e intentar manter el estilo a la hora de programar.
  • Declarar las variables con var. No cambiar el tipo de dato que contiene. Por ejemplo, las variables de texto pueden empezar por una s (de String), las variables numéricas pueden empezar por una n o las boleanas por una b
  • Probar los scripts cada poco que se va programando. Es más fácil encontrar errores de código en bloques pequeños.

Estos errores se clasifican en dos tipos; de sintaxis y de ejecución:

  1. Errores de sintaxis ocurren a la hora de escribir el nombre de una estructura, utilizar incorrectamente las llaves o los paréntesis.
  2. Errores de ejecución ocurren cuando se están ejecutando los scripts.


También podemos cometer fallos en la programación que hagan que los scripts no funcionen tal y como deseábamos y que javascript no detecta como errores y por lo tanto no muestra ningún mensaje de error.


A continuación, una serie de consejos para evitar errores comunes:

  • Utilizar = en expresiones condicionales en lugar de == es un error difícil de detectar cuando se comete, si utilizamos un solo igual lo que estamos haciendo es una asignación y no una comparación para ver si dos valores son iguales.

  • No conocerse la precedencia de operadores y no utilizar paréntesis para agrupar las operaciones que se desea realizar. En este caso nuestras operaciones pueden dar resultados no deseados.




  • Usar comillas dobles y simples erróneamente. Recuerda que se pueden utilizar comillas dobles o simples indistintamente, con la norma siguiente: dentro de comillas dobles se deben utilizar comillas simples y viceversa.
  • Olvidarse de cerrar una llave o cerrar una llave de más.
  • Colocar varias sentencias en la misma línea sin separarlas de punto y coma. Esto suele ocurrir en los manejadores de eventos, como onclick, que veremos más adelante. 
  • Utilizar una variable antes de inicializarla o no declarar las variables con var antes de utilizarlas. Recuerda que si no la declaras puedes estar haciendo referencia a una variable global en lugar de una local.
  • Contar las posiciones de los arrays a partir de 1. Recuerda que los arrays empiezan por la posición 0.



Una técnica de depuración que nos ayuda a encontrar errores es la función predefinida alert() que recibe entre paréntesis un texto y lo muestra en una pequeña ventana.

Con la función alert() podemos mostrar en cualquier momento el contenido de las variables que estamos utilizando en nuestros scripts. Para ello ponemos entre paréntesis la variable que deseamos ver su contenido. Cuando se muestra el contenido de la variable el navegador espera a que apretemos el botón de aceptar y cuando lo hacemos continúa con las siguientes instrucciones del script.

Con todo esto, los paros a seguir para una correcta depuración del código son:

  1. Utilizar nombres de variables que sean totalmente descriptivos.
  2. Comenta secciones de código para identificar dónde se encuentra el problema.
  3. Diferencia las variables en función de su importancia. (coloca las variables globales en la cabecera del script)
  4. Separa y tabula el texto del código en su orden de jerarquía.
  5. Documenta el código para ayudar a entender qué sucede en cada parte.


martes, 16 de diciembre de 2014

Parte 7: Epílogos a la segunda parte

7.1 Cláusulas try ... catch: detectar y cazar errores en Javascript

Estas cláusulas las podemos utilizar para tratar de ejecutar una porción de código, que sabemos que podría desatar un error en tiempo de ejecución.

Con try especificamos una serie de sentencias Javascript que vamos a tratar de ejecutar. Con catch especificamos lo que queremos realizar si es que se ha cazado un error en el bloque try: 

try {
//intento algo que puede producir un error
}catch(mierror){
//hago algo cuando el error se ha detectado

El Bloque try se ejecuta tal cual, hasta que un posible error se ha detectado. 

• Si no se detecta un error durante la ejecución del bloque try, el catch se deja del lado y no se realiza. 

• En caso que sí se detecte un error en el bloque try, se ejecuta las sentencias que teníamos en el catch. 

Si nos fijamos, podemos ver que el bloque catch recibe un dato, que en este caso hemos almacenado en la variable "mierror". Esa variable contiene información sobre el error detectado, que puede ser útil para realizar el tratamiento al error.

Para hacer un bloque try ... catch como este que funcione en los dos navegadores deberíamos hacer esto: 

try {
//intento algo que puede producir un error
funcion_que_no_existe()
}catch(mierror){
if (mierror.description){
alert("Error detectado: " + mierror.description)
}else{
alert("Error detectado: " + mierror)
}
}



7.1.1.- Lanzar una excepción nosotros mismos

También, dentro de un bloque try, podemos lanzar nosotros mismos una excepción, sin que tenga por qué haberse producido un error. Esto lo hacemos con la sentencia trow. 

try {
throw "miexcepcion"; //lanza una excepción
}
catch (e) {
//tratamos la excepción
alert(e);

Este código, válido tanto para Internet Explorer como Firefox, lanza una excepción en el bloque try. Luego, en el bloque catch, se muestra la excepción que se ha detectado.

En Internet se pueden encontrar diversas hojas de referencia muy útiles, completas y bien presentadas, que nos pueden ayudar en nuestro día a día con el lenguaje, si las tenemos impresas en papel y a mano para consulta. Lo bueno es que las ofrecen programadores de manera gratuita, con lo que podemos verlas y si nos parece que pueden ayudarnos, se pueden imprimir libremente.



7.2 Por dónde continuar aprendiendo Javascript


7.3.1 Javascript a fondo

La primera referencia que te queremos comentar es la sección dedicada exclusivamente a Javascript dentro de DesarrolloWeb.com. Esto sería como una "portada" del sitio dedicada a Javascript, donde publicamos todos aquellos contenidos que tienen que ver con este lenguaje. 




7.3.2 Taller de Javascript

En el taller de Javascript encontrarás diversos artículos prácticos sobre cómo hacer las cosas más variadas con Javascript.

Puedes tratarlos como prácticas, para aprender a hacer una gama de utilidades que te darán una base adicional sobre el lenguaje, o puedes consultarlos cuando tengas que resolver un problema concreto con Javascript. 




7.3.3 Otros manuales prácticos

Tenemos también diversos manuales eminentemente prácticos, sobre aspectos muy concretos que se utilizan habitualmente en Javascript. En estos manuales detallamos cosas como el trabajo con imágenes, formularios, frames, ventanas secundarias, etc. Muchas de estas cosas ya las empezamos a tratar en el presente manual, pero existe una información mucho más completa que quizás te interese leer llegado el momento. 



7.3.4 Frameworks Javascript

Los frameworks son como librerías de código para hacer tareas comunes en páginas web, creadas por otros programadores y que están a tu disposición para acelerar el proceso de creación de páginas realmente avanzadas. Digamos que cualquiera de nosotros podría programar a mano y desde cero cualquiera de las funcionalidades implementadas en los frameworks, pero ello le ocuparía mucho más tiempo y los resultados lo más probable es que fueran peores. 

Los frameworks son sin duda el paso que diferencia el programador de Javascript básico y el programador profesional, sin límites más allá de los propios del navegador y su propia imaginación. Por ello, como te podrás imaginar, recomendamos encarecidamente que aprendas uno de ellos para realizar aplicaciones web basadas en Javascript realmente profesionales.

Sin lugar a dudas, jQuery es el framework Javascript más popular en estos momentos. A poco que se aprenda de jQuery se podrá comprobar que es una auténtica delicia para implementar tanto interactividad como efectos especiales sobre páginas web. Para aprender este framework tenemos un completo Manual de jQuery que no exageramos si decimos que es uno de los mejores manuales ya publicados en DesarrolloWeb.com

Parte 6: Eventos en Javascript

6.1 Los eventos en Javascript

Con javascript podemos definir qué es lo que pasa cuando se produce un evento como podría ser que un usuario pulse sobre un botón, edite un campo de texto o abandone la página.


6.1.1 Cómo se define un evento

Para definir las acciones que queremos realizar al producirse un evento utilizamos los manejadores de eventos. Existen muchos tipos de manejadores de eventos, para muchos tipos de acciones del usuario. El maneador de eventos se coloca en la etiqueta HTML del elemento de la página que queremos que responda a las acciones del usuario. 

Por ejemplo tenemos el manejador de eventos onclick, que sirve para describir acciones que queremos que se ejecuten cuando se hace un click. Si queremos que al hacer click sobre un botón pase alguna cosa, escribimos el manejador onclick en la etiqueta <INPUT type=button> de ese botón: 

<INPUT type=button value="pulsame" onclick="sentencias_javascript...">

Se coloca un atributo nuevo en la etiqueta que tiene el mismo nombre que el evento, en este caso onclick. El atributo se iguala a las sentencias Javascript que queremos que se ejecuten al producirse el evento. 

Cada elemento de la página tiene su propia lista de eventos soportados, vamos a ver otro ejemplo de manejo de eventos, esta vez sobre un menú desplegable, en el que definimos un comportamiento cuando cambiamos el valor seleccionado. 

<SELECT onchange="window.alert('Cambiaste la selección')"> 
<OPTION value="opcion1">Opcion 1 
<OPTION value="opcion2">Opcion 2 
</SELECT> 

En este ejemplo cada vez que se cambia la opción muestra una caja de alerta.



Dentro de los manejadores de eventos podemos colocar tantas instrucciones como deseemos, pero siempre separadas por punto y coma. Lo habitual es colocar una sola instrucción, y si se desean colocar más de una se suele crear una función con todas las instrucciones y dentro del manejador se coloca una sola instrucción que es la llamada a la función. 


Vamos a ver cómo se colocarían en un manejador varias instrucciones. 

<input type=button value=Pulsame 
onclick="x=30; window.alert(x); window.document.bgColor = 'red'"> 

Son instrucciones muy simples como asignar a x el valor 30, hacer una ventana de alerta con el valor de x y cambiar el color del fondo a rojo.

Sin embargo, tantas instrucciones puestas en un manejador quedan un poco confusas, habría sido mejor crear una función así. 

<script> 
function ejecutaEventoOnclick(){ 
 x = 30 
 window.alert(x) 
 window.document.bgColor = 'red' 
</script> 

<FORM> 
<input type=button value=Pulsame onclick="ejecutaEventoOnclick()"> 
</FORM>


6.1.2 Jerarquía desde el objeto window


En los manejadores de eventos se tiene que especificar la jerarquía entera de objetos del navegador, empezando siempre por el objeto window.



6.2 Los manejadores de eventos en Javascript

La lista de manejadores de eventos contiene el nombre del manejador en negrita, su descripción y finalmente la versión de Javascript que incorporó dicho manejador.

onabort
Este evento se produce cuando un usuario detiene la carga de una imagen, ya sea porque detiene la carga de la página o porque realiza una acción que la detiene, como por ejemplo irse de la página. Javascript 1.1 

onblur
Se desata un evento onblur cuando un elemento pierde el foco de la aplicación. El foco de la aplicación es el lugar donde está situado el cursor, por ejemplo puede estar situado sobre un campo de texto, una página, un botón o cualquier otro elemento. Javascript 1.0 

onchange
Se desata este evento cuando cambia el estado de un elemento de formulario, en ocasiones no se produce hasta que el usuario retira el foco de la aplicación del elemento. Javascript 1.0 

onclick
Se produce cuando se da una pulsación o clic al botón del ratón sobre un elemento de la página, generalmente un botón o un enlace. Javascript 1.0 

ondragdrop
Se produce cuando un usuario suelta algo que había arrastrado sobre la página web. Javascript 1.2 

onerror
Se produce cuando no se puede cargar un documento o una imagen y esta queda rota. Javascript 1.1 

onfocus
El evento onfocus es lo contrario de onblur. Se produce cuando un elemento de la página o la ventana ganan el foco de la aplicación. Javascript 1.0 

onkeydown
Este evento se produce en el instante que un usuario presiona una tecla, independientemente que la suelte o no. Se produce en el momento de la pulsación. Javascript 1.2 

onkeypress
Ocurre un evento onkeypress cuando el usuario deja pulsada una tecla un tiempo determinado. Antes de este evento se produce un onkeydown en el momento que se pulsa la tecla.. Javascript 1.2 

onkeyup
Se produce cuando el usuario deja de apretar una tecla. Se produce en el momento que se libera la tecla. Javascript 1.2 

onload
Este evento se desata cuando la página, o en Javascript 1.1 las imágenes, ha terminado de cargarse. Javascript 1.0 

onmousedown
Se produce el evento onmousedown cuando el uuario pulsa sobre un elemento de la página. onmousedown se produce en el momento de pulsar el botón, se suelte o no. Javascript 1.2 

onmousemove
Se produce cuando el ratón se mueve por la página. Javascript 1.2 

onmouseout
Se desata un evento onmuoseout cuando el puntero del ratón sale del área ocupada por un elemento de la página. Javascript 1.1 

onmouseover
Este evento se desata cuando el puntero del ratón entra en el área ocupada por un eolemento de la página. Javascript 1.0

onmouseup
Este evento se produce en el momento que el usuario suelta el botón del ratón, que previamente había pulsado. Javascript 1.2

onmove
Evento que se ejecuta cuando se mueve la ventana del navegador, o un frame. Javascript 1.2

onresize
Evento que se produce cuando se redimensiona la ventana del navegador, o el frame, en caso de que la página los tenga. Javascript 1.2

onreset
Este evento está asociado a los formularios y se desata en el momento que un usuario hace clic en el botón de reset de un formulario. Javascript 1.1

onselect
Se ejecuta cuando un usuario realiza una selección de un elemento de un formulario. Javascript 1.0

onsubmit
Ocurre cuando el visitante apreta sobre el botón de enviar el formulario. Se ejecuta antes del envío propiamente dicho. Javascript 1.0

onunload
Al abandonar una página, ya sea porque se pulse sobre un enlace que nos lleve a otra página o porque se cierre la ventana del navegador, se ejecuta el evento onunload. Javascript 1.0



6.3 Ejemplos de eventos en Javascript. Onabort

Enlaces a diversas aplicaciones prácticas donde se tratan eventos para el evento onabort.


• Acceso por clave con Javascript (Evento onclick)

• Rollover con Javascript (Eventos onmuoseover y onmouseout)

• Navegador desplegable (Evento onchange)

• Calculadora sencilla (Evento onclick)

• Confirmación del envío de formulario (Evento onclick)

• Posicionarse en un select (Evento onkeypress)

• Inhibir campo de formulario (Evento onfocus)

• Cuenta caracteres de un textarea (Eventos onkeydown y onkeyup)




6.3.1 Evento onabort

Este evento se activa al cancelarse la carga de una página, ya sea porque se pulsa el botón de cancelar o porque el usuario se marcha de la página por otro enlace.

Este ejemplo contiene una imagen que tiene el evento onabort asignado para que se ejecute una función en caso de que la imagen no llegue a cargarse. La función informa al usuario de que la imagen no se ha llegado a cargar y le pregunta si desea cargarla otra vez. Si el usuario contesta que sí, entonces se pone a descargar la imagen otra vez. Si dice que no, no hace nada.

La pregunta se hace con una caja confirm de Javascript. 

<html> <head> 
 <title>Evento onabort</title> 

<script> 
function preguntarSeguir(){ 
 respuesta = confirm ("Has detenido la carga de la página y hay una imagen que no estás
viendo.n¿Deseas cargar la imagen?") 
 if (respuesta) 
 document.img1.src = "http://ipaginate.iespana.es/ipaginate/desarrollogrande.gif" 

</script> 

</head> 
<body> 
<img name=img1 src="http://ipaginate.iespana.es/ipaginate/desarrollogrande.gif" width=500 height=458
alt="Imagen que pesa 115K" border="0" onabort="preguntarSeguir()"> 
<br> 
Pulsa el botón de parar la carga de la página y se pondrá en marcha el evento onerror 
</body> 
</html> 

Este ejemplo estaría bien si siempre se detuviese la carga por pulsar el botón de cancelar, pero si lo que pasa es que el usuario ha cancelado por irse a otra página a través de un enlace, saldrá la caja de confirmación pero no ocurrirá nada independientemente de lo que se responda y el navegante se marchará irremediablemente a la nueva página.



6.4 Ejemplo del evento onblur en Javascript

Se comprueba la validez de un dato al salir del campo de texto donde está escrito.

Onblur se activa cuando el usuario retira el foco de la aplicación de un elemento de la página. El foco de la aplicación es el lugar donde está el cursor.

Si yo deseo que, al situarse fuera de un campo de texto, se compruebe que el valor introducido es correcto puedo utilizar onblur y llamar a una función que compruebe si el dato es correcto. Si no es correcto puedo obligar al foco de la aplicación a situarse nuevamente sobre el campo de texto y avisar al usuario para que cambie dicho valor.

Comprobar un campo de texto para asegurarnos que es un número entero:

<html> 

<head>
<title>Evento onblur</title> 

<script> 
function validarEntero(valor){ 
 //intento convertir a entero. 
 //si era un entero no le afecta, si no lo era lo intenta convertir 
 valor = parseInt(valor) 
//Compruebo si es un valor numérico 
 if (isNaN(valor)) { 
 //entonces (no es numero) devuelvo el valor cadena vacia 
 return "" 
 }else{ 
 //En caso contrario (Si era un número) devuelvo el valor 
 return valor 
 } 

function compruebaValidoEntero(){ 
 enteroValidado = validarEntero(document.f1.numero.value) 
 if (enteroValidado == ""){ 
 //si era la cadena vacía es que no era válido. Lo aviso 
 alert ("Debe escribir un entero!") 
 //selecciono el texto 
 document.f1.numero.select() 
 //coloco otra vez el foco 
 document.f1.numero.focus() 
 }else 
 document.f1.numero.value = enteroValidado 

</script> 

</head>

<body> 
<form name=f1> 
Escriba un número entero: <input type=text name=numero size=8 value=""
onblur="compruebaValidoEntero()"> 
</form> 
</body> 
</html> 



Al salirse del campo de texto (onblur) se ejecuta compruebaValidoEntero(), que utiliza la función validarEntero. Si el valor devuelto por la función no es el de un entero, en este caso se recibiría una cadena vacía, muestra un mensaje en una caja alert, selecciona el texto escrito en la caja y coloca el foco de la aplicación en la caja de texto, para que el usuario coloque otro valor. Hasta que el visitante no escriba un número entero en el campo de texto el foco de la aplicación permanecerá en el campo y continuará recibiendo mensajes de error.




6.5 Continuación del ejemplo de onblur, para validar varios campos de texto.

Validar un número entero y un código postal. Para validar un código postal necesitamos comprobar que es una cadena de texto compuesta por 5 caracteres y todos son enteros, por lo menos para los numeros en España.

Por si alguien lo quiere intentar, la función para validar un código postal sería algo parecido a esto: 

function ValidoCP(){ 
 CPValido=true 
 //si no tiene 5 caracteres no es válido 
if (document.f1.codigo.value.length != 5) 
CPValido=false 
else{ 
for (i=0;i<5;i++){ 
CActual = document.f1.codigo.value.charAt(i) 
if (validarEntero(CActual)==""){ 
CPValido=false 
break; 
return CPValido 
}

Simplemente se encarga de comprobar que el campo de texto contiene 5 caracteres y hacer un recorrido por cada uno de los caracteres para comprobar que todos son enteros. Al principio se supone que el código postal es correcto, colocando la variable CPValido a true, y si alguna comprobación falla se cambia el estado correcto a incorrecto, pasando dicha variable a false.

Se puede probar a montar el ejemplo con dos campos... nosotros ahora vamos a dar una solución al problema bastante complicadilla, ya que incluimos instrucciones para evitar el efecto del bucle infinito. No vamos a ver el ejemplo que daría el error, lo dejamos para el que desee intentarlo por si mismo y recomendamos hacerlo porque así comprenderemos mejor el siguiente código.

<html> 
<head> 
 <title>Evento onblur</title>
<script> 
avisado=false 
function validarEntero(valor){ 
//intento convertir a entero. 
//si era un entero no le afecta, si no lo era lo intenta convertir 
 valor = parseInt(valor) 
//Compruebo si es un valor numérico 
if (isNaN(valor)) { 
//entonces (no es numero) devuelvo el valor cadena vacia 
return "" 
}else{ 
//En caso contrario (Si era un número) devuelvo el valor 
return valor 
function compruebaValidoEntero(){ 
enteroValidado = validarEntero(document.f1.numero.value) 
if (enteroValidado == ""){ 
//si era la cadena vacía es que no era válido. Lo aviso 
if (!avisado){ 
alert ("Debe escribir un entero!") 
//selecciono el texto 
document.f1.numero.select() 
//coloco otra vez el foco 
document.f1.numero.focus() 
avisado=true 
setTimeout('avisado=false',50) 
}else 
document.f1.numero.value = enteroValidado 
function compruebaValidoCP(){ 
CPValido=true 
//si no tiene 5 caracteres no es válido 
if (document.f1.codigo.value.length != 5) 
CPValido=false 
else{ 
for (i=0;i<5;i++){ 
CActual = document.f1.codigo.value.charAt(i) 
if (validarEntero(CActual)==""){ 
CPValido=false 
break;
}
if (!CPValido){ 
if (!avisado){ 
//si no es valido, Lo aviso 
alert ("Debe escribir un código postal válido") 
//selecciono el texto 
document.f1.codigo.select() 
//coloco otra vez el foco 
//document.f1.codigo.focus() 
avisado=true 
setTimeout('avisado=false',50) 
</script> 

</head> 
<form name=f1> 
Escriba un número entero: <input type=text name=numero size=8 value=""
onblur="compruebaValidoEntero()"> 
Escriba un código postal: <input type=text name=codigo size=8 value="" onblur="compruebaValidoCP()">
*espera una cadena con 5 carácteres numéricos 
</form> 
</body> 
</html> 

Para solucionar el tema del bucle infinito, que habréis podido investigar por vosotros mismos y en el que se mostraban una caja de alerta tras otra indefinidamente, hemos utilizado una variable llamada avisado que contiene un true si ya se havisado de que el campo estaba mal y un false si no se ha avisado todavía.


Cuando se va a mostrar la caja de alerta se comprueba si se ha avisado o no al usuario. Si ya se avisó no se hace nada, evitando que se muestren más cajas de alerta. Si no se había avisado todavía se muestra la caja de alerta y se coloca el foco en el campo que era incorrecto. 

Para restituir la variable avisado a false, de modo que la próxima vez que se escriba mal el valor se muestre el mensaje correspondiente, se utiliza el método setTimeout, que ejecuta la instrucción con un retardo, en este caso de 50 milisegundos. Lo suficiente para que no se meta en un bucle infinito.




6.9.1 Manejadores de eventos (Event Handlers) en Javascript 1.3

Abort (onabort): Se lanza cuando se abortó la carga de un elemento de la página, por ejemplo una imagen. 

Blur (onblur): Se procesa este evento cuando un elemento de la página, generalmente un elemento de formulario, pierde el foco de la aplicación. 

Change (onchange): Este evento se produce cuando el usuario cambia el contenido de un elemento de formulario, tipo select, input o textarea. 

Click (onclick): Se lanza cuando el usuario hace clic sobre un elemento de la página, que puede ser un botón, un enlace, etc. 

DblClick (ondblclick): Este evento es lanzado cuando el usuario hace doble click en un elemento de formulario o un link. 

DragDrop (ondragdrop): Este evento se produce cuando el usuario arrastra y suelta un objeto en la ventana del navegador. 

Error (onerror): producido cuando hubo un error en la carga de un elemento de la página o de un documento. 

Focus (onfocus): Se produce este evento cuando un elemento de la página, generalmente un elemento de formulario, gana el foco de la aplicación. 

KeyDown (onkeydown): Este evento se lanza cuando el usuario pulsa una tecla. 

KeyPress (onkeypress): Se lanza el evento onkeypress cuando el usuario pulsa o mantiene pulsada una tecla. 

KeyUp (onkeyup): Se produce cuando el usuario suelta una tecla que tenía pulsada. 

Load (onload): Se ejecuta cuando se termina de cargar la página, o bien todos los frames del conjunto de FRAMESET. 

MouseDown (onmousedown): Este evento se produce cuando el usuario aprieta el botón del ratón. 

MouseMove (onmousemove): Se ejecuta cuando el usuario mueve el ratón. 

MouseOut (onmouseout): Se lanza cuando el usuario retira el puntero del ratón. Por ejemplo, si colocamos onmouseout sobre una imagen, el evento se lanzaría en el momento que el usuario sale con el puntero del ratón de esa imagen. 

MouseOver (onmouseover): Este evento se desata cuando el usuario mueve el puntero del ratón sobre un elemento. Imaginemos que colocamos este evento en una imagen, entonces se lanza, una sola vez, en el momento de entrar con el puntero en el área que ocupa esa imagen. 

MouseUp (onmouseup): Este evento se produce cuando el usuario suelta o deja de apretar el botón del ratón. 

Move (onmove): Se produce cuando el usuario o un script mueven la ventana del navegador. 

Reset (onreset): El evento se ejecuta cuando se resetea el contenido de un formulario, haciendo clic en un botón de reset del formulario, si es que lo tiene. 

Resize (onresize): Se lanza cuando el usuario, o un script, alteran el tamaño de una ventana del navegador o de un frame. 

Select (onselect): El evento se produce cuando el usuario selecciona un texto de un textarea o bien de un campo de texto normal. 

Submit (onsubmit): Se lanza cuando se aprieta el botón de submitir de un formulario, así que permite ejecutar código cuando el usuario envía el formulario. 

UnLoad (onunload): Evento que se produce cuando el usuario sale de un documento, osea, al salir de la página web, ya sea por pulsar un enlace que lleva a otra página o por cerrar la ventana del navegador.



Parte 5: Trabajo con formularios en Javascript

5.1 Trabajo con formularios en Javascript

El objeto form depende en la jerarquía de objetos del objeto document. En un objeto form podemos encontrar algunos métodos y propiedades, pero lo más destacado que podremos encontrar son cada uno de los elementos del formulario.

Para acceder a un formulario desde el objeto document podemos hacerlo de dos formas. 

1. A partir de su nombre, asignado con el atributo NAME de HTML. 

2. Mediante la matriz de formularios del objeto document, con el índice del formulario al que queremos acceder. 

Para este formulario 

<FORM name="f1"> 
<INPUT type=text name=campo1> 
<INPUT type=text name=campo2> 
</FORM> 

Podremos acceder con su nombre de esta manera.

document.f1 

O con su índice, si suponemos que es el primero de la página. 

document.forms[0] 

De similar manera accedemos a los elementos de un formulario, que dependen del objeto form. 

1. A partir del nombre del objeto asignado con el atributo NAME de HTML. 

2. Mediante la matriz de elementos del objeto form, con el índice del elemento al que queremos acceder. 

Podríamos acceder al campo 1 del anterior formulario de dos maneras. Con su nombre lo haríamos así. 

document.f1.campo1 

o a partir del array de elementos. 

document.f1.elements[0] (utilizamos el índice 0 porque es el primer elemento escrito en el html y en Javascript los arrays empiezan por 0.) 

Si deseamos acceder al segundo campo del formulario escribiríamos una de estas dos cosas: 

document.f1.campo2 

document.f1.elements[1] 

Recordemos que también podemos acceder a un fomulario por el array de forms, indicando el índice del formulario al que acceder. De este modo, el acceso al campo2 sería el siguiente: 

document.forms[0].campo2 
document.forms[0].elements[1] 



5.2 Ej. trabajo con formularios. Calculadora sencilla


5.2.1 Ejemplo calculadora sencilla

En este ejemplo vamos a construir una calculadora, aunque bastante sencilla, que permita realizar las operaciones básicas.

Para hacer la calculadora vamos a realizar un formulario en el que vamos a colocar tres campos de texto, los dos primeros para los operandos y un tercero para el resultado. Además habrán unos botones para hacer las operaciones básicas. 

El formulario de la calculadora se puede ver aquí.

<form name="calc"> 
<input type="Text" name="operando1" value="0" size="12"> 
<br> 
<input type="Text" name="operando2" value="0" size="12"> 
<br> 
<input type="Button" name="" value=" + " onclick="calcula('+')"> 
<input type="Button" name="" value=" - " onclick="calcula('-')"> 
<input type="Button" name="" value=" X " onclick="calcula('*')"> 
<input type="Button" name="" value=" / " onclick="calcula('/')"> 
<br>
<input type="Text" name="resultado" value="0" size="12"> 
</form>

Mediante una función vamos a acceder a los campos del formulario para recoger los operandos en dos variables. Los campos de texto tienen una propiedad llamada value que es donde podemos obtener lo que tienen escrito en ese momento.

Mas tarde nos ayudaremos de la función eval() para realizar la operación. Pondremos por último el resultado en el campo de texto creado en tercer lugar, utilizando también la propiedad value del campo de texto. 

A la función que realiza el cálculo (que podemos ver a continuación) la llamamos apretando los botones de cada una de las operaciones. Dichos botones se pueden ver en el formulario y contienen un atributo onclick que sirve para especificar las sentencias Javascript que deseamos que se ejecuten cuando el usuario pulse sobre él. En este caso, la sentencia a ejecutar es una llamada a la función calcula() pasando como parámetro el símbolo u operador de la operación que deseamos realizar.



5.2.2 script con la función calcula()

<script> 
function calcula(operacion){ 
 var operando1 = document.calc.operando1.value 
 var operando2 = document.calc.operando2.value 
 var result = eval(operando1 + operacion + operando2) 
 document.calc.resultado.value = result 
</script> 

La función eval(), recordamos, que recibía un string y lo ejecutaba como una sentencia Javascript. En este caso va a recibir un número que concatenado a una operación y otro número será siempre una expresión aritmética que eval() solucionará perfectamente.



5.3 Propiedades y métodos del objeto form

Ejemplo de utilización de propiedades y una sencilla validación de formulario y envío con el método submit().



5.3.1 Propiedades del objeto form

action
Es la acción que queremos realizar cuando se submite un formulario. Se coloca generalmente una dirección de correo o la URL a la que le mandaremos los datos. Corresponde con el atributo ACTION del formulario. 

elements array
La matriz de elementos contiene cada uno de los campos del formulario. 

encoding
El tipo de codificación del formulario 

length
El número de campos del formulario. 

method
El método por el que mandamos la información. Corresponde con el atributo METHOD del formulario. 

name
El nombre del formulario, que corresponde con el atributo NAME del formulario. 

target
La ventana o frame en la que está dirigido el formulario. Cuando se submita se actualizará la ventana o frame indicado. Corresponde con el atributo target del formulario.



5.3.2 Ejemplos de trabajo con las propiedades

Con estas propiedades podemos cambiar dinámicamente con Javascript los valores de los atributos del formulario para hacer

con él lo que se desee dependiendo de las exigencias del momento. 

Por ejemplo podríamos cambiar la URL que recibiría la información del formulario con la instrucción. 

document.miFormulario.action = "miPágina.asp"

O cambiar el target para submitir un formulario en una posible ventana secundaria llamada mi_ventana. 

document.miFormulario.target = "mi_ventana"



5.3.3 Métodos del objeto form

Estos son los métodos que podemos invocar con un formulario. 

submit()
Para hacer que el formulario se submita, aunque no se haya pulsado el botón de submit. 

reset()
Para reinicializar todos los campos del formulario, como si se hubiese pulsado el botón de reset. (Javascript 1.1) 



5.3.4 Ejemplo de trabajo con los métodos

Validar un formulario para submitirlo en caso de que esté relleno. Para ello vamos a utilizar el método submit() del formulario. 

El mecanismo es el siguiente: en vez de colocar un botón de submit colocamos un botón normal (<INPUT type="button">) y hacemos que al pulsar ese botón se llame a una función que es la encargada de validar el formulario y, en caso de que esté correcto, submitirlo.

<form name="miFormulario" action="mailto:promocion@guiarte.com" enctype="text/plain">
<input type="Text" name="campo1" value="" size="12"> 
<input type="button" value="Enviar" onclick="validaSubmite()"> 
</form> 

Nos fijamos en que no hay botón de submit, sino un botón normal con una llamada a una función que podemos ver a continuación. 

function validaSubmite(){ 
 if (document.miFormulario.campo1.value == "") 
 alert("Debe rellenar el formulario") 
 else 
 document.miFormulario.submit() 
}

 En la función se comprueba si lo que hay escrito en el formulario es un string vacío. Si es así se muestra un mensaje de alerta que informa que se debe rellenar el formulario. En caso de haya algo en el campo de texto submite el formulario utilizando el método submit del objeto form.



5.4 Control de campos de texto con Javascript

Presetntamos campos donde podemos guardar cadenas de texto: los campos de texto, password, hidden y el campo TextArea,


5.4.1 Campo Text

Es el campo que resulta de escribir la etiqueta <INPUT type="text">.



5.4.2 Propiedades del campo text

Es el valor por defecto que tiene un campo. Lo que contiene el atributo VALUE de la etiqueta <INPUT>. 

form
Hace referencia al formulario. 

name
Contiene el nombre de este campo de formulario 

type
Contiene el tipo de campo de formulario que es. 

value
El texto que hay escrito en el campo.


Vamos a ver un ejemplo donde tenemos un formulario y un botón de reset. Si pulsamos el botón de reset el campo de texto se vacía porque su value de HTML era un string vacío. Pero si pulsamos el botón siguiente llamamos a una función que cambia el valor por defecto de ese campo de texto, de modo que al pulsar el botón de reset mostrará el nuevo valor por defecto.

<html> 
<head> 
 <title>Cambiar el valor por defecto</title> 
 <script> 
 function cambiaDefecto(){ 
 document.miFormulario.campo1.defaultValue = "Hola!!" 
 } 
 </script> 
</head>
<body> 
<form name="miFormulario" action="mailto:promocion@guiarte.com" enctype="text/plain"> 
<input type="Text" name="campo1" value="" size="12"> 
<input type="Reset"> 
<br> 
<br> 
<input type="button" value="Cambia valor por defecto" onclick="cambiaDefecto()"> 
</form> 
</body>
</html>



5.4.3 Métodos del objeto Text


blur()
Retira el foco de la aplicación del campo de texto. 

focus()
Pone el foco de la aplicación en el campo de texto. 

select()
Selecciona el texto del campo.

Como ejemplo vamos a mostrar una función que selecciona el texto de un campo de texto de un formulario como el de la página del ejemplo anterior. Para hacerlo hemos utilizado dos métodos, el primero para pasar el foco de la aplicación al campo de texto y el segundo para seleccionar el texto. 

function seleccionaFoco(){ 
 document.miFormulario.campo1.focus() 
 document.miFormulario.campo1.select() 
}



5.4.4 Campos Password

Estos funcionan igual que los hidden, con la peculiaridad que el contenido del campo no puede verse escrito en el campo, por lo que salen asteríscos en lugar del texto. 



5.4.5 Campos Hidden

Los campos hidden son como campos de texto que están ocultos para el usuario, es decir, que no se ven en la página. Son muy útiles en el desarrollo de webs para pasar variables en los formularios a las que no debe tener acceso el usuario. 

Se colocan en con HTML con la etiqueta <INPUT type=hidden> y se rellenan de datos con su atributo value. Mas tarde podremos cambiar el dato que figura en el campo accediendo a la propiedad value del campo de texto igual que lo hemos hecho antes. 

document.miFormulario.CampoHidden.value = "nuevo texto"

El campo hidden sólo tiene algunas de las propiedades de los campos de texto. En concreto tiene la propiedad value y las propiedades que son comunes de todos los campos de formulario: name, from y type.



5.5 Control de Checkbox en Javascript

Control del elemento de formulario tipo checkbox o caja de verificación.


Los checkbox son las unas cajas que permiten marcarlas o no para verificar alguna cosa en un formulario.

Los checkbox se consiguen con la etiqueta <INPUT type=checkbox>. Con el atributo NAME de la etiqueta <INPUT> le podemos dar un nombre para luego acceder a ella con javascript. Con el atributo CHECKED indicamos que el campo debe aparecer chequeado por defecto. 

Con Javascript, a partir de la jerarquía de objetos del navegador, tenemos acceso al checkbox, que depende del objeto form del formulario donde está incluido.



5.5.1 Propiedades de un checkbox

checked
Informa sobre el estado del checkbox. Puede ser true o false. 

defaultChecked
Si está chequeada por defecto o no. 

value
El valor actual del checkbox. 

También tiene las propiedades form, name, type como cualquier otro elemento de formulario. 



5.5.2 Métodos del checkbox

click()
Es como si hiciésemos un click sobre el checkbox, es decir, cambia el estado del checkbox. 

blur()
Retira el foco de la aplicación del checkbox. 

focus()
Coloca el foco de la aplicación en el checkbox. 

Para ilustrar el funcionamiento de las checkbox vamos a ver una página que tiene un checkbox y tres botones. Los dos primeros para mostrar las propiedades checked y value y el tercero para invocar a su método click() con objetivo de simular un click sobre el checkbox. 

<html> 
<head> 
  <title>Ejemplo Checkbox</title> 
<script> 
function alertaChecked(){ 
  alert(document.miFormulario.miCheck.checked) 
function alertaValue(){ 
  alert(document.miFormulario.miCheck.value) 
}
function metodoClick(){ 
  document.miFormulario.miCheck.click() 
</script> 
</head> 
<body> 
<form name="miFormulario" action="mailto:promocion@guiarte.com" enctype="text/plain"> 
<input type="checkbox" name="miCheck"> 
<br> 
<br> 
<input type="button" value="informa de su propiedad checked" onclick="alertaChecked()"> 
<input type="button" value="informa de su propiedad value" onclick="alertaValue()"> 
<br> 
<br> 
<input type="button" value="Simula un click" onclick="metodoClick()"> 
</form>
</body> 

</html>