Académique Documents
Professionnel Documents
Culture Documents
JavaScript
Capt lo !. "ntrod ccin .................................................................................................................... ......... 5 2&2& 34u es JavaScript5 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6 2&7& 8reve )istoria&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6 2&%& Especi1icaciones o1iciales&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9 2&:& Cmo incluir JavaScript en documentos ;<=>L &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9 2&6& Eti/ueta noscript &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ? 2&9& @losario bsico &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& A 2&B& SintaCis&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2' 2&?& Posibilidades , limitaciones &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 22 2&A& JavaScript , navegadores&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 22 2&2'& primer script Capt lo %&2& Dariables &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 29 %&7& %&%& #peradores&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 72 %&:& %&6& Capt lo :&2& Eunciones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& %? :&7& :&%& Fmbito Sentencias de breaG las , variables&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :: Estructuras Eunciones , '. de propiedades control bsicas de de 1lujo &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 7B JavaScript&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& %% $ro%ramacin avanzada...........................................................................................................#( =ipos de variables &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2? ........................................................................................................................!# #. $ro%ramacin JavaScript en otros entornos &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 27 Capt lo 2. El
bsica................................................................................................................!&
continue&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :9 :&:& #tras estructuras :B Capt lo de 5. &. control&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......5! ........&! 9&2& 9&7& 9&%& Capt lo ........,( B&2& Propiedades bsicas de 1ormularios , elementos &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& B? B&7& B&%& Dalidacin &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?B Capt lo tilidades 9' ?&2& ?&7& Calendario&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& A9 ?&%& =ooltip&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2'' ?&:& ?&6& Capt lo A&2& A&7& 9. Correccin Correccin @aleras )eteccin de de y errores de correccin con errores >enI imgenes de Internet con desplegable &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2'% (Lig)tboC-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2'9 errores..........................................................................................!!0 ECplorer&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 22' Eire1oC &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 227 elojes0 contadores e intervalos de tiempo &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& A: (. *tras ....................................................................................................................... Htilidades bsicas para 1ormularios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?' #bteniendo >odelo in1ormacin del >odelos bsico evento de de (objeto ,. eventos &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 92 eventos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 97 event- &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9? -orm larios ..................................................................................................................... Capt lo
A&%&
Correccin
de
errores
con
Capt lo !0. .ec rsos /tiles.....................................................................................................................!!& Capt lo !!. E0ercicios res eltos ..............................................................................................................!!,
Para evitar una guerra de tecnologas0 !etscape decidi /ue lo mejor sera estandarizar el lenguaje JavaScript& $e esta 1orma0 en 2AAB se envi la especi1icacin JavaScript 2&2 al organismo EC>J (European Computer Manufacturers Association -& EC>J cre el comit =C%A con el objetivo de "estandarizar de un lenguaje de script multiplataforma e independiente de cualquier empresa" & El primer estndar /ue cre el comit =C%A se denomin EC+892&20 en el /ue se de1ini por primera vez el lenguaje EC>JScript& Por este motivo0 algunos programadores pre1ieren la denominacin ECMAScript para re1erirse al lenguaje JavaScript& $e )ec)o0 JavaScript no es ms /ue la implementacin /ue realiz la empresa !etscape del estndar EC>JScript& La organizacin internacional para la estandarizacin (IS#- adopt el estndar EC>J"797 a travs de su comisin IEC0 dando lugar al estndar IS#+IEC"29797&
LtitleMEjemplo de cdigo JavaScript en el propio documentoL+titleM Lscript t,peRPteCt+javascriptPM alert(PHn mensaje de pruebaP-S L+scriptM L+)eadM Lbod,M LpMHn prra1o de teCto&L+pM L+bod,M L+)tmlM
Para /ue la pgina ;<=>L resultante sea vlida0 es necesario aKadir el atributo t,pe a la eti/ueta LscriptM& Los valores /ue se inclu,en en el atributo t,pe estn estandarizados , para el caso de JavaScript0 el valor correcto es teCt+javascript& Este mtodo se emplea cuando se de1ine un blo/ue pe/ueKo de cdigo o cuando se /uieren incluir instrucciones espec1icas en un determinado documento <=>L /ue completen las instrucciones , 1unciones /ue se inclu,en por de1ecto en todos los documentos del sitio .eb& El principal inconveniente es /ue si se /uiere )acer una modi1icacin en el blo/ue de cdigo0 es necesario modi1icar todas las pginas /ue inclu,en ese mismo blo/ue de cdigo JavaScript&
n arc7ivo e?terno
Las instrucciones JavaScript se pueden incluir en un arc)ivo eCterno de tipo JavaScript /ue los documentos ;<=>L enlazan mediante la eti/ueta LscriptM& Se pueden crear todos los arc)ivos JavaScript /ue sean necesarios , cada documento ;<=>L puede enlazar tantos arc)ivos JavaScript como necesite& Ejemplo* Jrc)ivo codigo&js
alert(PHn mensaje de pruebaP-S
$ocumento ;<=>L
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjemplo de cdigo JavaScript en el propio documentoL+titleM Lscript t,peRPteCt+javascriptP srcRP+js+codigo&jsPML+scriptM L+)eadM Lbod,M LpMHn prra1o de teCto&L+pM L+bod,M L+)tmlM
Jdems del atributo t,pe0 este mtodo re/uiere de1inir el atributo src0 /ue es el /ue indica la H L correspondiente al arc)ivo JavaScript /ue se /uiere enlazar& Cada eti/ueta LscriptM
solamente puede enlazar un Inico arc)ivo0 pero en una misma pgina se pueden incluir tantas eti/uetas LscriptM como sean necesarias& Los arc)ivos de tipo JavaScript son documentos normales de teCto con la eCtensin &js0 /ue se pueden crear con cual/uier editor de teCto como !otepad0 Qordpad0 EmEditor0 HltraEdit0 Di0 etc& La principal ventaja de enlazar un arc)ivo JavaScript eCterno es /ue se simpli1ica el cdigo ;<=>L de la pgina0 /ue se puede reutilizar el mismo cdigo JavaScript en todas las pginas del sitio .eb , /ue cual/uier modi1icacin realizada en el arc)ivo JavaScript se ve re1lejada inmediatamente en todas las pginas ;<=>L /ue lo enlazan&
El ma,or inconveniente de este mtodo es /ue ensucia innecesariamente el cdigo ;<=>L de la pgina , complica el mantenimiento del cdigo JavaScript& En general0 este mtodo slo se utiliza para de1inir algunos eventos , en algunos otros casos especiales0 como se ver ms adelante&
El lenguaje <=>L de1ine la eti/ueta LnoscriptM para mostrar un mensaje al usuario cuando su navegador no puede ejecutar JavaScript& El siguiente cdigo muestra un ejemplo del uso de la eti/ueta LnoscriptM*
L)eadM &&& L+)eadM Lbod,M LnoscriptM LpM8ienvenido a >i SitioL+pM LpMLa pgina /ue ests viendo re/uiere para su 1uncionamiento el uso de JavaScript& Si lo )as des)abilitado intencionadamente0 por 1avor vuelve a activarlo&L+pM L+noscriptM L+bod,M
La eti/ueta LnoscriptM se debe incluir en el interior de la eti/ueta Lbod,M (normalmente se inclu,e al principio de Lbod,M-& El mensaje /ue muestra LnoscriptM puede incluir cual/uier elemento o eti/ueta ;<=>L&
Sentencia* cada una de las instrucciones /ue 1orman un script& $alabras reservadas* son las palabras (en ingls- /ue se utilizan para construir las sentencias de JavaScript , /ue por tanto no pueden ser utilizadas libremente& Las palabras actualmente reservadas por JavaScript son* breaG0 case0 catc)0 continue0 de1ault0 delete0 do0 else0 1inall,0 1or0 1unction0 i10 in0 instanceo10 ne.0 return0 s.itc)0 t)is0 t)ro.0 tr,0 t,peo10 var0 void0 .)ile0 .it)&
!.,. Sinta?is
La sintaCis de un lenguaje de programacin se de1ine como el conjunto de reglas /ue deben seguirse al escribir el cdigo 1uente de los programas para considerarse como correctos para ese lenguaje de programacin& La sintaCis de JavaScript es mu, similar a la de otros lenguajes de programacin como Java , C& Las normas bsicas /ue de1inen la sintaCis de JavaScript son las siguientes* Bo se tienen en c enta los espacios en blanco y las n evas lneas* como sucede con ;<=>L0 el intrprete de JavaScript ignora cual/uier espacio en blanco sobrante0 por lo /ue el cdigo se puede ordenar de 1orma adecuada para entenderlo mejor (tabulando las lneas0 aKadiendo espacios0 creando nuevas lneas0 etc& Se distin% en las may/sc las y min/sc las* al igual /ue sucede con la sintaCis de las eti/uetas , elementos ;<=>L& Sin embargo0 si en una pgina ;<=>L se utilizan indistintamente ma,Isculas , minIsculas0 la pgina se visualiza correctamente0 siendo el Inico problema la no validacin de la pgina& En cambio0 si en JavaScript se intercambian ma,Isculas , minIsculas el script no 1unciona& Bo se de:ine el tipo de las variables* al crear una variable0 no es necesario indicar el tipo de dato /ue almacenar& $e esta 1orma0 una misma variable puede almacenar di1erentes tipos de datos durante la ejecucin del script& Bo es necesario terminar cada sentencia con el carcter de p nto y coma CDE* en la ma,ora de lenguajes de programacin0 es obligatorio terminar cada sentencia con el carcter S& Jun/ue JavaScript no obliga a )acerlo0 es conveniente seguir la tradicin de terminar cada sentencia con el carcter del punto , coma ( S-& Se p eden incl ir comentarios* los comentarios se utilizan para aKadir in1ormacin en el cdigo 1uente del programa& Jun/ue el contenido de los comentarios no se visualiza por pantalla0 si /ue se enva al navegador del usuario junto con el resto del script0 por lo /ue es necesario eCtremar las precauciones sobre la in1ormacin incluida en los comentarios& JavaScript de1ine dos tipos de comentarios* los de una sola lnea , los /ue ocupan varias lneas& Ejemplo de comentario de una sola lnea*
// a continuacin se muestra un mensaje alert(Pmensaje de pruebaP-S
Los comentarios de una sola lnea se de1inen aKadiendo dos barras oblicuas ( ++- al principio de la lnea&
Los comentarios multilnea se de1inen encerrando el teCto del comentario entre los smbolos +U , U+&
En este ejemplo0 el script se inclu,e como un blo/ue de cdigo dentro de una pgina ;<=>L& Por tanto0 en primer lugar se debe crear una pgina ;<=>L correcta /ue inclu,a la declaracin del $#C=OPE0 el atributo Cmlns0 las secciones L)eadM , Lbod,M0 la eti/ueta LtitleM0 etc& Jun/ue el cdigo del script se puede incluir en cual/uier parte de la pgina0 se recomienda incluirlo en la cabecera del documento0 es decir0 dentro de la eti/ueta L)eadM& J continuacin0 el cdigo JavaScript se debe incluir entre las eti/uetas LscriptM&&&L+scriptM& Jdems0 para /ue la pgina sea vlida0 es necesario de1inir el atributo t,pe de la eti/ueta LscriptM& =cnicamente0 el atributo t,pe se corresponde con Pel tipo >I>EP0 /ue es un estndar para identi1icar los di1erentes tipos de contenidos& El Ptipo >I>EP correcto para JavaScript es teCt+javascript& Hna vez de1inida la zona en la /ue se incluir el script0 se escriben todas las sentencias /ue 1orman la aplicacin& Este primer ejemplo es tan sencillo /ue solamente inclu,e una sentencia* alert(P<ola >undoNP-S& La instruccin alert(- es una de las utilidades /ue inclu,e JavaScript , permite mostrar un mensaje en la pantalla del usuario& Si se visualiza la pgina .eb de este primer script en cual/uier navegador0 automticamente se mostrar una ventana con el mensaje P<ola >undoNP& J continuacin se muestra el resultado de ejecutar el script en di1erentes navegadores* Eigura 7&2& >ensaje mostrado con Palert(-P en Internet ECplorer
Como se puede observar en las imgenes anteriores0 el 1uncionamiento de la utilidad alert(en los distintos navegadores es idntico& Sin embargo0 eCisten grandes di1erencias visuales en la 1orma en la /ue se presentan los mensajes&
=odo el cdigo JavaScript se encuentre en un arc)ivo eCterno llamado codigo&js , el script siga 1uncionando de la misma manera& 7 $espus del primer mensaje0 se debe mostrar otro mensaje /ue diga "So! el primer script" % JKadir algunos comentarios /ue eCpli/uen el 1uncionamiento del cdigo : JKadir en la pgina ;<=>L un mensaje de aviso para los navegadores /ue no tengan activado el soporte de JavaScript
#.!. Fariables
Las variables en los lenguajes de programacin siguen una lgica similar a las variables utilizadas en otros mbitos como las matemticas& Hna variable es un elemento /ue se emplea para almacenar , )acer re1erencia a otro valor& @racias a las variables es posible crear "programas gen$ricos"0 es decir0 programas /ue 1uncionan siempre igual independientemente de los valores concretos utilizados& $e la misma 1orma /ue si en >atemticas no eCistieran las variables no se podran de1inir las ecuaciones , 1rmulas0 en programacin no se podran )acer programas realmente Itiles sin las variables& Si no eCistieran variables0 un programa /ue suma dos nImeros podra escribirse como*
resultado R % W 2
El programa anterior es tan poco Itil /ue slo sirve para el caso en el /ue el primer nImero de la suma sea el % , el segundo nImero sea el 2& En cual/uier otro caso0 el programa obtiene un resultado incorrecto& Sin embargo0 el programa se puede re)acer de la siguiente manera utilizando variables para almacenar , re1erirse a cada nImero*
numeroX2 R % numeroX7 R 2 resultado R numeroX2 W numeroX7
Los elementos numeroX2 , numeroX7 son variables /ue almacenan los valores /ue utiliza el programa& El resultado se calcula siempre en 1uncin del valor almacenado por las variables0 por lo /ue este programa 1unciona correctamente para cual/uier par de nImeros indicado& Si se modi1ica el valor de las variables numeroX2 , numeroX70 el programa sigue 1uncionando correctamente& Las variables en JavaScript se crean mediante la palabra reservada var& $e esta 1orma0 el ejemplo anterior se puede realizar en JavaScript de la siguiente manera*
La palabra reservada var solamente se debe indicar al de1inir por primera vez la variable0 lo /ue se denomina declarar una variable& Cuando se utilizan las variables en el resto de instrucciones del script0 solamente es necesario indicar su nombre& En otras palabras0 en el ejemplo anterior sera un error indicar lo siguiente*
var numeroX2 R %S var numeroX7 R 2S var resultado R var numeroX2 W var numeroX7S
Si cuando se declara una variable se le asigna tambin un valor0 se dice /ue la variable )a sido inicializada& En JavaScript no es obligatorio inicializar las variables0 ,a /ue se pueden declarar por una parte , asignarles un valor posteriormente& Por tanto0 el ejemplo anterior se puede re)acer de la siguiente manera*
var numeroX2S var numeroX7S numeroX2 R %S numeroX7 R 2S var resultado R numeroX2 W numeroX7S
Hna de las caractersticas ms sorprendentes de JavaSript para los programadores )abituados a otros lenguajes de programacin es /ue tampoco es necesario declarar las variables& En otras palabras0 se pueden utilizar variables /ue no se )an de1inido anteriormente mediante la palabra reservada var& El ejemplo anterior tambin es correcto en JavaScript de la siguiente 1orma*
var numeroX2 R %S var numeroX7 R 2S resultado R numeroX2 W numeroX7S
La variable resultado no est declarada0 por lo /ue JavaScript crea una variable global (ms adelante se vern las di1erencias entre variables locales , globales- , le asigna el valor correspondiente& $e la misma 1orma0 tambin sera correcto el siguiente cdigo*
numeroX2 R %S numeroX7 R 2S resultado R numeroX2 W numeroX7S
En cual/uier caso0 se recomienda declarar todas las variables /ue se va,an a utilizar& El nombre de una variable tambin se conoce como identi:icador , debe cumplir las siguientes normas* Slo puede estar 1ormado por letras0 nImeros , los smbolos Y (dlar- , X(guin bajo-& El primer carcter no puede ser un nImero& Por tanto0 las siguientes variables tienen nombres correctos*
#.2.!. B m3ricas
Se utilizan para almacenar valores numricos enteros (llamados integer en ingls- o decimales (llamados float en ingls-& En este caso0 el valor se asigna indicando directamente el nImero entero o decimal& Los nImeros decimales utilizan el carcter & (punto- en vez de 0 (coma- para separar la parte entera , la parte decimal*
var iva R 29S // varia#le tipo entero var total R 7%:&96S // varia#le tipo decimal
En ocasiones0 el teCto /ue se almacena en las variables no es tan sencillo& Si por ejemplo el propio teCto contiene comillas simples o dobles0 la estrategia /ue se sigue es la de encerrar el teCto con las comillas (simples o dobles- /ue no utilice el teCto*
/* El contenido de te'to( tiene comillas simples) por lo que se encierra con comillas do#les */ var teCto2 R PHna 1rase con Tcomillas simplesT dentroPS /* El contenido de te'to* tiene comillas do#les) por lo que se encierra con comillas simples */ var teCto7 R THna 1rase con Pcomillas doblesP dentroTS
!o obstante0 a veces las cadenas de teCto contienen tanto comillas simples como dobles& Jdems0 eCisten otros caracteres /ue son di1ciles de incluir en una variable de teCto (tabulador0 E!=E 0 etc&- Para resolver estos problemas0 JavaScript de1ine un mecanismo para incluir de 1orma sencilla caracteres especiales , problemticos dentro de una cadena de teCto&
El mecanismo consiste en sustituir el carcter problemtico por una combinacin simple de caracteres& J continuacin se muestra la tabla de conversin /ue se debe utilizar*
$e esta 1orma0 el ejemplo anterior /ue contena comillas simples , dobles dentro del teCto se puede re)acer de la siguiente 1orma*
var teCto2 R THna 1rase con ZTcomillas simplesZT dentroTS var teCto7 R PHna 1rase con ZPcomillas doblesZP dentroPS
Este mecanismo de JavaScript se denomina "mecanismo de escape" de los caracteres problemticos0 , es )abitual re1erirse a /ue los caracteres )an sido "escapados"&
El mensaje /ue se muestra al usuario se almacene en una variable llamada mensaje , el 1uncionamiento del script sea el mismo& 7 El mensaje mostrado sea el de la siguiente imagen* Eigura %&2& !uevo mensaje /ue debe mostrar el script
#.2.#. 8rrays
En ocasiones0 a los arra,s se les llama vectores0 matrices e incluso arreglos& !o obstante0 el trmino arra, es el ms utilizado , es una palabra comInmente aceptada en el entorno de la programacin& Hn arra, es una coleccin de variables0 /ue pueden ser todas del mismo tipo o cada una de un tipo di1erente& Su utilidad se comprende mejor con un ejemplo sencillo* si una aplicacin necesita manejar los das de la semana0 se podran crear siete variables de tipo teCto*
var dia2 R PLunesPS var dia7 R P>artesPS &&& var diaB R P$omingoPS
Jun/ue el cdigo anterior no es incorrecto0 s /ue es poco e1iciente , complica en eCceso la programacin& Si en vez de los das de la semana se tuviera /ue guardar el nombre de los meses del aKo0 el nombre de todos los pases del mundo o las mediciones diarias de temperatura de los Iltimos 2'' aKos0 se tendran /ue crear decenas o cientos de variables& En este tipo de casos0 se pueden agrupar todas las variables relacionadas en una coleccin de variables o arra,& El ejemplo anterior se puede re)acer de la siguiente 1orma*
var dias R [PLunesP0 P>artesP0 P>ircolesP0 PJuevesP0 PDiernesP0 PSbadoP0 P$omingoP\S
J)ora0 una Inica variable llamada dias almacena todos los valores relacionados entre s0 en este caso los das de la semana& Para de1inir un arra,0 se utilizan los caracteres [ , \ para delimitar su comienzo , su 1inal , se utiliza el carcter 0(coma- para separar sus elementos*
var nombreXarra, R [valor20 valor70 &&&0 valor!\S
Hna vez de1inido un arra,0 es mu, sencillo acceder a cada uno de sus elementos& Cada elemento se accede indicando su posicin dentro del arra,& La Inica complicacin0 /ue es responsable de muc)os errores cuando se empieza a programar0 es /ue las posiciones de los elementos empiezan a contarse en el ', no en el 2*
var diaSeleccionado R dias['\S // diaSeleccionado + "Lunes" var otro$ia R dias[6\S // otro,ia + "S%#ado"
En el ejemplo anterior0 la primera instruccin /uiere obtener el primer elemento del arra,& Para ello0 se indica el nombre del arra, , entre corc)etes la posicin del elemento dentro del arra,& Como se )a comentado0 las posiciones se empiezan a contar en el '0 por lo /ue el primer elemento ocupa la posicin ' , se accede a el mediante dias['\& El valor dias[6\ )ace re1erencia al elemento /ue ocupa la seCta posicin dentro del arra, dias& Como las posiciones empiezan a contarse en '0 la posicin 6)ace re1erencia al seCto elemento0 en este caso0 el valor Sbado&
Crear un arra, llamado meses , /ue almacene el nombre de los doce meses del aKo& >ostrar por pantalla los doce nombres utilizando la 1uncin alert(-&
#.2.'. 6ooleanos
Las variables de tipo #oolean o #ooleano tambin se conocen con el nombre de variables de tipo lgico& Jun/ue para entender realmente su utilidad se debe estudiar la programacin avanzada con JavaScript del siguiente captulo0 su 1uncionamiento bsico es mu, sencillo& Hna variable de tipo #oolean almacena un tipo especial de valor /ue solamente puede tomar dos valores* true (verdadero- o 1alse (1also-& !o se puede utilizar para almacenar nImeros , tampoco permite guardar cadenas de teCto& Los Inicos valores /ue pueden almacenar estas variables son true , 1alse0 por lo /ue no pueden utilizarse los valores verdadero , 1also& J continuacin se muestra un par de variables de tipo #ooleano*
var cliente egistrado R 1alseS var ivaIncluido R trueS
#.#. *peradores
Las variables por s solas son de poca utilidad& <asta a)ora0 slo se )a visto cmo crear variables de di1erentes tipos , cmo mostrar su valor mediante la 1uncin alert(-& Para )acer programas realmente Itiles0 son necesarias otro tipo de )erramientas& Los operadores permiten manipular el valor de las variables0 realizar operaciones matemticas con sus valores , comparar di1erentes variables& $e esta 1orma0 los operadores permiten a los programas realizar clculos complejos , tomar decisiones lgicas en 1uncin de comparaciones , otros tipos de condiciones&
#.#.!. 8si%nacin
El operador de asignacin es el ms utilizado , el ms sencillo& Este operador se utiliza para guardar un valor espec1ico en una variable& El smbolo utilizado es R (no con1undir con el operador RR/ue se ver ms adelante-*
var numero2 R %S
J la iz/uierda del operador0 siempre debe indicarse el nombre de una variable& J la derec)a del operador0 se pueden indicar variables0 valores0 condiciones lgicas0 etc*
var numero2 R %S var numero7 R :S /* Error) la asignacin siempre se realiza a una varia#le) por lo que en la izquierda no se puede indicar un n"mero */ 6 R numero2S // A-ora) la varia#le numero( vale . numero2 R 6S // A-ora) la varia#le numero( vale / numero2 R numero7S
El operador de incremento se indica mediante el pre1ijo WW en el nombre de la variable& El resultado es /ue el valor de esa variable se incrementa en una unidad& Por tanto0 el anterior ejemplo es e/uivalente a*
var numero R 6S numero R numero W 2S alert(numero-S // numero + 0
$e 1orma e/uivalente0 el operador decremento (indicado como un pre1ijo ""en el nombre de la variable- se utiliza para decrementar el valor de la variable*
var numero R 6S ""numeroS alert(numero-S // numero + /
Los operadores de incremento , decremento no solamente se pueden indicar como pre1ijo del nombre de la variable0 sino /ue tambin es posible utilizarlos como su1ijo& En este caso0 su comportamiento es similar pero mu, di1erente& En el siguiente ejemplo*
var numero R 6S numeroWWS alert(numero-S // numero + 0
El resultado de ejecutar el script anterior es el mismo /ue cuando se utiliza el operador W Wnumero0 por lo /ue puede parecer /ue es e/uivalente indicar el operador WW delante o detrs del identi1icador de la variable& Sin embargo0 el siguiente ejemplo muestra sus di1erencias*
var numero2 R 6S var numero7 R 7S numero% R numero2WW W numero7S // numero1 + 2) numero( + 0 var numero2 R 6S var numero7 R 7S numero% R WWnumero2 W numero7S // numero1 + 3) numero( + 0
Si el operador WW se indica como pre1ijo del identi1icador de la variable0 su valor se incrementa antes de realizar cual/uier otra operacin& Si el operador WW se indica como su1ijo del identi1icador de la variable0 su valor se incrementa desp 3s de ejecutar la sentencia en la /ue aparece& Por tanto0 en la instruccin numero% R numero2WW W numero7S0 el valor de numero2 se incrementa despus de realizar la operacin (primero se suma , numero% vale B0 despus se incrementa el valor de numero2 , vale 9-& Sin embargo0 en la instruccin numero% R W Wnumero2 W numero7S0 en primer lugar se incrementa el valor de numero2 , despus se realiza la suma (primero se incrementa numero2 , vale 90 despus se realiza la suma , numero%vale ?-&
#.#.#. >%icos
Los operadores lgicos son imprescindibles para realizar aplicaciones complejas0 ,a /ue se utilizan para tomar decisiones sobre las instrucciones /ue debera ejecutar el programa en 1uncin de ciertas condiciones& El resultado de cual/uier operacin /ue utilice operadores lgicos siempre es un valor lgico o #ooleano&
#.#.#.!. Be%acin
Hno de los operadores lgicos ms utilizados es el de la negacin& Se utiliza para obtener el valor contrario al valor de la variable*
var visible R trueS alert(Nvisible-S // Muestra "false" ! no "true"
La negacin lgica se obtiene pre1ijando el smbolo N al identi1icador de la variable& El 1uncionamiento de este operador se resume en la siguiente tabla*
Si la variable original es de tipo #ooleano0 es mu, sencillo obtener su negacin& Sin embargo0 3/u sucede cuando la variable es un nImero o una cadena de teCto5 Para obtener la negacin en este tipo de variables0 se realiza en primer lugar su conversin a un valor #ooleano* Si la variable contiene un nImero0 se trans1orma en 1alsesi vale ', en true para cual/uier otro nImero (positivo o negativo0 decimal o entero-& Si la variable contiene una cadena de teCto0 se trans1orma en 1alse si la cadena es vaca (PP- , en true en cual/uier otro caso&
var cantidad R 'S vacio R NcantidadS // vacio + true cantidad R 7S vacio R NcantidadS // vacio + false
var mensaje R PPS mensajeDacio R NmensajeS // mensaje4acio + true mensaje R P8ienvenidoPS mensajeDacio R NmensajeS // mensaje4acio + false
#.#.#.2. 8B)
La operacin lgica J!$ obtiene su resultado combinando dos valores booleanos& El operador se indica mediante el smbolo ]], su resultado solamente es truesi los dos operandos son true*
var valor2 R trueS var valor7 R 1alseS resultado R valor2 ]] valor7S // resultado + false valor2 R trueS valor7 R trueS resultado R valor2 ]] valor7S // resultado + true
#.#.#.#. *.
La operacin lgica # tambin combina dos valores booleanos& El operador se indica mediante el smbolo ^^ , su resultado es truesi alguno de los dos operandos es true*
var valor2 R trueS var valor7 R 1alseS resultado R valor2 ^^ valor7S // resultado + true valor2 R 1alseS valor7 R 1alseS resultado R valor2 ^^ valor7S // resultado + false
#.#.'. +atemticos
JavaScript permite realizar manipulaciones matemticas sobre el valor de las variables numricas& Los operadores de1inidos son* suma ( W-0 resta ("-0 multiplicacin (U- , divisin (+-& Ejemplo*
var numero2 R 2'S var numero7 R 6S resultado R numero2 + numero7S // resultado + * resultado R % W numero2S // resultado + (1 resultado R numero7 _ :S // resultado + ( resultado R numero2 U numero 7S // resultado + .5
Jdems de los cuatro operadores bsicos0 JavaScript de1ine otro operador matemtico /ue no es sencillo de entender cuando se estudia por primera vez0 pero /ue es mu, Itil en algunas ocasiones& Se trata del operador "mdulo"0 /ue calcula el resto de la divisin entera de dos nImeros& Si se divide por ejemplo 2' , 60 la divisin es eCacta , da un resultado de 7& El resto de esa divisin es '0 por lo /ue mdulo de 2' , 6 es igual a '& Sin embargo0 si se divide A , 60 la divisin no es eCacta0 el resultado es 2 , el resto :0 por lo /ue mdulo de A , 6 es igual a :& El operador mdulo en JavaScript se indica mediante el smbolo `0 /ue no debe con1undirse con el clculo del porcentaje*
var numero2 R 2'S var numero7 R 6S resultado R numero2 ` numero7S // resultado + 5 numero2 R AS numero7 R 6S resultado R numero2 ` numero7S // resultado + /
Los operadores matemticos tambin se pueden combinar con el operador de asignacin para abreviar su notacin*
var numero2 R 6S numero2 WR %S // numero( + numero( 6 1 + 3 numero2 "R 2S // numero( + numero( 7 ( + / numero2 UR 7S // numero( + numero( * * + (5 numero2 +R 6S // numero( + numero( / . + ( numero2 `R :S // numero( + numero( 8 / + (
#.#.5. .elacionales
Los operadores relacionales de1inidos por JavaScript son idnticos a los /ue de1inen las matemticas* ma,or /ue (M-0 menor /ue (L-0 ma,or o igual (MR-0 menor o igual (LR-0 igual /ue (RR- , distinto de (NR-&
Los operadores /ue relacionan variables son imprescindibles para realizar cual/uier aplicacin compleja0 como se ver en el siguiente captulo de programacin avanzada& El resultado de todos estos operadores siempre es un valor booleano*
var numero2 R %S var numero7 R 6S resultado R numero2 M numero7S // resultado + false resultado R numero2 L numero7S // resultado + true numero2 R 6S numero7 R 6S resultado R numero2 MR numero7S // resultado + true resultado R numero2 LR numero7S // resultado + true resultado R numero2 RR numero7S // resultado + true resultado R numero2 NR numero7S // resultado + false
Se debe tener especial cuidado con el operador de igualdad ( RR-0 ,a /ue es el origen de la ma,ora de errores de programacin0 incluso para los usuarios /ue ,a tienen cierta eCperiencia desarrollando scripts& El operador RR se utiliza para comparar el valor de dos variables0 por lo /ue es mu, di1erente del operador R0 /ue se utiliza para asignar un valor a una variable*
// El operador "+" asigna valores var numero2 R 6S resultado R numero2 R %S // numero( + 1 ! resultado + 1 // El operador "++" compara varia#les var numero2 R 6S resultado R numero2 RR %S // numero( + . ! resultado + false
Los operadores relacionales tambin se pueden utilizar con variables de tipo cadena de teCto*
var teCto2 R P)olaPS var teCto7 R P)olaPS var teCto% R PadiosPS resultado R teCto2 RR teCto%S // resultado + false resultado R teCto2 NR teCto7S // resultado + false resultado R teCto% MR teCto7S // resultado + false
Cuando se utilizan cadenas de teCto0 los operadores Pma,or /ueP ( M- , Pmenor /ueP (Lsiguen un razonamiento no intuitivo* se compara letra a letra comenzando desde la iz/uierda )asta /ue se encuentre una di1erencia entre las dos cadenas de teCto& Para determinar si una letra es ma,or o menor /ue otra0 las ma,Isculas se consideran menores /ue las minIsculas , las primeras letras del al1abeto son menores /ue las Iltimas ( a es menor /ue b0 b es menor /ue c0 J es menor /ue a0 etc&-
J partir del siguiente arra, /ue se proporciona* var valores R [true0 60 1alse0 P)olaP0 PadiosP0 7\S 2& $eterminar cual de los dos elementos de teCto es ma,or
Htilizando eCclusivamente los dos valores booleanos del arra,0 determinar los operadores necesarios para obtener un resultado true , otro resultado 1alse 7 $eterminar el resultado de las cinco operaciones matemticas realizadas con los dos elementos numricos
#.'.!. Estr ct ra i:
La estructura ms utilizada en JavaScript , en la ma,ora de lenguajes de programacin es la estructura i1& Se emplea para tomar decisiones en 1uncin de una condicin& Su de1inicin 1ormal es*
i1(condicion- a &&& b
Si la condicin se cumple (es decir0 si su valor es true- se ejecutan todas las instrucciones /ue se encuentran dentro de a&&&b& Si la condicin no se cumple (es decir0 si su valor es 1alseno se ejecuta ninguna instruccin contenida en a&&&b , el programa continIa ejecutando el resto de instrucciones del script& Ejemplo*
var mostrar>ensaje R trueS i1(mostrar>ensaje- a alert(P<ola >undoP-S b
En el ejemplo anterior0 el mensaje s /ue se muestra al usuario ,a /ue la variable mostrar>ensaje tiene un valor de true , por tanto0 el programa entra dentro del blo/ue de instrucciones del i1& El ejemplo se podra reescribir tambin como*
En este caso0 la condicin es una comparacin entre el valor de la variable mostrar>ensaje , el valor true& Como los dos valores coinciden0 la igualdad se cumple , por tanto la condicin es cierta0 su valor es true, se ejecutan las instrucciones contenidas en ese blo/ue del i1& La comparacin del ejemplo anterior suele ser el origen de muc)os errores de programacin0 al con1undir los operadores RR , R& Las comparaciones siempre se realizan con el operador RR0 ,a /ue el operador Rsolamente asigna valores*
var mostrar>ensaje R trueS // Se comparan los dos valores i1(mostrar>ensaje RR 1alse- a &&& b // Error 7 Se asigna el valor "false" a la varia#le i1(mostrar>ensaje R 1alse- a &&& b
La condicin /ue controla el i1(- puede combinar los di1erentes operadores lgicos , relacionales mostrados anteriormente*
var mostrado R 1alseS i1(Nmostrado- a alert(PEs la primera vez /ue se muestra el mensajeP-S b
var mostrado R 1alseS var usuarioPermite>ensajes R trueS i1(Nmostrado ]] usuarioPermite>ensajes- a alert(PEs la primera vez /ue se muestra el mensajeP-S b
La condicin anterior est 1ormada por una operacin J!$ sobre dos variables& J su vez0 a la primera variable se le aplica el operador de negacin antes de realizar la operacin J!$& $e esta 1orma0 como el valor de mostrado es 1alse0 el valor Nmostrado sera true& Como la variable usuarioPermite>ensajes vale true0 el resultado de Nmostrado ]] usuarioPermite>ensajes sera igual a true ]] true0 por lo /ue el resultado 1inal de la condicin del i1(- sera true , por tanto0 se ejecutan las instrucciones /ue se encuentran dentro del blo/ue del i1(-&
Completar las condiciones de los i1 del siguiente script para /ue los mensajes de los alert(- se muestren siempre de 1orma correcta*
var numero2 R 6S var numero7 R ?S i1(&&&- a alert(Pnumero2 no es ma,or /ue numero7P-S b i1(&&&- a alert(Pnumero7 es positivoP-S b i1(&&&- a alert(Pnumero2 es negativo o distinto de ceroP-S b i1(&&&- a alert(PIncrementar en 2 unidad el valor de numero2 no lo )ace ma,or o igual /ue numero7P-S b
Si la condicin se cumple (es decir0 si su valor es true- se ejecutan todas las instrucciones /ue se encuentran dentro del i1(-& Si la condicin no se cumple (es decir0 si su valor es 1alsese ejecutan todas las instrucciones contenidas en else a b& Ejemplo*
var edad R 2?S i1(edad MR 2?- a alert(PEres ma,or de edadP-S b else a alert(P=odava eres menor de edadP-S b
Si el valor de la variable edad es ma,or o igual /ue el valor numrico 2?0 la condicin del i1(se cumple , por tanto0 se ejecutan sus instrucciones , se muestra el mensaje PEres ma,or de edadP& Sin embargo0 cuando el valor de la variable edad no es igual o ma,or /ue 2?0 la condicin del i1(- no se cumple0 por lo /ue automticamente se ejecutan todas las instrucciones del blo/ue else a b& En este caso0 se mostrara el mensaje P=odava eres menor de edadP&
La condicin del i1(- anterior se constru,e mediante el operador RR0 /ue es el /ue se emplea para comparar dos valores (no con1undir con el operador R /ue se utiliza para asignar valores-& En el ejemplo anterior0 si la cadena de teCto almacenada en la variable nombre es vaca (es decir0 es igual a PP- se muestra el mensaje de1inido en el i1(-& En otro caso0 se muestra el mensaje de1inido en el blo/ue else a b& La estructura i1&&&else se puede encadenar para realizar varias comprobaciones seguidas*
i1(edad L 27- a alert(P=odava eres mu, pe/ueKoP-S b else i1(edad L 2A- a alert(PEres un adolescenteP-S b else i1(edad L %6- a alert(PJun sigues siendo jovenP-S b else a alert(PPiensa en cuidarte un poco msP-S b
!o es obligatorio /ue la combinacin de estructuras i1&&&else acabe con la instruccin else0 ,a /ue puede terminar con una instruccin de tipo else i1(-&
El clculo de la letra del $ocumento !acional de Identidad ($!I- es un proceso matemtico sencillo /ue se basa en obtener el resto de la divisin entera del nImero de $!I , el nImero 7%& J partir del resto de la divisin0 se obtiene la letra seleccionndola dentro de un arra, de letras& El arra, de letras es*
var letras R [T=T0 T T0 TQT0 TJT0 T@T0 T>T0 TOT0 TET0 TPT0 T$T0 T;T0 T8T0 T!T0 TJT0 TcT0 TST0 T4T0 TDT0 T<T0 TLT0 TCT0 TVT0 TET0 T=T\S
Por tanto si el resto de la divisin es '0 la letra del $!I es la = , si el resto es % la letra es la J& Con estos datos0 elaborar un pe/ueKo script /ue*
Jlmacene en una variable el nImero de $!I indicado por el usuario , en otra variable la letra del $!I /ue se )a indicado& (Pista* si se /uiere pedir directamente al usuario /ue indi/ue su nImero , su letra0 se puede utilizar la 1uncin prompt(-7 En primer lugar (, en una sola instruccin- se debe comprobar si el nImero es menor /ue ' o ma,or /ue AAAAAAAA& Si ese es el caso0 se muestra un mensaje al usuario indicando /ue el nImero proporcionado no es vlido , el programa no muestra ms mensajes& 2 Si el nImero es vlido0 se calcula la letra /ue le corresponde segIn el mtodo eCplicado anteriormente& 7 Hna vez calculada la letra0 se debe comparar con la letra indicada por el usuario& Si no coinciden0 se muestra un mensaje al usuario dicindole /ue la letra /ue )a indicado no es correcta& En otro caso0 se muestra un mensaje indicando /ue el nImero , la letra de $!I son correctos&
Se comprueba si la variable veces es menor /ue :& Si se cumple0 se entra dentro del i1(-0 se muestra el mensaje , se incrementa el valor de la variable veces& Js se debera seguir ejecutando )asta mostrar el mensaje las cinco veces deseadas& Sin embargo0 el 1uncionamiento real del script anterior es mu, di1erente al deseado0 ,a /ue solamente se muestra una vez el mensaje por pantalla& La razn es /ue la ejecucin de la estructura i1(- no se repite , la comprobacin de la condicin slo se realiza una vez0 independientemente de /ue dentro del i1(- se modi1i/ue el valor de la variable utilizada en la condicin& La estructura 1or permite realizar este tipo de repeticiones (tambin llamadas bucles- de una 1orma mu, sencilla& !o obstante0 su de1inicin 1ormal no es tan sencilla como la de i1(-*
1or(inicializacionS condicionS actualizacion- a &&& b
La idea del 1uncionamiento de un bucle 1or es la siguiente* "mientras la condicin indicada se siga cumpliendo) repite la ejecucin de las instrucciones definidas dentro del for9 Adem%s) despu$s de cada repeticin) actualiza el valor de las varia#les que se utilizan en la condicin"& La PinicializacinP es la zona en la /ue se establece los valores iniciales de las variables /ue controlan la repeticin&
La PcondicinP es el Inico elemento /ue decide si continua o se detiene la repeticin& La PactualizacinP es el nuevo valor /ue se asigna despus de cada repeticin a las variables /ue controlan la repeticin&
var mensaje R P<ola0 esto, dentro de un buclePS 1or(var i R 'S i L 6S iWW- a alert(mensaje-S b
Por tanto0 en primer lugar se crea la variable i , se le asigna el valor de '& Esta zona de inicializacin solamente se tiene en consideracin justo antes de comenzar a ejecutar el bucle& Las siguientes repeticiones no tienen en cuenta esta parte de inicializacin& La zona de condicin del bucle es*
i L6
Los bucles se siguen ejecutando mientras se cumplan las condiciones , se dejan de ejecutar justo despus de comprobar /ue la condicin no se cumple& En este caso0 mientras la variable i valga menos de 6 el bucle se ejecuta inde1inidamente& Como la variable i se )a inicializado a un valor de ' , la condicin para salir del bucle es /ue i sea menor /ue 60 si no se modi1ica el valor de i de alguna 1orma0 el bucle se repetira inde1inidamente& Por ese motivo0 es imprescindible indicar la zona de actualizacin0 en la /ue se modi1ica el valor de las variables /ue controlan el bucle*
iWW
En este caso0 el valor de la variable ise incrementa en una unidad despus de cada repeticin& La zona de actualizacin se ejecuta despus de la ejecucin de las instrucciones /ue inclu,e el 1or& Js0 durante la ejecucin de la /uinta repeticin el valor de i ser :& $espus de la /uinta ejecucin0 se actualiza el valor de i0 /ue a)ora valdr 6& Como la condicin es /ue i sea menor /ue 60 la condicin ,a no se cumple , las instrucciones del 1orno se ejecutan una seCta vez& !ormalmente0 la variable /ue controla los bucles 1or se llama i0 ,a /ue recuerda a la palabra ndice , su nombre tan corto a)orra muc)o tiempo , espacio& El ejemplo anterior /ue mostraba los das de la semana contenidos en un arra, se puede re)acer de 1orma ms sencilla utilizando la estructura 1or*
var dias R [PLunesP0 P>artesP0 P>ircolesP0 PJuevesP0 PDiernesP0 PSbadoP0 P$omingoP\S 1or(var iR'S iLBS iWW- a alert(dias[i\-S b
El 1actorial de un nImero entero n es una operacin matemtica /ue consiste en multiplicar todos los 1actores n C (n"2- C (n"7- C &&& C 2 & Js0 el 1actorial de 6 (escrito como 6N- es igual a* 6N
R 6 C : C % C 7 C 2 R 27'
Htilizando la estructura 1or0 crear un script /ue calcule el 1actorial de un nImero entero&
Si se /uieren recorrer todos los elementos /ue 1orman un arra,0 la estructura 1or&&&in es la 1orma ms e1iciente de )acerlo0 como se muestra en el siguiente ejemplo*
var dias R [PLunesP0 P>artesP0 P>ircolesP0 PJuevesP0 PDiernesP0 PSbadoP0 P$omingoP\S 1or(i in dias- a alert(dias[i\-S b
La variable /ue se indica como indice es la /ue se puede utilizar dentro del bucle 1or&&&in para acceder a los elementos del arra,& $e esta 1orma0 en la primera repeticin del bucle la variable i vale ', en la Iltima vale 9& Esta estructura de control es la ms adecuada para recorrer arra,s (, objetos-0 ,a /ue evita tener /ue indicar la inicializacin , las condiciones del bucle 1or simple , 1unciona correctamente cual/uiera /ue sea la longitud del arra,& $e )ec)o0 sigue 1uncionando igual aun/ue vare el nImero de elementos del arra,&
Jdems del operador W0 tambin se puede utilizar la 1uncin concat(var mensaje2 R P<olaPS var mensaje7 R mensaje2&concat(P >undoP-S // mensaje* + ":ola Mundo"
Cuando se unen varias cadenas de teCto es )abitual olvidar aKadir un espacio de separacin entre las palabras*
var mensaje2 R P<olaPS var mensaje7 R P>undoPS var mensaje R mensaje2 W mensaje7S // mensaje + ":olaMundo"
Los espacios en blanco se pueden aKadir al 1inal o al principio de las cadenas , tambin se pueden indicar 1orma eCplcita*
var mensaje2 R P<olaPS var mensaje7 R P>undoPS var mensaje R mensaje2 W P P W mensaje7S // mensaje + ":ola Mundo"
caracteres en ma,Isculas*
var mensaje2 R P<olaPS var mensaje7 R mensaje2&toHpperCase(-S // mensaje* + ":;LA"
caracteres en minIsculas*
var mensaje2 R P<olJPS var mensaje7 R mensaje2&toLo.erCase(-S // mensaje* + "-ola"
cadena de teCto& Si el carcter se inclu,e varias veces dentro de la cadena de teCto0 se devuelve su primera posicin empezando a buscar desde la iz/uierda& Si la cadena no contiene el carcter0 la 1uncin devuelve el valor "2*
var mensaje R P<olaPS var posicion R mensaje&indeC#1(TaT-S // posicion + 1 posicion R mensaje&indeC#1(TbT-S // posicion + 7(
dentro de la cadena de teCto& Si la cadena no contiene el carcter0 la 1uncin devuelve el valor "2*
var mensaje R P<olaPS var posicion R mensaje&lastIndeC#1(TaT-S // posicion + 1 posicion R mensaje&lastIndeC#1(TbT-S // posicion + 7(
La 1uncin lastIndeC#1(- comienza su bIs/ueda desde el 1inal de la cadena )acia el principio0 aun/ue la posicin devuelta es la correcta empezando a contar desde el principio de la palabra&
substring(inicio0 1inal-0 eCtrae una porcin de una cadena de teCto& El segundo parmetro es
opcional& Si slo se indica el parmetro inicio0 la 1uncin devuelve la parte de la cadena original correspondiente desde esa posicin )asta el 1inal*
var mensaje R P<ola >undoPS var porcion R mensaje&substring(7-S // porcion + "la Mundo" porcion R mensaje&substring(6-S // porcion + "Mundo" porcion R mensaje&substring(B-S // porcion + "ndo"
Cuando se indica el inicio , el 1inal0 se devuelve la parte de la cadena original comprendida entre la posicin inicial , la inmediatamente anterior a la posicin 1inal (es decir0 la posicin inicio est incluida , la posicin 1inalno-*
var mensaje R P<ola >undoPS var porcion R mensaje&substring(20 ?-S // porcion + "ola Mun" porcion R mensaje&substring(%0 :-S // porcion + "a"
Si se indica un 1inal ms pe/ueKo /ue el inicio0 JavaScript los considera de 1orma inversa0 ,a /ue automticamente asigna el valor ms pe/ueKo al inicio, el ms grande al 1inal*
var mensaje R P<ola >undoPS var porcion R mensaje&substring(60 '-S // porcion + ":ola " porcion R mensaje&substring('0 6-S // porcion + ":ola "
parte la cadena de teCto determinando sus trozos a partir del carcter separador indicado*
var mensaje R P<ola >undo0 so, una cadena de teCtoNPS var palabras R mensaje&split(P P-S // pala#ras + <":ola") "Mundo)") "so!") "una") "cadena") "de") "te'to=">&
Con esta 1uncin se pueden eCtraer 1cilmente las letras /ue 1orman una palabra*
var palabra R P<olaPS var letras R palabra&split(PP-S // letras + <":") "o") "l") "a">
join(separador-0 es la 1uncin contraria a split(-& Hne todos los elementos de un arra, para
1ormar una cadena de teCto& Para unir los elementos se utiliza el carcter separador indicado
var arra, R [P)olaP0 PmundoP\S var mensaje R arra,&join(PP-S // mensaje + "-olamundo" mensaje R arra,&join(P P-S // mensaje + "-ola mundo"
pop(-0 elimina el Iltimo elemento del arra, , lo devuelve& El arra, original se modi1ica , su
pus)(-0 aKade un elemento al 1inal del arra,& El arra, original se modi1ica , aumenta su
longitud en 2 elemento& (=ambin es posible aKadir ms de un elemento a la vezvar arra, R [20 70 %\S arra,&pus)(:-S // a-ora arra! + <() *) 1) />
s)i1t(-0 elimina el primer elemento del arra, , lo devuelve& El arra, original se ve modi1icado ,
uns)i1t(-0 aKade un elemento al principio del arra,& El arra, original se modi1ica , aumenta su
longitud en 2 elemento& (=ambin es posible aKadir ms de un elemento a la vezvar arra, R [20 70 %\S arra,&uns)i1t('-S // a-ora arra! + <5) () *) 1>
original*
var arra, R [20 70 %\S arra,&reverse(-S // a-ora arra! + <1) *) (>
In1init,0 )ace re1erencia a un valor numrico in1inito , positivo (tambin eCiste el valor _In1init,
para los in1initos negativosvar numero2 R 2'S var numero7 R 'S alert(numero2+numero7-S // se muestra el valor @nfinit!
toEiCed(digitos-0 devuelve el nImero original con tantos decimales como los indicados por el
parmetro digitos , realiza los redondeos necesarios& Se trata de una 1uncin mu, Itil por ejemplo para mostrar precios&
var numero2 R :69:&%:69BS numero2&toEiCed(7-S // /.0/91. numero2&toEiCed(9-S // /.0/91/.025 numero2&toEiCed(-S // /.0/
'.!. - nciones
Cuando se desarrolla una aplicacin compleja0 es mu, )abitual utilizar una , otra vez las mismas instrucciones& Hn script para una tienda de comercio electrnico por ejemplo0 tiene /ue calcular el precio total de los productos varias veces0 para aKadir los impuestos , los gastos de envo& Cuando una serie de instrucciones se repiten una , otra vez0 se complica demasiado el cdigo 1uente de la aplicacin0 ,a /ue* El cdigo de la aplicacin es muc)o ms largo por/ue muc)as instrucciones estn repetidas& Si se /uiere modi1icar alguna de las instrucciones repetidas0 se deben )acer tantas modi1icaciones como veces se )a,a escrito esa instruccin0 lo /ue se convierte en un trabajo mu, pesado , mu, propenso a cometer errores& Las 1unciones son la solucin a todos estos problemas0 tanto en JavaScript como en el resto de lenguajes de programacin& Hna 1uncin es un conjunto de instrucciones /ue se agrupan para realizar una tarea concreta , /ue se pueden reutilizar 1cilmente& En el siguiente ejemplo0 las instrucciones /ue suman los dos nImeros , muestran un mensaje con el resultado se repiten una , otra vez*
var resultadoS var numero2 R %S var numero7 R 6S // Se suman los n"meros ! se muestra el resultado resultado R numero2 W numero7S alert(PEl resultado es P W resultado-S numero2 R 2'S numero7 R BS // Se suman los n"meros ! se muestra el resultado resultado R numero2 W numero7S alert(PEl resultado es P W resultado-S numero2 R 6S numero7 R ?S // Se suman los n"meros ! se muestra el resultado
Jun/ue es un ejemplo mu, sencillo0 parece evidente /ue repetir las mismas instrucciones a lo largo de todo el cdigo no es algo recomendable& La solucin /ue proponen las 1unciones consiste en eCtraer las instrucciones /ue se repiten , sustituirlas por una instruccin del tipo "en este punto) se ejecutan las instrucciones que se -an e'tra do" *
var resultadoS var numero2 R %S var numero7 R 6S /* En este punto) se llama a la funcin que suma * n"meros ! muestra el resultado */ numero2 R 2'S numero7 R BS /* En este punto) se llama a la funcin que suma * n"meros ! muestra el resultado */ numero2 R 6S numero7 R ?S /* En este punto) se llama a la funcin que suma * n"meros ! muestra el resultado */ &&&
Para /ue la solucin del ejemplo anterior sea vlida0 las instrucciones comunes se tienen /ue agrupar en una 1uncin a la /ue se le puedan indicar los nImeros /ue debe sumar antes de mostrar el mensaje& Por lo tanto0 en primer lugar se debe crear la 1uncin bsica con las instrucciones comunes& Las 1unciones en JavaScript se de1inen mediante la palabra reservada 1unction0 seguida del nombre de la 1uncin& Su de1inicin 1ormal es la siguiente*
1unction nombreX1uncion(- a &&& b
El nombre de la 1uncin se utiliza para llamar a esa 1uncin cuando sea necesario& El concepto es el mismo /ue con las variables0 a las /ue se les asigna un nombre Inico para poder utilizarlas dentro del cdigo& $espus del nombre de la 1uncin0 se inclu,en dos parntesis cu,o signi1icado se detalla ms adelante& Por Iltimo0 los smbolos a , b se utilizan para encerrar todas las instrucciones /ue pertenecen a la 1uncin (de 1orma similar a como se encierran las instrucciones en las estructuras i1 o 1or-& Dolviendo al ejemplo anterior0 se crea una 1uncin llamada sumaX,Xmuestra de la siguiente 1orma*
1unction sumaX,Xmuestra(- a resultado R numero2 W numero7S
Jun/ue la 1uncin anterior est correctamente creada0 no 1unciona como debera ,a /ue le 1altan los "argumentos"0 /ue se eCplican en la siguiente seccin& Hna vez creada la 1uncin0 desde cual/uier punto del cdigo se puede llamar a la 1uncin para /ue se ejecuten sus instrucciones (adems de "llamar a la funcin"0 tambin se suele utilizar la eCpresin "invocar a la funcin"-& La llamada a la 1uncin se realiza simplemente indicando su nombre0 inclu,endo los parntesis del 1inal , el carcter S para terminar la instruccin*
1unction sumaX,Xmuestra(- a resultado R numero2 W numero7S alert(PEl resultado es P W resultado-S b var resultadoS var numero2 R %S var numero7 R 6S sumaX,Xmuestra(-S numero2 R 2'S numero7 R BS sumaX,Xmuestra(-S numero2 R 6S numero7 R ?S sumaX,Xmuestra(-S &&&
El cdigo del ejemplo anterior es muc)o ms e1iciente /ue el primer cdigo /ue se mostr0 ,a /ue no eCisten instrucciones repetidas& Las instrucciones /ue suman , muestran mensajes se )an agrupado bajo una 1uncin0 lo /ue permite ejecutarlas en cual/uier punto del programa simplemente indicando el nombre de la 1uncin& Lo Inico /ue le 1alta al ejemplo anterior para 1uncionar correctamente es poder indicar a la 1uncin los nImeros /ue debe sumar& Cuando se necesitan pasar datos a una 1uncin0 se utilizan los "argumentos"0 como se eCplica en la siguiente seccin&
Siguiendo el ejemplo anterior0 la 1uncin debe indicar /ue necesita dos argumentos0 correspondientes a los dos nImeros /ue tiene /ue sumar*
1unction sumaX,Xmuestra(primer!umero0 segundo!umero- a &&& b
J continuacin0 para utilizar el valor de los argumentos dentro de la 1uncin0 se debe emplear el mismo nombre con el /ue se de1inieron los argumentos*
1unction sumaX,Xmuestra(primer!umero0 segundo!umero- a &&& b var resultado R primer!umero W segundo!umeroS alert(PEl resultado es P W resultado-S b
$entro de la 1uncin0 el valor de la variable primer!umero ser igual al primer valor /ue se le pase a la 1uncin , el valor de la variable segundo!umero ser igual al segundo valor /ue se le pasa& Para pasar valores a la 1uncin0 se inclu,en dentro de los parntesis utilizados al llamar a la 1uncin*
// ,efinicin de la funcin 1unction sumaX,Xmuestra(primer!umero0 segundo!umero- a &&& b var resultado R primer!umero W segundo!umeroS alert(PEl resultado es P W resultado-S b // ,eclaracin de las varia#les var numero2 R %S var numero7 R 6S // Llamada a la funcin sumaX,Xmuestra(numero20 numero7-S
En el cdigo anterior0 se debe tener en cuenta /ue* Jun/ue casi siempre se utilizan variables para pasar los datos a la 1uncin0 se podra )aber utilizado directamente el valor de esas variables* sumaX,Xmuestra(%0 6-S El nImero de argumentos /ue se pasa a una 1uncin debera ser el mismo /ue el nImero de argumentos /ue )a indicado la 1uncin& !o obstante0 JavaScript no muestra ningIn error si se pasan ms o menos argumentos de los necesarios& El orden de los argumentos es 1undamental0 ,a /ue el primer dato /ue se indica en la llamada0 ser el primer valor /ue espera la 1uncinS el segundo valor indicado en la llamada0 es el segundo valor /ue espera la 1uncin , as sucesivamente& Se puede utilizar un nImero ilimitado de argumentos0 aun/ue si su nImero es mu, grande0 se complica en eCceso la llamada a la 1uncin& !o es obligatorio /ue coincida el nombre de los argumentos /ue utiliza la 1uncin , el nombre de los argumentos /ue se le pasan& En el ejemplo anterior0 los argumentos /ue se pasan son numero2, numero7 , los argumentos /ue utiliza la 1uncin son primer!umero , segundo!umero&
J continuacin se muestra otro ejemplo de una 1uncin /ue calcula el precio total de un producto a partir de su precio bsico*
// ,efinicin de la funcin 1unction calculaPrecio=otal(precio- a var impuestos R 2&29S var gastosEnvio R 2'S var precio=otal R ( precio U impuestos - W gastosEnvioS b // Llamada a la funcin calculaPrecio=otal(7%&%:-S
La 1uncin anterior toma como argumento una variable llamada precio , le suma los impuestos , los gastos de envo para obtener el precio total& Jl llamar a la 1uncin0 se pasa directamente el valor del precio bsico mediante el nImero 7%&%:& !o obstante0 el cdigo anterior no es demasiado Itil0 ,a /ue lo ideal sera /ue la 1uncin pudiera devolver el resultado obtenido para guardarlo en otra variable , poder seguir trabajando con este precio total*
1unction calculaPrecio=otal(precio- a var impuestos R 2&29S var gastosEnvio R 2'S var precio=otal R ( precio U impuestos - W gastosEnvioS b // El valor devuelto por la funcin) se guarda en una varia#le var precio=otal R calculaPrecio=otal(7%&%:-S // Seguir tra#ajando con la varia#le "precioAotal"
J1ortunadamente0 las 1unciones no solamente puede recibir variables , datos0 sino /ue tambin pueden devolver los valores /ue )an calculado& Para devolver valores dentro de una 1uncin0 se utiliza la palabra reservada return& Jun/ue las 1unciones pueden devolver valores de cual/uier tipo0 solamente pueden devolver un valor cada vez /ue se ejecutan&
1unction calculaPrecio=otal(precio- a var impuestos R 2&29S var gastosEnvio R 2'S var precio=otal R ( precio U impuestos - W gastosEnvioS return precio=otalS b var precio=otal R calculaPrecio=otal(7%&%:-S // Seguir tra#ajando con la varia#le "precioAotal"
Para /ue la 1uncin devuelva un valor0 solamente es necesario escribir la palabra reservada return junto con el nombre de la variable /ue se /uiere devolver& En el ejemplo anterior0 la ejecucin de la 1uncin llega a la instruccin return precio=otalS , en ese momento0 devuelve el valor /ue contenga la variable precio=otal&
Como la 1uncin devuelve un valor0 en el punto en el /ue se realiza la llamada0 debe indicarse el nombre de una variable en el /ue se guarda el valor devuelto*
var precio=otal R calculaPrecio=otal(7%&%:-S
Si no se indica el nombre de ninguna variable0 JavaScript no muestra ningIn error , el valor devuelto por la 1uncin simplemente se pierde , por tanto0 no se utilizar en el resto del programa& En este caso0 tampoco es obligatorio /ue el nombre de la variable devuelta por la 1uncin coincida con el nombre de la variable en la /ue se va a almacenar ese valor& Si la 1uncin llega a una instruccin de tipo return0 se devuelve el valor indicado , 1inaliza la ejecucin de la 1uncin& Por tanto0 todas las instrucciones /ue se inclu,en despus de un return se ignoran , por ese motivo la instruccin return suele ser la Iltima de la ma,ora de 1unciones& Para /ue el ejemplo anterior sea ms completo0 se puede aKadir otro argumento a la 1uncin /ue indi/ue el porcentaje de impuestos /ue se debe aKadir al precio del producto& Evidentemente0 el nuevo argumento se debe aKadir tanto a la de1inicin de la 1uncin como a su llamada*
1unction calculaPrecio=otal(precio0 porcentajeImpuestos- a var gastosEnvio R 2'S var precioConImpuestos R (2 W porcentajeImpuestos+2''- U precioS var precio=otal R precioConImpuestos W gastosEnvioS return precio=otalS b var precio=otal R calculaPrecio=otal(7%&%:0 29-S var otroPrecio=otal R calculaPrecio=otal(26&7'0 :-S
Para terminar de completar el ejercicio anterior0 se puede rendondear a dos decimales el precio total devuelto por la 1uncin*
1unction calculaPrecio=otal(precio0 porcentajeImpuestos- a var gastosEnvio R 2'S var precioConImpuestos R (2 W porcentajeImpuestos+2''- U precioS var precio=otal R precioConImpuestos W gastosEnvioS return precio=otal&toEiCed(7-S b var precio=otal R calculaPrecio=otal(7%&%:0 29-S
Escribir el cdigo de una 1uncin a la /ue se pasa como parmetro un nImero entero , devuelve como resultado una cadena de teCto /ue indica si el nImero es par o impar& >ostrar por pantalla el resultado devuelto por la 1uncin&
$e1inir una 1uncin /ue muestre in1ormacin sobre una cadena de teCto /ue se le pasa como argumento& J partir de la cadena /ue se le pasa0 la 1uncin determina si esa cadena est 1ormada slo por ma,Isculas0 slo por minIsculas o por una mezcla de ambas&
$e1inir una 1uncin /ue determine si la cadena de teCto /ue se le pasa como parmetro es un palndromo0 es decir0 si se lee de la misma 1orma desde la iz/uierda , desde la derec)a& Ejemplo de palndromo complejo* PLa ruta nos aporto otro paso naturalP&
El ejemplo anterior de1ine en primer lugar una 1uncin llamada crea>ensaje /ue crea una variable llamada mensaje& J continuacin0 se ejecuta la 1uncin mediante la llamada crea>ensaje(-S , seguidamente0 se muestra mediante la 1uncin alert(- el valor de una variable llamada mensaje& Sin embargo0 al ejecutar el cdigo anterior no se muestra ningIn mensaje por pantalla& La razn es /ue la variable mensaje se )a de1inido dentro de la 1uncin crea>ensaje(- , por tanto0 es una variable local /ue solamente est de1inida dentro de la 1uncin& Cual/uier instruccin /ue se encuentre dentro de la 1uncin puede )acer uso de esa variable0 pero todas las instrucciones /ue se encuentren en otras 1unciones o 1uera de cual/uier 1uncin no tendrn de1inida la variable mensaje& $e esta 1orma0 para mostrar el mensaje en el cdigo anterior0 la 1uncin alert(-debe llamarse desde dentro de la 1uncin crea>ensaje(-*
1unction crea>ensaje(- a var mensaje R d>ensaje de pruebaeS alert(mensaje-S b crea>ensaje(-S
Jdems de variables locales0 tambin eCiste el concepto de variable %lobal0 /ue est de1inida en cual/uier punto del programa (incluso dentro de cual/uier 1uncin-&
var mensaje R d>ensaje de pruebaeS 1unction muestra>ensaje(- a alert(mensaje-S b
El cdigo anterior es el ejemplo inverso al mostrado anteriormente& $entro de la 1uncin muestra>ensaje(- se /uiere )acer uso de una variable llamada mensaje , /ue no )a sido de1inida dentro de la propia 1uncin& Sin embargo0 si se ejecuta el cdigo anterior0 s /ue se muestra el mensaje de1inido por la variable mensaje&
El motivo es /ue en el cdigo JavaScript anterior0 la variable mensaje se )a de1inido 1uera de cual/uier 1uncin& Este tipo de variables automticamente se trans1orman en variables globales , estn disponibles en cual/uier punto del programa (incluso dentro de cual/uier 1uncin-& $e esta 1orma0 aun/ue en el interior de la 1uncin no se )a de1inido ninguna variable llamada mensaje0 la variable global creada anteriormente permite /ue la instruccin alert(- dentro de la 1uncin muestre el mensaje correctamente& Si una variable se declara 1uera de cual/uier 1uncin0 automticamente se trans1orma en variable global independientemente de si se de1ine utilizando la palabra reservada var o no& Sin embargo0 las variables de1inidas dentro de una 1uncin pueden ser globales o locales& Si en el interior de una 1uncin0 las variables se declaran mediante varse consideran locales , las variables /ue no se )an declarado mediante var0 se trans1orman automticamente en variables globales& Por lo tanto0 se puede re)acer el cdigo del primer ejemplo para /ue muestre el mensaje correctamente& Para ello0 simplemente se debe de1inir la variable dentro de la 1uncin sin la palabra reservada var0 para /ue se trans1orme en una variable global*
1unction crea>ensaje(- a mensaje R P>ensaje de pruebaPS b crea>ensaje(-S alert(mensaje-S
34u sucede si una 1uncin de1ine una variable local con el mismo nombre /ue una variable global /ue ,a eCiste5 En este caso0 las variables locales prevalecen sobre las globales0 pero slo dentro de la 1uncin*
var mensaje R Pgana la de 1ueraPS 1unction muestra>ensaje(- a var mensaje R Pgana la de dentroPS alert(mensaje-S b alert(mensaje-S muestra>ensaje(-S alert(mensaje-S
$entro de la 1uncin0 la variable local llamada mensaje tiene ms prioridad /ue la variable global del mismo nombre0 pero solamente dentro de la 1uncin&
34u sucede si dentro de una 1uncin se de1ine una variable global con el mismo nombre /ue otra variable global /ue ,a eCiste5 En este otro caso0 la variable global de1inida dentro de la 1uncin simplemente modi1ica el valor de la variable global de1inida anteriormente*
var mensaje R Pgana la de 1ueraPS 1unction muestra>ensaje(- a mensaje R Pgana la de dentroPS alert(mensaje-S b alert(mensaje-S muestra>ensaje(-S alert(mensaje-S
La recomendacin general es de1inir como variables locales todas las variables /ue sean de uso eCclusivo para realizar las tareas encargadas a cada 1uncin& Las variables globales se utilizan para compartir variables entre 1unciones de 1orma sencilla&
Si el programa llega a una instruccin de tipo breaGS0 sale inmediatamente del bucle , continIa ejecutando el resto de instrucciones /ue se encuentran 1uera del bucle 1or& En el ejemplo anterior0 se recorren todas las letras de una cadena de teCto , cuando se encuentra con la primera letra PaP0 se detiene la ejecucin del bucle 1or& La utilidad de breaG es terminar la ejecucin del bucle cuando una variable toma un determinado valor o cuando se cumple alguna condicin& En ocasiones0 lo /ue se desea es saltarse alguna repeticin del bucle cuando se dan algunas condiciones& Siguiendo con el ejemplo anterior0 a)ora se desea /ue el teCto de salida elimine todas las letras PaPde la cadena de teCto original*
var cadena R PEn un lugar de la >anc)a de cu,o nombre no /uiero acordarme&&&PS var letras R cadena&split(PP-S var resultado R PPS 1or(i in letras- a i1(letras[i\ RR TaT- a continueS b else a resultado WR letras[i\S b b alert(resultado-S // muestra "En un lugr de l Mnc- de cu!o nom#re no quiero cordrme999"
En este caso0 cuando se encuentra una letra PaP no se termina el bucle0 sino /ue no se ejecutan las instrucciones de esa repeticin , se pasa directamente a la siguiente repeticin del bucle 1or& La utilidad de continue es /ue permite utilizar el bucle 1or para 1iltrar los resultados en 1uncin de algunas condiciones o cuando el valor de alguna variable coincide con un valor determinado&
El 1uncionamiento del bucle .)ile se resume en* "mientras se cumpla la condicin indicada) repite indefinidamente las instrucciones incluidas dentro del #ucle" &
Si la condicin no se cumple ni si/uiera la primera vez0 el bucle no se ejecuta& Si la condicin se cumple0 se ejecutan las instrucciones una vez , se vuelve a comprobar la condicin& Si se sigue cumpliendo la condicin0 se vuelve a ejecutar el bucle , as se continIa )asta /ue la condicin no se cumpla& Evidentemente0 las variables /ue controlan la condicin deben modi1icarse dentro del propio bucle0 ,a /ue de otra 1orma0 la condicin se cumplira siempre , el bucle .)ile se repetira inde1inidamente& El siguiente ejemplo utiliza el bucle .)ile para sumar todos los nImeros menores o iguales /ue otro nImero*
var resultado R 'S var numero R 2''S var i R 'S .)ile(i LR numero- a resultado WR iS iWWS b alert(resultado-S
El programa debe sumar todos los nImeros menores o igual /ue otro dado& Por ejemplo si el nImero es 60 se debe calcular* 2 W 7 W % W : W 6 R 26 Este tipo de condiciones ("suma n"meros mientras sean menores o iguales que otro n"mero dado"- se resuelven mu, 1cilmente con los bucles tipo .)ile0 aun/ue tambin se podan resolver con bucles de tipo 1or& En el ejemplo anterior0 mientras se cumpla la condicin0 es decir0 mientras /ue la variable i sea menor o igual /ue la variable numero0 se ejecutan las instrucciones del bucle& $entro del bucle se suma el valor de la variable i al resultado total (variable resultado- , se actualiza el valor de la variable i0 /ue es la /ue controla la condicin del bucle& Si no se actualiza el valor de la variable i0 la ejecucin del bucle continua in1initamente o )asta /ue el navegador permita al usuario detener el script&
$e esta 1orma0 como la condicin se comprueba despus de cada repeticin0 la primera vez siempre se ejecutan las instrucciones del bucle& Es importante no olvidar /ue despus del .)ile(-se debe aKadir el carcter S(al contrario de lo /ue sucede con el bucle .)ile simple-& Htilizando este bucle se puede calcular 1cilmente el 1actorial de un nImero*
var resultado R 2S var numero R 6S do a resultado UR numeroS // resultado + resultado * numero numero""S b .)ile(numero M '-S alert(resultado-S
En el cdigo anterior0 el resultado se multiplica en cada repeticin por el valor de la variable numero& Jdems0 en cada repeticin se decrementa el valor de esta variable numero& La condicin del bucle do&&&.)ile es /ue el valor de numerosea ma,or /ue '0 ,a /ue el 1actorial de un nImero multiplica todos los nImeros menores o iguales /ue l mismo0 pero )asta el nImero 2 (el 1actorial de 6 por ejemplo es 6 C : C % C 7 C 2 R 27'-& Como en cada repeticin se decrementa el valor de la variable numero , la condicin es /ue numero sea ma,or /ue cero0 en la repeticin en la /ue numero valga '0 la condicin ,a no se cumple , el programa se sale del bucle do&&&.)ile&
En estos casos0 la estructura s.itc) es la ms e1iciente0 ,a /ue est especialmente diseKada para manejar de 1orma sencilla mIltiples condiciones sobre la misma variable& Su de1inicin 1ormal puede parecer compleja0 aun/ue su uso es mu, sencillo*
s.itc)(variable- a case valorX2* &&& breaGS case valorX7* &&& breaGS &&& case valorXn* &&&
La estructura s.itc) se de1ine mediante la palabra reservada s.itc) seguida0 entre parntesis0 del nombre de la variable /ue se va a utilizar en las comparaciones& Como es )abitual0 las instrucciones /ue 1orman parte del s.itc) se encierran entre las llaves a , b& $entro del s.itc) se de1inen todas las comparaciones /ue se /uieren realizar sobre el valor de la variable& Cada comparacin se indica mediante la palabra reservada case seguida del valor con el /ue se realiza la comparacin& Si el valor de la variable utilizada por s.itc) coincide con el valor indicado por case0 se ejecutan las instrucciones de1inidas dentro de ese case& !ormalmente0 despus de las instrucciones de cada case se inclu,e la sentencia breaG para terminar la ejecucin del s.itc)0 aun/ue no es obligatorio& Las comparaciones se realizan por orden0 desde el primer case )asta el Iltimo0 por lo /ue es mu, importante el orden en el /ue se de1inen los case& 34u sucede si ningIn valor de la variable del s.itc) coincide con los valores de1inidos en los case5 En este caso0 se utiliza el valor de1ault para indicar las instrucciones /ue se ejecutan en el caso en el /ue ningIn case se cumpla para la variable indicada& Jun/ue de1ault es opcional0 las estructuras s.itc) suelen incluirlo para de1inir al menos un valor por de1ecto para alguna variable o para mostrar algIn mensaje por pantalla&
Capt lo 5. )*+
La creacin del ,ocument ;#ject Model o )*+ es una de las innovaciones /ue ms )a in1luido en el desarrollo de las pginas .eb dinmicas , de las aplicaciones .eb ms complejas& $#> permite a los programadores .eb acceder , manipular las pginas ;<=>L como si 1ueran documentos ;>L& $e )ec)o0 $#> se diseK originalmente para manipular de 1orma sencilla los documentos ;>L& J pesar de sus orgenes0 $#> se )a convertido en una utilidad disponible para la ma,ora de lenguajes de programacin (Java0 P<P0 JavaScript- , cu,as Inicas di1erencias se encuentran en la 1orma de implementarlo&
L+bod,M L+)tmlM
Se trans1orma en el siguiente rbol de nodos* Eigura 6&2& Frbol de nodos generado automticamente por $#> a partir del cdigo ;<=>L de la pgina En el es/uema anterior0 cada rectngulo representa un nodo $#> , las 1lec)as indican las relaciones entre nodos& $entro de cada nodo0 se )a incluido su tipo (/ue se ver ms adelante- , su contenido& La raz del rbol de nodos de cual/uier pgina ;<=>L siempre es la misma* un nodo de tipo especial denominado ",ocumento"& J partir de ese nodo raz0 cada eti/ueta ;<=>L se trans1orma en un nodo de tipo "Elemento"& La conversin de eti/uetas en nodos se realiza de 1orma jerr/uica& $e esta 1orma0 del nodo raz solamente pueden derivar los nodos <EJ$ , 8#$O& J partir de esta derivacin inicial0 cada eti/ueta ;<=>L se trans1orma en un nodo /ue deriva del nodo correspondiente a su "etiqueta padre"& La trans1ormacin de las eti/uetas ;<=>L )abituales genera dos nodos* el primero es el nodo de tipo "Elemento" (correspondiente a la propia eti/ueta ;<=>L- , el segundo es un nodo de tipo "Ae'to" /ue contiene el teCto encerrado por esa eti/ueta ;<=>L& Js0 la siguiente eti/ueta ;<=>L*
LtitleMPgina sencillaL+titleM
eti/ueta ;<=>L*
Eigura 6&7& !odos generados automticamente por $#> para una eti/ueta ;<=>L sencilla
@enera los siguientes nodos* !odo de tipo "Elemento" correspondiente a la eti/ueta LpM& !odo de tipo "Ae'toP con el contenido teCtual de la eti/ueta LpM& Como el contenido de LpM inclu,e en su interior otra eti/ueta ;<=>L0 la eti/ueta interior se trans1orma en un nodo de tipo "Elemento" /ue representa la eti/ueta LstrongM , /ue deriva del nodo anterior& El contenido de la eti/ueta LstrongM genera a su vez otro nodo de tipo "Ae'to" /ue deriva del nodo generado por LstrongM& Eigura 6&%& !odos generados automticamente por $#> para una eti/ueta ;<=>L con otras eti/uetas ;<=>L en su interior La trans1ormacin automtica de la pgina en un rbol de nodos siempre sigue las mismas reglas* Las eti/uetas ;<=>L se trans1orman en dos nodos* el primero es la propia eti/ueta , el segundo nodo es )ijo del primero , consiste en el contenido teCtual de la eti/ueta& Si una eti/ueta ;<=>L se encuentra dentro de otra0 se sigue el mismo procedimiento anterior0 pero los nodos generados sern nodos )ijo de su eti/ueta padre&
Como se puede suponer0 las pginas ;<=>L )abituales producen rboles con miles de nodos& Jun as0 el proceso de trans1ormacin es rpido , automtico0 siendo las 1unciones proporcionadas por $#> (/ue se vern ms adelante- las Inicas /ue permiten acceder a cual/uier nodo de la pgina de 1orma sencilla e inmediata&
5.#.!. %etElements6y=a%BameCE
Como todas las 1unciones /ue proporciona $#>0 la 1uncin getElements8,=ag!ame(- tiene un nombre mu, largo0 pero /ue lo )ace autoeCplicativo& La 1uncin getElements8,=ag!ame(nombreEti/ueta- obtiene todos los elementos de la pgina ;<=>L cu,a eti/ueta sea igual /ue el parmetro /ue se le pasa a la 1uncin& El siguiente ejemplo muestra cmo obtener todos los prra1os de una pgina ;<=>L*
var parra1os R document&getElements8,=ag!ame(PpP-S
sucede
con
El valor /ue se indica delante del nombre de la 1uncin (en este caso0 document- es el nodo a partir del cual se realiza la bIs/ueda de los elementos& En este caso0 como se /uieren obtener todos los prra1os de la pgina0 se utiliza el valor document como punto de partida de la bIs/ueda& El valor /ue devuelve la 1uncin es un arra, con todos los nodos /ue cumplen la condicin de /ue su eti/ueta coincide con el parmetro proporcionado& El valor devuelto es un arra, de nodos $#>0 no un arra, de cadenas de teCto o un arra, de objetos normales& Por lo tanto0 se debe procesar cada valor del arra, de la 1orma /ue se muestra en las siguientes secciones& $e este modo0 se puede obtener el primer prra1o de la pgina de la siguiente manera*
var primerParra1o R parra1os['\S
$e la misma 1orma0 se podran recorrer todos los prra1os de la pgina con el siguiente cdigo*
1or(var iR'S iLparra1os&lengt)S iWW- a var parra1o R parra1os[i\S b
La 1uncin getElements8,=ag!ame(- se puede aplicar de 1orma recursiva sobre cada uno de los nodos devueltos por la 1uncin& En el siguiente ejemplo0 se obtienen todos los enlaces del primer prra1o de la pgina*
var parra1os R document&getElements8,=ag!ame(PpP-S var primerParra1o R parra1os['\S var enlaces R primerParra1o&getElements8,=ag!ame(PaP-S
5.#.2. %etElements6yBameCE
La 1uncin getElements8,!ame(- es similar a la anterior0 pero en este caso se buscan los elementos cu,o atributo name sea igual al parmetro proporcionado& En el siguiente ejemplo0 se obtiene directamente el Inico prra1o con el nombre indicado*
var parra1oEspecial R document&getElements8,!ame(PespecialP-S Lp nameRPpruebaPM&&&L+pM Lp nameRPespecialPM&&&L+pM LpM&&&L+pM
!ormalmente el atributo name es Inico para los elementos <=>L /ue lo de1inen0 por lo /ue es un mtodo mu, prctico para acceder directamente al nodo deseado& En el caso de los elementos
<=>L radio#utton0 el atributo name es comIn a todos los radio#utton /ue estn relacionados0 por lo /ue la 1uncin devuelve una coleccin de elementos& Internet ECplorer 9&' no implementa de 1orma correcta esta 1uncin0 ,a /ue slo la tiene en cuenta para los elementos de tipo LinputM , LimgM& Jdems0 tambin tiene en consideracin los elementos cu,o atributo idsea igual al parmetro de la 1uncin&
5.#.#. %etElement6y"dCE
La 1uncin getElement8,Id(- es la ms utilizada cuando se desarrollan aplicaciones .eb dinmicas& Se trata de la 1uncin pre1erida para acceder directamente a un nodo , poder leer o modi1icar sus propiedades& La 1uncin getElement8,Id(- devuelve el elemento ;<=>L cu,o atributo id coincide con el parmetro indicado en la 1uncin& Como el atributo id debe ser Inico para cada elemento de una misma pgina0 la 1uncin devuelve Inicamente el nodo deseado&
var cabecera R document&getElement8,Id(PcabeceraP-S Ldiv idRPcabeceraPM La )re1RP+P idRPlogoPM&&&L+aM L+divM
La 1uncin getElement8,Id(- es tan importante , tan utilizada en todas las aplicaciones .eb0 /ue casi todos los ejemplos , ejercicios /ue siguen la utilizan constantemente& Internet ECplorer 9&' tambin interpreta incorrectamente esta 1uncin0 ,a /ue devuelve tambin a/uellos elementos cu,o atributo name coincida con el parmetro proporcionado a la 1uncin&
2 7 % :
Creacin de un nodo de tipo Element /ue represente al elemento& Creacin de un nodo de tipo =eCt/ue represente el contenido del elemento& JKadir el nodo =eCtcomo nodo )ijo del nodo Element& JKadir el nodo Elementa la pgina0 en 1orma de nodo )ijo del nodo correspondiente al lugar en el /ue se /uiere insertar el elemento&
$e este modo0 si se /uiere aKadir un prra1o simple al 1inal de una pgina ;<=>L0 es necesario incluir el siguiente cdigo JavaScript*
// Crear nodo de tipo Element var parra1o R document&createElement(PpP-S // Crear nodo de tipo Ae't var contenido R document&create=eCt!ode(P<ola >undoNP-S // ABadir el nodo Ae't como -ijo del nodo Element parra1o&appendC)ild(contenido-S // ABadir el nodo Element como -ijo de la pagina document&bod,&appendC)ild(parra1o-S
El proceso de creacin de nuevos nodos puede llegar a ser tedioso0 ,a /ue implica la utilizacin de tres 1unciones $#>* createElement(eti/ueta-* crea un nodo de tipo Element/ue representa al elemento ;<=>L cu,a eti/ueta se pasa como parmetro& create=eCt!ode(contenido-* crea un nodo de tipo =eCt /ue almacena el contenido teCtual de los elementos ;<=>L& nodoPadre&appendC)ild(nodo<ijo-* aKade un nodo como )ijo de otro nodo& Se debe utilizar al menos dos veces con los nodos )abituales* en primer lugar se aKade el nodo =eCtcomo )ijo del nodo Element , a continuacin se aKade el nodo Elementcomo )ijo de algIn nodo de la pgina&
La 1uncin removeC)ild(- re/uiere como parmetro el nodo /ue se va a eliminar& Jdems0 esta 1uncin debe ser invocada desde el elemento padre de ese nodo /ue se /uiere eliminar& La 1orma ms segura , rpida de acceder al nodo padre de un elemento es mediante la propiedad nodo<ijo&parent!ode& Js0 para eliminar un nodo de una pgina ;<=>L se invoca a la 1uncin removeC)ild(- desde el valor parent!ode del nodo /ue se /uiere eliminar& Cuando se elimina un nodo0 tambin se eliminan automticamente todos los nodos )ijos /ue tenga0 por lo /ue no es necesario borrar manualmente cada nodo )ijo&
En el ejemplo anterior0 se obtiene el nodo $#> /ue representa el enlace mediante la 1uncin document&getElement8,Id(-& J continuacin0 se obtiene el atributo )re1 del enlace mediante enlace&)re1& Para obtener por ejemplo el atributo id0 se utilizara enlace&id& Las propiedades CSS no son tan 1ciles de obtener como los atributos ;<=>L& Para obtener el valor de cual/uier propiedad CSS del nodo0 se debe utilizar el atributo st,le& El siguiente ejemplo obtiene el valor de la propiedad margin de la imagen*
var imagen R document&getElement8,Id(PimagenP-S alert(imagen&st,le&margin-S Limg idRPimagenP st,leRPmargin*'S border*'SP srcRPlogo&pngP +M
Jun/ue el 1uncionamiento es )omogneo entre distintos navegadores0 los resultados no son eCactamente iguales0 como muestran las siguientes imgenes /ue son el resultado de ejecutar el cdigo anterior en distintos navegadores* Eigura 6&:& Dalores /ue muestra Internet ECplorer al acceder a las propiedades CSS a travs de JavaScript Eigura 6&6& Dalores /ue muestra Eire1oC al acceder a las propiedades CSS a travs de JavaScript
Si el nombre de una propiedad CSS es compuesto0 se accede a su valor modi1icando ligeramente su nombre*
var parra1o R document&getElement8,Id(Pparra1oP-S alert(parra1o&st,le&1ontQeig)t-S // muestra "#old" Lp idRPparra1oP st,leRP1ont".eig)t* boldSPM&&&L+pM
La trans1ormacin del nombre de las propiedades CSS compuestas consiste en eliminar todos los guiones medios ("- , escribir en ma,Iscula la letra siguiente a cada guin medio& J continuacin se muestran algunos ejemplos* 1ont".eig)t se trans1orma en 1ontQeig)t line")eig)t se trans1orma en line<eig)t border"top"st,le se trans1orma en border=opSt,le list"st,le"image se trans1orma en listSt,leImage El Inico atributo ;<=>L /ue no tiene el mismo nombre en ;<=>L , en las propiedades $#> es el atributo class& Como la palabra class est reservada por JavaScript0 no es posible utilizarla para acceder al atributo class del elemento ;<=>L& En su lugar0 $#> utiliza el nombre class!ame para acceder al atributo class de ;<=>L*
var parra1o R document&getElement8,Id(Pparra1oP-S alert(parra1o&class-S // muestra "undefined" alert(parra1o&class!ame-S // muestra "normal" Lp idRPparra1oP classRPnormalPM&&&L+pM
!Imero de enlaces de la pgina $ireccin a la /ue enlaza el penIltimo enlace !umero de enlaces /ue enlazan a )ttp*++prueba !Imero de enlaces del tercer prra1o
Completar el cdigo JavaScript proporcionado para /ue cuando se pinc)e sobre el enlace se muestre completo el contenido de teCto& Jdems0 el enlace debe dejar de mostrarse despus de pulsarlo por primera vez& La accin de pinc)ar sobre un enlace 1orma parte de los PEventosP de JavaScript /ue se ven en el siguiente captulo& En este ejercicio0 slo se debe saber /ue al pinc)ar sobre el enlace0 se ejecuta la 1uncin llamada muestra(-&
Completar el cdigo JavaScript proporcionado para /ue se aKadan nuevos elementos a la lista cada vez /ue se pulsa sobre el botn& Htilizar las 1unciones $#> para crear nuevos nodos , aKadirlos a la lista eCistente& Jl igual /ue sucede en el ejercicio anterior0 la accin de pinc)ar sobre un botn 1orma parte de los PEventosP de JavaScript /ue se ven en el siguiente captulo& En este ejercicio0 slo se debe saber /ue al pinc)ar sobre el botn0 se ejecuta la 1uncin llamada anade(-&
Jlgunos eventos de la tabla anterior (onclicG0 onGe,do.n0 onGe,press0 onreset0 onsubmitpermiten evitar la "accin por defecto" de ese evento& >s adelante se muestra en detalle este comportamiento0 /ue puede resultar mu, Itil en algunas tcnicas de programacin& Las acciones tpicas /ue realiza un usuario en una pgina .eb pueden dar lugar a una sucesin de eventos& Jl pulsar por ejemplo sobre un botn de tipo Linput t,peRPsubmitPM se desencadenan los eventos onmousedo.n0 onclicG0 onmouseup , onsubmit de 1orma consecutiva&
En este mtodo0 se de1inen atributos ;<=>L con el mismo nombre /ue los eventos /ue se /uieren manejar& El ejemplo anterior slo /uiere controlar el evento de pinc)ar con el ratn0 cu,o nombre es onclicG& Js0 el elemento ;<=>L para el /ue se /uiere de1inir este evento0 debe incluir un atributo llamado onclicG& El contenido del atributo es una cadena de teCto /ue contiene todas las instrucciones JavaScript /ue se ejecutan cuando se produce el evento& En este caso0 el cdigo JavaScript es mu, sencillo (alert(T@racias por pinc)arT-S-0 ,a /ue solamente se trata de mostrar un mensaje& En este otro ejemplo0 cuando el usuario pinc)a sobre el elemento LdivM se muestra un mensaje , cuando el usuario pasa el ratn por encima del elemento0 se muestra otro mensaje*
Ldiv onclicGRPalert(T<as pinc)ado con el ratnT-SP onmouseoverRPalert(TJcabas de pasar el ratn por encimaT-SPM Puedes pinc)ar sobre este elemento o simplemente pasar el ratn por encima L+divM
Este otro ejemplo inclu,e una de las instrucciones ms utilizadas en las aplicaciones JavaScript ms antiguas*
Lbod, onloadRPalert(TLa pgina se )a cargado completamenteT-SPM &&& L+bod,M
El mensaje anterior se muestra despus de /ue la pgina se )a,a cargado completamente0 es decir0 despus de /ue se )a,a descargado su cdigo <=>L0 sus imgenes , cual/uier otro objeto incluido en la pgina& El evento onload es uno de los ms utilizados ,a /ue0 como se vio en el captulo de $#>0 las 1unciones /ue permiten acceder , manipular los nodos del rbol $#> solamente estn disponibles cuando la pgina se )a cargado completamente&
Si no se utiliza la variable t)is0 el cdigo necesario para modi1icar el color de los bordes0 sera el siguiente*
Ldiv idRPcontenidosP st,leRP.idt)*26'pCS )eig)t*9'pCS border*t)in solid silverP onmouseoverRPdocument&getElement8,Id(TcontenidosT-&st,le&borderColorRTblacGTSP onmouseoutRPdocument&getElement8,Id(TcontenidosT-&st,le&borderColorRTsilverTSPM Seccin de contenidos&&& L+divM
El cdigo anterior es demasiado largo , demasiado propenso a cometer errores& $entro del cdigo de un evento0 JavaScript crea automticamente la variable t)is0 /ue )ace re1erencia al elemento ;<=>L /ue )a provocado el evento& Js0 el ejemplo anterior se puede reescribir de la siguiente manera*
Ldiv idRPcontenidosP st,leRP.idt)*26'pCS )eig)t*9'pCS border*t)in solid silverP onmouseoverRPt)is&st,le&borderColorRTblacGTSP onmouseoutRPt)is&st,le&borderColorRTsilverTSPM Seccin de contenidos&&& L+divM
El cdigo anterior es muc)o ms compacto0 ms 1cil de leer , de escribir , sigue 1uncionando correctamente aun/ue se modi1i/ue el valor del atributo id del LdivM&
Esta tcnica consiste en eCtraer todas las instrucciones de JavaScript , agruparlas en una 1uncin eCterna& Hna vez de1inida la 1uncin0 en el atributo del elemento ;<=>L se inclu,e el nombre de la 1uncin0 para indicar /ue es la 1uncin /ue se ejecuta cuando se produce el evento& La llamada a la 1uncin se realiza de la 1orma )abitual0 indicando su nombre seguido de los parntesis , de 1orma opcional0 inclu,endo todos los argumentos , parmetros /ue se necesiten&
El principal inconveniente de este mtodo es /ue en las 1unciones eCternas no se puede seguir utilizando la variable t)is , por tanto0 es necesario pasar esta variable como parmetro a la 1uncin*
1unction resalta(elemento- a s.itc)(elemento&st,le&borderColor- a case TsilverT* case Tsilver silver silver silverT* case Tfc'c'c'T* elemento&st,le&borderColor R TblacGTS breaGS case TblacGT* case TblacG blacG blacG blacGT* case Tf''''''T* elemento&st,le&borderColor R TsilverTS breaGS b b Ldiv st,leRP.idt)*26'pCS )eig)t*9'pCS border*t)in solid silverP onmouseoverRPresalta(t)is-P onmouseoutRPresalta(t)is-PM Seccin de contenidos&&& L+divM
En el ejemplo anterior0 la 1uncin eCterna es llamada con el parmetro t)is0 /ue dentro de la 1uncin se denomina elemento& La complejidad del ejemplo se produce sobre todo por la 1orma en la /ue los distintos navegadores almacenan el valor de la propiedad borderColor& >ientras /ue Eire1oC almacena (en caso de /ue los cuatro bordes coincidan en color- el valor blacG0 Internet ECplorer lo almacena como blacG blacG blacG blacG , #pera almacena su representacin )eCadecimal f''''''&
2& Jsignar un identi1icador Inico al elemento ;<=>L mediante el atributo id& 7& Crear una 1uncin de JavaScript encargada de manejar el evento& %& Jsignar la 1uncin eCterna al evento correspondiente en el elemento deseado&
El Iltimo paso es la clave de esta tcnica& En primer lugar0 se obtiene el elemento al /ue se desea asociar la 1uncin eCterna*
document&getElement8,Id(Ppinc)ableP-S
J continuacin0 se utiliza una propiedad del elemento con el mismo nombre /ue el evento /ue se /uiere manejar& En este caso0 la propiedad es onclicG*
document&getElement8,Id(Ppinc)ableP-&onclicG R &&&
Por Iltimo0 se asigna la 1uncin eCterna mediante su nombre sin parntesis& Lo ms importante (, la causa ms comIn de errores- es indicar solamente el nombre de la 1uncin0 es decir0 prescindir de los parntesis al asignar la 1uncin*
document&getElement8,Id(Ppinc)ableP-&onclicG R muestra>ensajeS
Si se aKaden los parntesis despus del nombre de la 1uncin0 en realidad se est ejecutando la 1uncin , guardando el valor devuelto por la 1uncin en la propiedad onclicG de elemento&
// Asignar una funcin e'terna a un evento de un elemento document&getElement8,Id(Ppinc)ableP-&onclicG R muestra>ensajeS // Ejecutar una funcin ! guardar su resultado en una propiedad de un elemento document&getElement8,Id(Ppinc)ableP-&onclicG R muestra>ensaje(-S
La gran ventaja de este mtodo es /ue el cdigo ;<=>L resultante es mu, "limpio"0 ,a /ue no se mezcla con el cdigo JavaScript& Jdems0 dentro de las 1unciones eCternas asignadas s /ue se puede utilizar la variable t)ispara re1erirse al elemento /ue provoca el evento& El Inico inconveniente de este mtodo es /ue la pgina se debe cargar completamente antes de /ue se puedan utilizar las 1unciones $#> /ue asignan los manejadores a los elementos ;<=>L& Hna de las 1ormas ms sencillas de asegurar /ue cierto cdigo se va a ejecutar despus de /ue la pgina se cargue por completo es utilizar el evento onload*
La tcnica anterior utiliza el concepto de funciones annimas0 /ue no se va a estudiar0 pero /ue permite crear un cdigo compacto , mu, sencillo& Para asegurarse /ue un cdigo JavaScript va a ejecutarse despus de /ue la pgina se )a,a cargado completamente0 slo es necesario incluir esas instrucciones entre los smbolos a , b*
.indo.&onload R 1unction(- a &&& b
En el siguiente ejemplo0 se aKaden eventos a los elementos de tipo inputRteCt de un 1ormulario complejo*
1unction resalta(- a // Cdigo GavaScript b .indo.&onload R 1unction(- a var 1ormulario R document&getElement8,Id(P1ormularioP-S var camposInput R 1ormulario&getElements8,=ag!ame(PinputP-S 1or(var iR'S iLcamposInput&lengt)S iWW- a i1(camposInput[i\&t,pe RR PteCtP- a camposInput[i\&onclicG R resaltaS b b b
2 7
Cuando se pinc)e sobre el primer enlace0 se oculte su seccin relacionada Cuando se vuelva a pinc)ar sobre el mismo enlace0 se muestre otra vez esa seccin de contenidos % Completar el resto de enlaces de la pgina para /ue su comportamiento sea idntico al del primer enlace : Cuando una seccin se oculte0 debe cambiar el mensaje del enlace asociado (pista* propiedad inner<=>L-
in:ormacin
del
evento
Cob0eto
!ormalmente0 los manejadores de eventos re/uieren in1ormacin adicional para procesar sus tareas& Si una 1uncin por ejemplo se encarga de procesar el evento onclicG0 /uizs necesite saber en /ue posicin estaba el ratn en el momento de pinc)ar el botn& !o obstante0 el caso ms )abitual en el /ue es necesario conocer in1ormacin adicional sobre el evento es el de los eventos asociados al teclado& !ormalmente0 es mu, importante conocer la tecla /ue se )a pulsado0 por ejemplo para di1erenciar las teclas normales de las teclas especiales (E!=E 0 tabulador0 Jlt0 Ctrl&0 etc&-&
JavaScript permite obtener in1ormacin sobre el ratn , el teclado mediante un objeto especial llamado event& $esa1ortunadamente0 los di1erentes navegadores presentan di1erencias mu, notables en el tratamiento de la in1ormacin sobre los eventos& La principal di1erencia reside en la 1orma en la /ue se obtiene el objeto event& Internet ECplorer considera /ue este objeto 1orma parte del objeto .indo. , el resto de navegadores lo consideran como el Inico argumento /ue tienen las 1unciones manejadoras de eventos& Jun/ue es un comportamiento /ue resulta mu, eCtraKo al principio0 todos los navegadores modernos eCcepto Internet ECplorer crean m%gicamente , de 1orma automtica un argumento /ue se pasa a la 1uncin manejadora0 por lo /ue no es necesario incluirlo en la llamada a la 1uncin manejadora& $e esta 1orma0 para utilizar este "argumento m%gico"0 slo es necesario asignarle un nombre0 ,a /ue los navegadores lo crean automticamente& En resumen0 en los navegadores tipo Internet ECplorer0 el objeto event se obtiene directamente mediante*
var evento R .indo.&eventS
Por otra parte0 en el resto de navegadores0 el objeto event se obtiene m%gicamente a partir del argumento /ue el navegador crea automticamente*
1unction manejadorEventos(elEvento- a var evento R elEventoS b
Si se /uiere programar una aplicacin /ue 1uncione correctamente en todos los navegadores0 es necesario obtener el objeto event de 1orma correcta segIn cada navegador& El siguiente cdigo muestra la 1orma correcta de obtener el objeto event en cual/uier navegador*
1unction manejadorEventos(elEvento- a var evento R elEvento ^^ .indo.&eventS b
Hna vez obtenido el objeto event0 ,a se puede acceder a toda la in1ormacin relacionada con el evento0 /ue depende del tipo de evento producido&
La propiedad t,pe devuelve el tipo de evento producido0 /ue es igual al nombre del evento pero sin el pre1ijo on& >ediante esta propiedad0 se puede re)acer de 1orma ms sencilla el ejemplo anterior en el /ue se resaltaba una seccin de contenidos al pasar el ratn por encima*
1unction resalta(elEvento- a var evento R elEvento ^^ .indo.&eventS s.itc)(evento&t,pe- a case TmouseoverT* t)is&st,le&borderColor R TblacGTS breaGS case TmouseoutT* t)is&st,le&borderColor R TsilverTS breaGS b b .indo.&onload R 1unction(- a document&getElement8,Id(PseccionP-&onmouseover R resaltaS document&getElement8,Id(PseccionP-&onmouseout R resaltaS b Ldiv idRPseccionP st,leRP.idt)*26'pCS )eig)t*9'pCS border*t)in solid silverPM Seccin de contenidos&&& L+divM
Evento Ge,press* Internet ECplorer* Propiedad Ge,Code* el cdigo del carcter de la tecla /ue se )a pulsado Propiedad c)arCode* no de1inido esto de navegadores* Propiedad Ge,Code* para las teclas normales0 no de1inido& Para las teclas especiales0 el cdigo interno de la tecla& Propiedad c)arCode* para las teclas normales0 el cdigo del carcter de la tecla /ue se )a pulsado& Para las teclas especiales0 '& Evento Ge,up* >ismo comportamiento en todos los navegadores* Propiedad Ge,Code* cdigo interno de la tecla Propiedad c)arCode* no de1inido Para convertir el cdigo de un carcter (no con1undir con el cdigo interno- al carcter /ue representa la tecla /ue se )a pulsado0 se utiliza la 1uncin String&1romC)arCode(-& J continuacin se inclu,e un script /ue muestra toda la in1ormacin sobre los tres eventos de teclado*
.indo.&onload R 1unction(- a document&onGe,up R muestraIn1ormacionS document&onGe,press R muestraIn1ormacionS document&onGe,do.n R muestraIn1ormacionS b 1unction muestraIn1ormacion(elEvento- a var evento R .indo.&event ^^ elEventoS var mensaje R P=ipo de evento* P W evento&t,pe W PLbrMP W PPropiedad Ge,Code* P W evento&Ge,Code W PLbrMP W PPropiedad c)arCode* P W evento&c)arCode W PLbrMP W PCarcter pulsado* P W String&1romC)arCode(evento&c)arCode-S in1o&inner<=>L WR PLbrM""""""""""""""""""""""""""""""""""""""LbrMP W mensaje b &&& Ldiv idRPin1oPML+divM
Carcter pulsado* 5 =ipo de evento* Ge,press Propiedad Ge,Code* ' Propiedad c)arCode* AB Carcter pulsado* a =ipo de evento* Ge,up Propiedad Ge,Code* 96 Propiedad c)arCode* ' Carcter pulsado* 5
Jl pulsar la tecla J (la misma tecla0 pero )abiendo activado previamente las ma,Isculas- se muestra la siguiente sucesin de eventos en el navegador Eire1oC*
=ipo de evento* Ge,do.n Propiedad Ge,Code* 96 Propiedad c)arCode* ' Carcter pulsado* 5 =ipo de evento* Ge,press Propiedad Ge,Code* ' Propiedad c)arCode* 96 Carcter pulsado* J =ipo de evento* Ge,up Propiedad Ge,Code* 96 Propiedad c)arCode* ' Carcter pulsado* 5
En los eventos Ge,do.n , Ge,up0 la propiedad Ge,Code sigue valiendo lo mismo en los dos casos& El motivo es /ue Ge,Code almacena el cdigo interno de la tecla0 por lo /ue si se pulsa la misma tecla0 se obtiene el mismo cdigo0 independientemente de /ue una misma tecla puede producir caracteres di1erentes (por ejemplo ma,Isculas , minIsculas-& En el evento Ge,press0 el valor de la propiedad c)arCode vara0 ,a /ue el carcter a0 no es el mismo /ue el carcter J& En este caso0 el valor de c)arCode coincide con el cdigo JSCII del carcter pulsado& Siguiendo en el navegador Eire1oC0 si a)ora se pulsa una tecla especial0 como por ejemplo el tabulador0 se muestra la siguiente in1ormacin*
=ipo de evento* Ge,do.n Propiedad Ge,Code* A Propiedad c)arCode* ' Carcter pulsado* 5 =ipo de evento* Ge,press Propiedad Ge,Code* A Propiedad c)arCode* ' Carcter pulsado* 5
=ipo de evento* Ge,up Propiedad Ge,Code* A Propiedad c)arCode* ' Carcter pulsado* 5
Las teclas especiales no disponen de la propiedad c)arCode0 ,a /ue slamente se guarda el cdigo interno de la tecla pulsada en la propiedad Ge,Code0 en este caso el cdigo A& Si se pulsa la tecla Enter0 se obtiene el cdigo 2%0 la tecla de la 1lec)a superior produce el cdigo %?0 etc& !o obstante0 dependiendo del teclado utilizado para pulsar las teclas , dependiendo de la disposicin de las teclas en 1uncin del idioma del teclado0 estos cdigos podran variar& J continuacin se muestra el resultado de la ejecucin del mismo ejemplo anterior en el navegador Internet ECplorer& Jl pulsar la tecla a0 se obtiene la siguiente in1ormacin*
=ipo de evento* Ge,do.n Propiedad Ge,Code* 96 Propiedad c)arCode* unde1ined Carcter pulsado* =ipo de evento* Ge,press Propiedad Ge,Code* AB Propiedad c)arCode* unde1ined Carcter pulsado* =ipo de evento* Ge,up Propiedad Ge,Code* 96 Propiedad c)arCode* unde1ined Carcter pulsado*
La propiedad Ge,Code en el evento Ge,press contiene el cdigo JSCII del carcter de la tecla0 por lo /ue se puede obtener directamente el carcter mediante String&1romC)arCode(Ge,Code-& Si se pulsa la tecla J0 la in1ormacin mostrada es idntica a la anterior0 salvo /ue el cdigo /ue muestra el evento Ge,press cambia por 960 /ue es el cdigo JSCII de la tecla J*
=ipo de evento* Ge,do.n Propiedad Ge,Code* 96 Propiedad c)arCode* unde1ined Carcter pulsado* =ipo de evento* Ge,press Propiedad Ge,Code* 96 Propiedad c)arCode* unde1ined Carcter pulsado* =ipo de evento* Ge,up Propiedad Ge,Code* 96 Propiedad c)arCode* unde1ined Carcter pulsado*
Jl pulsar una tecla especial como el tabulador0 Internet ECplorer muestra la siguiente in1ormacin*
=ipo de evento* Ge,do.n Propiedad Ge,Code* A Propiedad c)arCode* unde1ined Carcter pulsado*
Los cdigos mostrados para las teclas especiales coinciden con los de Eire1oC , el resto de navegadores0 pero recuerda /ue pueden variar en 1uncin del teclado /ue se utiliza , en 1uncin de la disposicin de las teclas para cada idioma& Por Iltimo0 las propiedades altVe,0 ctrlVe, , s)i1tVe, almacenan un valor booleano /ue indica si alguna de esas teclas estaba pulsada al producirse el evento del teclado& Sorprendentemente0 estas tres propiedades 1uncionan de la misma 1orma en todos los navegadores*
i1(evento&altVe,- a alert(TEstaba pulsada la tecla JL=T-S b
J continuacin se muestra el caso en el /ue se pulsa la tecla S)i1t , sin soltarla0 se pulsa sobre la tecla /ue contiene el nImero 7 (en este caso0 se re1iere a la tecla /ue se encuentra en la parte superior del teclado , por tanto0 no se re1iere a la /ue se encuentra en el teclado numrico-& =anto Internet ECplorer como Eire1oC muestran la misma secuencia de eventos*
=ipo de evento* Ge,do.n Propiedad Ge,Code* 29 Propiedad c)arCode* ' Carcter pulsado* 5 =ipo de evento* Ge,do.n Propiedad Ge,Code* 6' Propiedad c)arCode* ' Carcter pulsado* 5 =ipo de evento* Ge,press Propiedad Ge,Code* ' Propiedad c)arCode* %: Carcter pulsado* P =ipo de evento* Ge,up Propiedad Ge,Code* 6' Propiedad c)arCode* ' Carcter pulsado* 5 =ipo de evento* Ge,up Propiedad Ge,Code* 29 Propiedad c)arCode* ' Carcter pulsado* 5
El evento Ge,press es el Inico /ue permite obtener el car%cter realmente pulsado0 ,a /ue al pulsar sobre la tecla 7 )abiendo pulsado la tecla S)i1t previamente0 se obtiene el carcter P0 /ue es precisamente el /ue muestra el evento Ge,press&
El siguiente cdigo de JavaScript permite obtener de 1orma correcta en cual/uier navegador el carcter correspondiente a la tecla pulsada*
1unction manejador(elEvento- a var evento R elEvento ^^ .indo.&eventS var caracter R evento&c)arCode ^^ evento&Ge,CodeS alert(PEl carcter pulsado es* P W String&1romC)arCode(caracter--S b document&onGe,press R manejadorS
Las coordenadas de la posicin del puntero del ratn respecto de la pantalla completa del ordenador del usuario se obtienen de la misma 1orma0 mediante las propiedades screen; , screenO*
var coordenada; R evento&screen;S var coordenadaO R evento&screenOS
En muc)as ocasiones0 es necesario obtener otro par de coordenadas di1erentes* las /ue corresponden a la posicin del ratn respecto del origen de la pgina& Estas coordenadas no siempre coinciden con las coordenadas respecto del origen de la ventana del navegador0 ,a /ue el usuario puede )acer scroll sobre la pgina .eb& Internet ECplorer no proporciona estas coordenadas de 1orma directa0 mientras /ue el resto de navegadores s /ue lo )acen& $e esta 1orma0 es necesario detectar si el navegador es de tipo Internet ECplorer , en caso a1irmativo realizar un clculo sencillo*
// ,etectar si el navegador es @nternet E'plorer var ie R navigator&userJgent&toLo.erCase(-&indeC#1(TmsieT-NR"2S i1(ie- a coordenada; R evento&client; W document&bod,&scrollLe1tS
coordenadaO R evento&clientO W document&bod,&scroll=opS b else a coordenada; R evento&page;S coordenadaO R evento&pageOS b alert(P<as pulsado el ratn en la posicin* P W coordenada; W P0 P W coordenadaO W P respecto de la pgina .ebP-S
La variable ie vale true si el navegador en el /ue se ejecuta el script es de tipo Internet ECplorer (cual/uier versin- , vale 1alse en otro caso& Para el resto de navegadores0 las coordenadas respecto del origen de la pgina se obtienen mediante las propiedades page; , pageO& En el caso de Internet ECplorer0 se obtienen sumando la posicin respecto de la ventana del navegador (client;0 clientO- , el desplazamiento /ue )a su1rido la pgina (document&bod,&scrollLe1t0 document&bod,&scroll=op-&
Completar el cdigo JavaScript proporcionado para /ue* 2& Jl mover el ratn en cual/uier punto de la ventana del navegador0 se muestre la posicin del puntero respecto del navegador , respecto de la pgina* Eigura 9&2& In1ormacin /ue se muestra para los eventos del ratn Para mostrar los mensajes0 utilizar la 1uncin muestraIn1ormacion(- deduciendo su 1uncionamiento a partir de su cdigo 1uente& 2 Jl pulsar cual/uier tecla0 el mensaje mostrado debe cambiar para indicar el nuevo evento , su in1ormacin asociada*
JKadir la siguiente caracterstica al script* cuando se pulsa un botn del ratn0 el color de 1ondo del cuadro de mensaje debe ser amarillo ( fEEEECC- , cuando se pulsa una tecla0 el Eigura 9&7& In1ormacin /ue se muestra para los eventos del teclado
color de 1ondo debe ser azul ( fCCE9EE-& Jl volver a mover el ratn0 el color de 1ondo vuelve a ser blanco& Eigura 9&%& El color de 1ondo del cuadro de in1ormacin cambia en 1uncin del tipo de evento
Crear un script /ue in1orme al usuario en /ue zona de la pantalla )a pulsado el ratn& Las zonas de1inidas son las siguientes* iz/uierda arriba0 iz/uierda abajo0 derec)a arriba , derec)a abajo& Para determinar el tamaKo de la ventana del navegador0 utilizar la 1uncin tamanoDentana!avegador(- proporcionada&
Jdems del arra, de 1ormularios0 el navegador crea automticamente un arra, llamado elements por cada uno de los 1ormularios de la pgina& Cada arra, elements contiene la re1erencia a todos los elementos (cuadros de teCto0 botones0 listas desplegables0 etc&- de ese 1ormulario& Htilizando la sintaCis de los arra,s0 la siguiente instruccin obtiene el primer elemento del primer 1ormulario de la pgina*
document&1orms['\&elements['\S
La sintaCis de los arra,s no siempre es tan concisa& El siguiente ejemplo muestra cmo obtener directamente el Iltimo elemento del primer 1ormulario de la pgina*
document&1orms['\&elements[document&1orms['\&elements&lengt)"2\S
Jun/ue esta 1orma de acceder a los 1ormularios es rpida , sencilla0 tiene un inconveniente mu, grave& 34u sucede si cambia el diseKo de la pgina , en el cdigo <=>L se cambia el orden de los 1ormularios originales o se aKaden nuevos 1ormularios5 El problema es /ue "el primer formulario de la p%gina" a)ora podra ser otro 1ormulario di1erente al /ue espera la aplicacin&
En un entorno tan cambiante como el diseKo .eb0 es mu, di1cil con1iar en /ue el orden de los 1ormularios se mantenga estable en una pgina .eb& Por este motivo0 siempre debera evitarse el acceso a los 1ormularios de una pgina mediante el arra, document&1orms& Hna 1orma de evitar los problemas del mtodo anterior consiste en acceder a los 1ormularios de una pgina a travs de su nombre (atributo name- o a travs de su atributo id& El objeto document permite acceder directamente a cual/uier 1ormulario mediante su atributo name*
var 1ormularioPrincipal R document&1ormularioS var 1ormularioSecundario R document&otroX1ormularioS L1orm nameRP1ormularioP M &&& L+1ormM L1orm nameRPotroX1ormularioP M &&& L+1ormM
Jccediendo de esta 1orma a los 1ormularios de la pgina0 el script 1unciona correctamente aun/ue se reordenen los 1ormularios o se aKadan nuevos 1ormularios a la pgina& Los elementos de los 1ormularios tambin se pueden acceder directamente mediante su atributo name*
var 1ormularioPrincipal R document&1ormularioS var primerElemento R document&1ormulario&elementoS L1orm nameRP1ormularioPM Linput t,peRPteCtP nameRPelementoP +M L+1ormM
#bviamente0 tambin se puede acceder a los 1ormularios , a sus elementos utilizando las 1unciones $#> de acceso directo a los nodos& El siguiente ejemplo utiliza la )abitual 1uncin document&getElement8,Id(- para acceder de 1orma directa a un 1ormulario , a uno de sus elementos*
var 1ormularioPrincipal R document&getElement8,Id(P1ormularioP-S document&getElement8,Id(PelementoP-S L1orm nameRP1ormularioP idRP1ormularioP M Linput t,peRPteCtP nameRPelementoP idRPelementoP +M L+1ormM var primerElemento R
Independientemente del mtodo utilizado para obtener la re1erencia a un elemento de 1ormulario0 cada elemento dispone de las siguientes propiedades Itiles para el desarrollo de las aplicaciones* t,pe* indica el tipo de elemento /ue se trata& Para los elementos de tipo LinputM (teCt0 button0 c)ecGboC0 etc&- coincide con el valor de su atributo t,pe& Para las listas desplegables normales (elemento LselectM- su valor es select"one0 lo /ue permite di1erenciarlas de las listas /ue permiten seleccionar varios elementos a la vez , cu,o tipo es select"multiple& Por Iltimo0 en los elementos de tipo LteCtareaM0 el valor de t,pe es teCtarea&
1orm* es una re1erencia directa al 1ormulario al /ue pertenece el elemento& Js0 para acceder al 1ormulario de un elemento0 se puede utilizar
document&getElement8,Id(PidXdelXelementoP-&1orm
name* obtiene el valor del atributo name de ;<=>L& Solamente se puede leer su valor0 por lo /ue no se puede modi1icar& value* permite leer , modi1icar el valor del atributo value de ;<=>L& Para los campos de teCto (Linput t,peRPteCtPM , LteCtareaM- obtiene el teCto /ue )a escrito el usuario& Para los botones obtiene el teCto /ue se muestra en el botn& Para los elementos c-ecH#o' , radio#utton no es mu, Itil0 como se ver ms adelante Por Iltimo0 los eventos ms utilizados en el manejo de los 1ormularios son los siguientes* onclicG* evento /ue se produce cuando se pinc)a con el ratn sobre un elemento& !ormalmente se utiliza con cual/uiera de los tipos de botones /ue permite de1inir ;<=>L (Linput t,peRPbuttonPM0 Linput t,peRPsubmitPM0 Linput t,peRPimagePM-& onc)ange* evento /ue se produce cuando el usuario cambia el valor de un elemento de teCto (Linput t,peRPteCtPM o LteCtareaM-& =ambin se produce cuando el usuario selecciona una opcin en una lista desplegable ( LselectM-& Sin embargo0 el evento slo se produce si despus de realizar el cambio0 el usuario pasa al siguiente campo del 1ormulario0 lo /ue tcnicamente se conoce como /ue "el otro campo de formulario -a perdido el foco"& on1ocus* evento /ue se produce cuando el usuario selecciona un elemento del 1ormulario& onblur* evento complementario de on1ocus0 ,a /ue se produce cuando el usuario )a deseleccionado un elemento por )aber seleccionado otro elemento del 1ormulario& =cnicamente0 se dice /ue el elemento anterior "-a perdido el foco"&
,.2.!.#. C7ecHbo?
Los elementos de tipo c-ecH#o' son mu, similares a los radio#utton0 salvo /ue en este caso se debe comprobar cada c-ecH#o' de 1orma independiente del resto& El motivo es /ue los grupos de radio#utton son mutuamente eCclu,entes , slo se puede seleccionar uno de ellos cada vez& Por su parte0 los c-ecH#o' se pueden seleccionar de 1orma independiente respecto de los dems& Si se dispone de los siguientes c-ecH#o'*
Linput t,peRPc)ecGboCP valueRPcondicionesP nameRPcondicionesP idRPcondicionesP+M <e ledo , acepto las condiciones Linput t,peRPc)ecGboCP valueRPprivacidadP nameRPprivacidadP idRPprivacidadP+M <e ledo la poltica de privacidad
,.2.!.'. Select
Las listas desplegables (LselectM- son los elementos en los /ue es ms di1cil obtener su valor& Si se dispone de una lista desplegable como la siguiente*
Lselect idRPopcionesP nameRPopcionesPM Loption valueRP2PMPrimer valorL+optionM Loption valueRP7PMSegundo valorL+optionM Loption valueRP%PM=ercer valorL+optionM Loption valueRP:PMCuarto valorL+optionM L+selectM
En general0 lo /ue se re/uiere es obtener el valor del atributo value de la opcin (LoptionMseleccionada por el usuario& #btener este valor no es sencillo0 ,a /ue se deben realizar una serie de pasos& Jdems0 para obtener el valor seleccionado0 deben utilizarse las siguientes propiedades* options0 es un arra, creado automticamente por el navegador para cada lista desplegable , /ue contiene la re1erencia a todas las opciones de esa lista& $e esta 1orma0 la primera opcin de una lista se puede obtener mediante document&getElement8,Id(PidXdeXlaXlistaP-&options['\& selectedIndeC0 cuando el usuario selecciona una opcin0 el navegador actualiza automticamente el valor de esta propiedad0 /ue guarda el ndice de la opcin seleccionada& El ndice )ace re1erencia al arra, options creado automticamente por el navegador para cada lista&
// ;#tener la referencia a la lista var lista R document&getElement8,Id(PopcionesP-S // ;#tener el ndice de la opcin que se -a seleccionado var indiceSeleccionado R lista&selectedIndeCS // Con el ndice ! el arra! "options") o#tener la opcin seleccionada var opcionSeleccionada R lista&options[indiceSeleccionado\S // ;#tener el valor ! el te'to de la opcin seleccionada var teCtoSeleccionado R opcionSeleccionada&teCtS var valorSeleccionado R opcionSeleccionada&valueS alert(P#pcin seleccionada* P W teCtoSeleccionado W PZn Dalor de la opcin* P W valorSeleccionado-S
Como se )a visto0 para obtener el valor del atributo value correspondiente a la opcin seleccionada por el usuario0 es necesario realizar varios pasos& !o obstante0 normalmente se abrevian todos los pasos necesarios en una Inica instruccin*
var lista R document&getElement8,Id(PopcionesP-S // ;#tener el valor de la opcin seleccionada var valorSeleccionado R lista&options[lista&selectedIndeC\&valueS // ;#tener el te'to que muestra la opcin seleccionada var valorSeleccionado R lista&options[lista&selectedIndeC\&teCtS
Lo ms importante es no con1undir el valor de la propiedad selectedIndeC con el valor correspondiente a la propiedad value de la opcin seleccionada& En el ejemplo anterior0 la primera opcin tiene un value igual a 2& Sin embargo0 si se selecciona esta opcin0 el valor de selectedIndeC ser '0 ,a /ue es la primera opcin del arra, options (, los arra,s empiezan a contar los elementos en el nImero '-&
n elemento
En programacin0 cuando un elemento est seleccionado , se puede escribir directamente en el o se puede modi1icar alguna de sus propiedades0 se dice /ue tiene el 1oco del programa&
Si un cuadro de teCto de un 1ormulario tiene el 1oco0 el usuario puede escribir directamente en el sin necesidad de pinc)ar previamente con el ratn en el interior del cuadro& Igualmente0 si una lista desplegable tiene el 1oco0 el usuario puede seleccionar una opcin directamente subiendo , bajando con las 1lec)as del teclado& Jl pulsar repetidamente la tecla =J8HLJ$# sobre una pgina .eb0 los di1erentes elementos (enlaces0 imgenes0 campos de 1ormulario0 etc&- van obteniendo el 1oco del navegador (el elemento seleccionado cada vez suele mostrar un pe/ueKo borde punteado-& Si en una pgina .eb el 1ormulario es el elemento ms importante0 como por ejemplo en una pgina de bIs/ueda o en una pgina con un 1ormulario para registrarse0 se considera una buena prctica de usabilidad el asignar automticamente el 1oco al primer elemento del 1ormulario cuando se carga la pgina& Para asignar el 1oco a un elemento de ;<=>L0 se utiliza la 1uncin 1ocus(-& El siguiente ejemplo asigna el 1oco a un elemento de 1ormulario cu,o atributo ides igual a primero*
document&getElement8,Id(PprimeroP-&1ocus(-S L1orm idRP1ormularioP actionRPfPM Linput t,peRPteCtP idRPprimeroP +M L+1ormM
Jmpliando el ejemplo anterior0 se puede asignar automticamente el 1oco del programa al primer elemento del primer 1ormulario de la pgina0 independientemente del id del 1ormulario , de los elementos*
i1(document&1orms&lengt) M '- a i1(document&1orms['\&elements&lengt) M 'a document&1orms['\&elements['\&1ocus(-S b b
El cdigo anterior comprueba /ue eCiste al menos un 1ormulario en la pgina mediante el tamaKo del arra, 1orms& Si su tamaKo es ma,or /ue '0 se utiliza este primer 1ormulario& Empleando la misma tcnica0 se comprueba /ue el 1ormulario tenga al menos un elemento (i1(document&1orms['\&elements&lengt) M '--& En caso a1irmativo0 se establece el 1oco del navegador en el primer elemento del primer 1ormulario (document&1orms['\&elements['\&1ocus(-S-& Para /ue el ejemplo anterior sea completamente correcto0 se debe aKadir una comprobacin adicional& El campo de 1ormulario /ue se selecciona no debera ser de tipo )idden*
i1(document&1orms&lengt) M '- a 1or(var iR'S i L document&1orms['\&elements&lengt)S iWW- a var campo R document&1orms['\&elements[i\S i1(campo&t,pe NR P)iddenP- a campo&1ocus(-S breaGS b b b
n :orm lario
Hno de los problemas )abituales con el uso de 1ormularios .eb es la posibilidad de /ue el usuario pulse dos veces seguidas sobre el botn PEnviarP& Si la coneCin del usuario es demasiado lenta o la respuesta del servidor se )ace esperar0 el 1ormulario original sigue mostrndose en el navegador , por ese motivo0 el usuario tiene la tentacin de volver a pinc)ar sobre el botn de PEnviarP& En la ma,ora de los casos0 el problema no es grave e incluso es posible controlarlo en el servidor0 pero puede complicarse en 1ormularios de aplicaciones importantes como las /ue implican transacciones econmicas& Por este motivo0 una buena prctica en el diseKo de aplicaciones .eb suele ser la de des)abilitar el botn de envo despus de la primera pulsacin& El siguiente ejemplo muestra el cdigo necesario*
L1orm idRP1ormularioP actionRPfPM &&& Linput t,peRPbuttonP valueRPEnviarP onclicGRPt)is&disabledRtrueS t)is&valueRgEnviando&&&gS t)is&1orm&submit(-P +M L+1ormM
Cuando se pulsa sobre el botn de envo del 1ormulario0 se produce el evento onclicG sobre el botn , por tanto0 se ejecutan las instrucciones JavaScript contenidas en el atributo onclicG*
En primer lugar0 se des)abilita el botn mediante la instruccin t)is&disabled R trueS& Esta es la Inica instruccin necesaria si slo se /uiere des)abilitar un botn& 7 J continuacin0 se cambia el mensaje /ue muestra el botn& $el original PEnviarP se pasa al ms adecuado PEnviando&&&P % Por Iltimo0 se enva el 1ormulario mediante la 1uncin submit(- en la siguiente instruccin* t)is&1orm&submit(El botn del ejemplo anterior est de1inido mediante un botn de tipo Linput t,peRPbuttonP +M0 ,a /ue el cdigo JavaScript mostrado no 1unciona correctamente con un botn de tipo Linput t,peRPsubmitP +M& Si se utiliza un botn de tipo submit0 el botn se des)abilita antes de enviar el 1ormulario , por tanto el 1ormulario acaba sin enviarse&
n te?tarea
La carencia ms importante de los campos de 1ormulario de tipo teCtarea es la imposibilidad de limitar el mCimo nImero de caracteres /ue se pueden introducir0 de 1orma similar al atributo maClengt) de los cuadros de teCto normales& JavaScript permite aKadir esta caracterstica de 1orma mu, sencilla& En primer lugar0 )a, /ue recordar /ue con algunos eventos (como onGe,press0 onclicG , onsubmit- se puede evitar su comportamiento normal si se devuelve el valor 1alse& Evitar el comportamiento normal e/uivale a modi1icar completamente el comportamiento )abitual del evento& Si por ejemplo se devuelve el valor 1alse en el evento onGe,press0 la tecla
pulsada por el usuario no se tiene en cuenta& Si se devuelve 1alse en el evento onclicG de un elemento como un enlace0 el navegador no carga la pgina indicada por el enlace& Si un evento devuelve el valor true0 su comportamiento es el )abitual*
LteCtarea onGe,pressRPreturn trueSPML+teCtareaM
En el teCtarea del ejemplo anterior0 el usuario puede escribir cual/uier carcter0 ,a /ue el evento onGe,press devuelve true , por tanto0 su comportamiento es el normal , la tecla pulsada se trans1orma en un carcter dentro del teCtarea& Sin embargo0 en el siguiente ejemplo*
LteCtarea onGe,pressRPreturn 1alseSPML+teCtareaM
Como el valor devuelto por el evento onGe,press es igual a 1alse0 el navegador no ejecuta el comportamiento por de1ecto del evento0 es decir0 la tecla presionada no se trans1orma en ningIn carcter dentro del teCtarea& !o importa las veces /ue se pulsen las teclas , no importa la tecla pulsada0 ese teCtarea no permitir escribir ningIn carcter& Jprovec)ando esta caracterstica0 es sencillo limitar el nImero de caracteres /ue se pueden escribir en un elemento de tipo teCtarea* se comprueba si se )a llegado al mCimo nImero de caracteres permitido , en caso a1irmativo se evita el comportamiento )abitual del evento , por tanto0 los caracteres adicionales no se aKaden al teCtarea*
1unction limita(maCimoCaracteres- a var elemento R document&getElement8,Id(PteCtoP-S i1(elemento&value&lengt) MR maCimoCaracteres - a return 1alseS b else a return trueS b b LteCtarea idRPteCtoP onGe,pressRPreturn limita(2''-SPML+teCtareaM
En el ejemplo anterior0 con cada tecla pulsada se compara el nImero total de caracteres del teCtarea con el mCimo nImero de caracteres permitido& Si el nImero de caracteres es igual o ma,or /ue el lmite0 se devuelve el valor 1alse , por tanto0 se evita el comportamiento por de1ecto de onGe,press , la tecla no se aKade&
>ejorar el ejemplo anterior indicando en todo momento al usuario el nImero de caracteres /ue aIn puede escribir& Jdems0 se debe permitir pulsar las teclas 8acGspace0 Supr& , las 1lec)as )orizontales cuando se )a,a llegado al mCimo nImero de caracteres&
n c adro de te?to
En ocasiones0 puede ser Itil blo/uear algunos caracteres determinados en un cuadro de teCto& Si por ejemplo un cuadro de teCto espera /ue se introduzca un nImero0 puede ser interesante no permitir al usuario introducir ningIn carcter /ue no sea numrico&
Igualmente0 en algunos casos puede ser Itil impedir /ue el usuario introduzca nImeros en un cuadro de teCto& Htilizando el evento onGe,press , unas cuantas sentencias JavaScript0 el problema se resuelve 1cilmente*
1unction permite(elEvento0 permitidos- a // 4aria#les que definen los caracteres permitidos var numeros R P'27%:69B?APS var caracteres R P abcde1g)ijGlmnKop/rstuv.C,zJ8C$EE@<IJVL>!h#P4 S=HDQ;OcPS var numerosXcaracteres R numeros W caracteresS var teclasXespeciales R [?0 %B0 %A0 :9\S // 3 + IacHSpace) /0 + Supr) 12 + flec-a izquierda) 1J + flec-a derec-a
// Seleccionar los caracteres a partir del par%metro de la funcin s.itc)(permitidos- a case TnumT* permitidos R numerosS breaGS case TcarT* permitidos R caracteresS breaGS case TnumXcarT* permitidos R numerosXcaracteresS breaGS b // ;#tener la tecla pulsada var evento R elEvento ^^ .indo.&eventS var codigoCaracter R evento&c)arCode ^^ evento&Ge,CodeS var caracter R String&1romC)arCode(codigoCaracter-S // Compro#ar si la tecla pulsada es alguna de las teclas especiales // Kteclas de #orrado ! flec-as -orizontalesL var teclaXespecial R 1alseS 1or(var i in teclasXespeciales- a i1(codigoCaracter RR teclasXespeciales[i\- a teclaXespecial R trueS breaGS bb // Compro#ar si la tecla pulsada se encuentra en los caracteres permitidos // o si es una tecla especial return permitidos&indeC#1(caracter- NR "2 ^^ teclaXespecialS b // Slo n"meros Linput t,peRPteCtP idRPteCtoP onGe,pressRPreturn permite(event0 TnumT-P +M // Slo letras Linput t,peRPteCtP idRPteCtoP onGe,pressRPreturn permite(event0 TcarT-P +M // Slo letras o n"meros Linput t,peRPteCtP idRPteCtoP onGe,pressRPreturn permite(event0 TnumXcarT-P +M
El 1uncionamiento del script anterior se basa en permitir o impedir el comportamiento )abitual del evento onGe,press& Cuando se pulsa una tecla0 se comprueba si el carcter de esa tecla se encuentra dentro de los caracteres permitidos para ese elemento LinputM& Si el carcter se encuentra dentro de los caracteres permitidos0 se devuelve true , por tanto el comportamiento de onGe,press es el )abitual , la tecla se escribe& Si el carcter no se encuentra dentro de los caracteres permitidos0 se devuelve 1alse , por tanto se impide el comportamiento normal de onGe,press , la tecla no llega a escribirse en el input& Jdems0 el script anterior siempre permite la pulsacin de algunas teclas especiales& En concreto0 las teclas 8acGSpace , Supr para borrar caracteres , las teclas Elec)a Iz/uierda , Elec)a $erec)a para moverse en el cuadro de teCto siempre se puden pulsar independientemente del tipo de caracteres permitidos&
,.#. Falidacin
La principal utilidad de JavaScript en el manejo de los 1ormularios es la validacin de los datos introducidos por los usuarios& Jntes de enviar un 1ormulario al servidor0 se recomienda validar mediante JavaScript los datos insertados por el usuario& $e esta 1orma0 si el usuario )a cometido algIn error al rellenar el 1ormulario0 se le puede noti1icar de 1orma instantnea0 sin necesidad de esperar la respuesta del servidor& !oti1icar los errores de 1orma inmediata mediante JavaScript mejora la satis1accin del usuario con la aplicacin (lo /ue tcnicamente se conoce como "mejorar la e'periencia de usuario"-, a,uda a reducir la carga de procesamiento en el servidor& !ormalmente0 la validacin de un 1ormulario consiste en llamar a una 1uncin de validacin cuando el usuario pulsa sobre el botn de envo del 1ormulario& En esta 1uncin0 se comprueban si los valores /ue )a introducido el usuario cumplen las restricciones impuestas por la aplicacin& Jun/ue eCisten tantas posibles comprobaciones como elementos de 1ormulario di1erentes0 algunas comprobaciones son mu, )abituales* /ue se rellene un campo obligatorio0 /ue se seleccione el valor de una lista desplegable0 /ue la direccin de email indicada sea correcta0 /ue la 1ec)a introducida sea lgica0 /ue se )a,a introducido un nImero donde as se re/uiere0 etc& J continuacin se muestra el cdigo JavaScript bsico necesario para incorporar la validacin a un 1ormulario*
L1orm actionRPP met)odRPP idRPP nameRPP onsubmitRPreturn validacion(-PM &&& L+1ormM
else i1 (condicion /ue debe cumplir el segundo campo del 1ormulario- a // Si no se cumple la condicion999 alert(T[E # \ El campo debe tener un valor de&&&T-S return 1alseS b &&& else i1 (condicion /ue debe cumplir el Iltimo campo del 1ormulario- a // Si no se cumple la condicion999 alert(T[E # \ El campo debe tener un valor de&&&T-S return 1alseS b // Si el script -a llegado a este punto) todas las condiciones // se -an cumplido) por lo que se devuelve el valor true return trueS b
El 1uncionamiento de esta tcnica de validacin se basa en el comportamiento del evento onsubmit de JavaScript& Jl igual /ue otros eventos como onclicG , onGe,press0 el evento Tonsubmit vara su comportamiento en 1uncin del valor /ue se devuelve& Js0 si el evento onsubmit devuelve el valor true0 el 1ormulario se enva como lo )ara normalmente& Sin embargo0 si el evento onsubmit devuelve el valor 1alse0 el 1ormulario no se enva& La clave de esta tcnica consiste en comprobar todos , cada uno de los elementos del 1ormulario& En cuando se encuentra un elemento incorrecto0 se devuelve el valor 1alse& Si no se encuentra ningIn error0 se devuelve el valor true& Por lo tanto0 en primer lugar se de1ine el evento onsubmit del 1ormulario como*
onsubmitRPreturn validacion(-P
Como el cdigo JavaScript devuelve el valor resultante de la 1uncin validacion(-0 el 1ormulario solamente se enviar al servidor si esa 1uncin devuelve true& En el caso de /ue la 1uncin validacion(- devuelva 1alse0 el 1ormulario permanecer sin enviarse& $entro de la 1uncin validacion(- se comprueban todas las condiciones impuestas por la aplicacin& Cuando no se cumple una condicin0 se devuelve 1alse , por tanto el 1ormulario no se enva& Si se llega al 1inal de la 1uncin0 todas las condiciones se )an cumplido correctamente0 por lo /ue se devuelve true, el 1ormulario se enva& La noti1icacin de los errores cometidos depende del diseKo de cada aplicacin& En el cdigo del ejemplo anterior simplemente se muestran mensajes mediante la 1uncin alert(indicando el error producido& Las aplicaciones .eb mejor diseKadas muestran cada mensaje de error al lado del elemento de 1ormulario correspondiente , tambin suelen mostrar un mensaje principal indicando /ue el 1ormulario contiene errores& Hna vez de1inido el es/uema de la 1uncin validacion(-0 se debe aKadir a esta 1uncin el cdigo correspondiente a todas las comprobaciones /ue se realizan sobre los elementos del 1ormulario& J continuacin0 se muestran algunas de las validaciones ms )abituales de los campos de 1ormulario&
,.#.!. Falidar
Se trata de 1orzar al usuario a introducir un valor en un cuadro de teCto o teCtarea en los /ue sea obligatorio& La condicin en JavaScript se puede indicar como*
valor R document&getElement8,Id(PcampoP-&valueS i1( valor RR null ^^ valor&lengt) RR ' ^^ +iZsWY+&test(valor- - a return 1alseS b
Para /ue se de por completado un campo de teCto obligatorio0 se comprueba /ue el valor introducido sea vlido0 /ue el nImero de caracteres introducido sea ma,or /ue cero , /ue no se )a,an introducido slo espacios en blanco& La palabra reservada null es un valor especial /ue se utiliza para indicar "ning"n valor"& Si el valor de una variable es null0 la variable no contiene ningIn valor de tipo objeto0 arra,0 numrico0 cadena de teCto o booleano& La segunda parte de la condicin obliga a /ue el teCto introducido tenga una longitud superior a cero caracteres0 esto es0 /ue no sea un teCto vaco& Por Iltimo0 la tercera parte de la condicin (+iZsWY+&test(valor-- obliga a /ue el valor introducido por el usuario no slo est 1ormado por espacios en blanco& Esta comprobacin se basa en el uso de "e'presiones regulares"0 un recurso )abitual en cual/uier lenguaje de programacin pero /ue por su gran complejidad no se van a estudiar& Por lo tanto0 slo es necesario copiar literalmente esta condicin0 poniendo especial cuidado en no modi1icar ningIn carcter de la eCpresin&
,.#.2. Falidar
Se trata de obligar al usuario a introducir un valor numrico en un cuadro de teCto& La condicin JavaScript consiste en*
valor R document&getElement8,Id(PcampoP-&valueS i1( is!a!(valor- - a return 1alseS b
Si el contenido de la variable valor no es un nImero vlido0 no se cumple la condicin& La ventaja de utilizar la 1uncin interna is!a!(- es /ue simpli1ica las comprobaciones0 ,a /ue JavaScript se encarga de tener en cuenta los decimales0 signos0 etc& J continuacin se muestran algunos resultados de la 1uncin is!a!(-*
is!a!(%-S // false is!a!(P%P-S // false is!a!(%&%6:6-S // false is!a!(%7%7%&%:6-S // false is!a!(W7%&7-S // false is!a!(P"7%&7P-S // false is!a!(P7%aP-S // true is!a!(P7%&:%&6:P-S // true
na opcin de
na lista
Se trata de obligar al usuario a seleccionar un elemento de una lista desplegable& El siguiente cdigo JavaScript permite conseguirlo*
indice R document&getElement8,Id(PopcionesP-&selectedIndeCS i1( indice RR null ^^ indice RR ' - a return 1alseS b Lselect idRPopcionesP nameRPopcionesPM Loption valueRPPM" Selecciona un valor "L+optionM Loption valueRP2PMPrimer valorL+optionM Loption valueRP7PMSegundo valorL+optionM Loption valueRP%PM=ercer valorL+optionM L+selectM
J partir de la propiedad selectedIndeC0 se comprueba si el ndice de la opcin seleccionada es vlido , adems es distinto de cero& La primera opcin de la lista ( "Selecciona un valor _- no es vlida0 por lo /ue no se permite el valor ' para esta propiedad selectedIndeC&
,.#.'. Falidar
na direccin de email
Se trata de obligar al usuario a introducir una direccin de email con un 1ormato vlido& Por tanto0 lo /ue se comprueba es /ue la direccin parezca vlida0 ,a /ue no se comprueba si se trata de una cuenta de correo electrnico real , operativa& La condicin JavaScript consiste en*
valor R document&getElement8,Id(PcampoP-&valueS i1( N(+Z.W(["W&T\Z.W-UjZ.W(["&\Z.W-UZ&Z.W(["&\Z.W-+&test(valor-- - a return 1alseS b
La comprobacin se realiza nuevamente mediante las eCpresiones regulares0 ,a /ue las direcciones de correo electrnico vlidas pueden ser mu, di1erentes& Por otra parte0 como el estndar /ue de1ine el 1ormato de las direcciones de correo electrnico es mu, complejo0 la eCpresin regular anterior es una simpli1icacin& Jun/ue esta regla valida la ma,ora de direcciones de correo electrnico utilizadas por los usuarios0 no soporta todos los di1erentes 1ormatos vlidos de email&
,.#.5. Falidar
na :ec7a
Las 1ec)as suelen ser los campos de 1ormulario ms complicados de validar por la multitud de 1ormas di1erentes en las /ue se pueden introducir& El siguiente cdigo asume /ue de alguna 1orma se )a obtenido el aKo0 el mes , el da introducidos por el usuario*
var ano R document&getElement8,Id(PanoP-&valueS var mes R document&getElement8,Id(PmesP-&valueS var dia R document&getElement8,Id(PdiaP-&valueS valor R ne. $ate(ano0 mes0 dia-S i1( Nis!a!(valor- - a
return 1alseS b
La 1uncin $ate(ano0 mes0 dia- es una 1uncin interna de JavaScript /ue permite construir 1ec)as a partir del aKo0 el mes , el da de la 1ec)a& Es mu, importante tener en cuenta /ue el nImero de mes se indica de ' a 220 siendo ' el mes de Enero , 22 el mes de $iciembre& Los das del mes siguen una numeracin di1erente0 ,a /ue el mnimo permitido es 2, el mCimo %2& La validacin consiste en intentar construir una 1ec)a con los datos proporcionados por el usuario& Si los datos del usuario no son correctos0 la 1ec)a no se puede construir correctamente , por tanto la validacin del 1ormulario no ser correcta&
,.#.&. Falidar
n n/mero de )B"
Se trata de comprobar /ue el nImero proporcionado por el usuario se corresponde con un nImero vlido de $ocumento !acional de Identidad o $!I& Jun/ue para cada pas o regin los re/uisitos del documento de identidad de las personas pueden variar0 a continuacin se muestra un ejemplo genrico 1cilmente adaptable& La validacin no slo debe comprobar /ue el nImero est 1ormado por oc)o ci1ras , una letra0 sino /ue tambin es necesario comprobar /ue la letra indicada es correcta para el nImero introducido*
valor R document&getElement8,Id(PcampoP-&valueS var letras R [T=T0 T T0 TQT0 TJT0 T@T0 T>T0 TOT0 TET0 TPT0 T$T0 T;T0 T8T0 T!T0 TJT0 TcT0 TST0 T4T0 TDT0 T<T0 TLT0 TCT0 TVT0 TET0 T=T\S i1( N(+iZda?b[J"c\Y+&test(valor-- - a return 1alseS b i1(valor&c)arJt(?- NR letras[(valor&substring('0 ?--`7%\- a return 1alseS b
La primera comprobacin asegura /ue el 1ormato del nImero introducido es el correcto0 es decir0 /ue est 1ormado por ? nImeros seguidos , una letra& Si la letra est al principio de los nImeros0 la comprobacin sera +i[J"c\Zda?bY+& Si en vez de oc)o nImeros , una letra0 se re/uieren diez nImeros , dos letras0 la comprobacin sera +iZda2'b[J"c\a7bY+ , as sucesivamente& La segunda comprobacin aplica el algoritmo de clculo de la letra del $!I , la compara con la letra proporcionada por el usuario& El algoritmo de cada documento de identi1icacin es di1erente0 por lo /ue esta parte de la validacin se debe adaptar convenientemente&
,.#.,. Falidar
n n/mero de tel3:ono
Los nImeros de tel1ono pueden ser indicados de 1ormas mu, di1erentes* con pre1ijo nacional0 con pre1ijo internacional0 agrupado por pares0 separando los nImeros con guiones0 etc& El siguiente script considera /ue un nImero de tel1ono est 1ormado por nueve dgitos consecutivos , sin espacios ni guiones entre las ci1ras*
Hna vez ms0 la condicin de JavaScript se basa en el uso de eCpresiones regulares0 /ue comprueban si el valor indicado es una sucesin de nueve nImeros consecutivos& J continuacin se muestran otras eCpresiones regulares /ue se pueden utilizar para otros 1ormatos de nImero de tel1ono*
,.#.(. Falidar @ e
Si un elemento de tipo c-ecH#o' se debe seleccionar de 1orma obligatoria0 JavaScript permite comprobarlo de 1orma mu, sencilla*
elemento R document&getElement8,Id(PcampoP-S i1( N elemento&c)ecGed - a return 1alseS b
Si se trata de comprobar /ue todos los c-ecH#o' del 1ormulario )an sido seleccionados0 es ms 1cil utilizar un bucle*
1ormulario R document&getElement8,Id(P1ormularioP-S 1or(var iR'S iL1ormulario&elements&lengt)S iWW- a var elemento R 1ormulario&elements[i\S i1(elemento&t,pe RR Pc)ecGboCP- a i1(Nelemento&c)ecGeda return 1alseS b b b
,.#.9. Falidar @ e
Jun/ue se trata de un caso similar al de los c-ecH#o'0 la validacin de los radio#utton presenta una di1erencia importante* en general0 la comprobacin /ue se realiza es /ue el usuario )a,a seleccionado algIn radio#utton de los /ue 1orman un determinado grupo& >ediante JavaScript0 es sencillo determinar si se )a seleccionado algIn radio#utton de un grupo*
opciones R document&getElements8,!ame(PopcionesP-S var seleccionado R 1alseS 1or(var iR'S iLopciones&lengt)S iWW- a i1(opciones[i\&c)ecGed- a seleccionado R trueS breaGS b b i1(Nseleccionado- a return 1alseS b
El anterior ejemplo recorre todos los radio#utton /ue 1orman un grupo , comprueba elemento por elemento si )a sido seleccionado& Cuando se encuentra el primer radio#utton seleccionado0 se sale del bucle , se indica /ue al menos uno )a sido seleccionado&
Capt lo (. *tras
tilidades
Jdems de los 1ormularios , de todas las 1unciones , utilidades de JavaScript /ue se )an visto0 eCisten muc)as otras utilidades /ue es necesario conocer para desarrollar aplicaciones completas& Como no es posible estudiar todas las )erramientas /ue se pueden crear con JavaScript0 a continuacin se muestran algunas de las utilidades bsicas ms comunes&
Htilizando el cdigo anterior0 se puede construir un reloj mu, bsico /ue no actualiza su contenido*
var 1ec)a<ora R ne. $ate(-S document&getElement8,Id(PrelojP-&inner<=>L R 1ec)a<oraS Ldiv idRPrelojP +M
Cuando se carga la pgina0 el ejemplo anterior mostrara un teCto parecido al siguiente en el LdivM reservado para el reloj*
=)u Jug '7 7''B 2A*%6*2A @>=W'7'' (<ora de verano romance-
Este primer reloj construido presenta muc)as di1erencias respecto al reloj /ue se /uiere construir& En primer lugar0 muestra muc)a ms in1ormacin de la necesaria& Jdems0 su valor no se actualiza cada segundo0 por lo /ue no es un reloj mu, prctico& El objeto $ate(- proporciona unas 1unciones mu, Itiles para obtener in1ormacin sobre la 1ec)a , la )ora& Concretamente0 eCisten 1unciones /ue obtienen directamente la )ora0 los minutos , los segundos*
var 1ec)a<ora R ne. $ate(-S var )oras R 1ec)a<ora&get<ours(-S var minutos R 1ec)a<ora&get>inutes(-S
Htilizando las 1unciones get<ours(-0 get>inutes(- , getSeconds(- del objeto $ate0 el reloj puede mostrar solamente la in1ormacin de la )ora& El resultado del ejemplo anterior sera un reloj como el siguiente*
7'*A*72
Si la )ora0 minuto o segundo son menores /ue 2'0 JavaScript no aKade el ' por delante0 por lo /ue el resultado no es del todo satis1actorio& El siguiente cdigo soluciona este problema aKadiendo un ' cuando sea necesario*
var 1ec)a<ora R ne. $ate(-S var )oras R 1ec)a<ora&get<ours(-S var minutos R 1ec)a<ora&get>inutes(-S var segundos R 1ec)a<ora&getSeconds(-S i1()oras L 2'- a )oras R T'T W )orasS b i1(minutos L 2'- a minutos R T'T W minutosS b i1(segundos L 2'- a segundos R T'T W segundosS b document&getElement8,Id(PrelojP-&inner<=>L R )orasWT*TWminutosWT*TWsegundosS Ldiv idRPrelojP +M
Para completar el reloj0 slo 1alta /ue se actualice su valor cada segundo& Para conseguirlo0 se deben utilizar unas 1unciones especiales de JavaScript /ue permiten ejecutar determinadas instrucciones cuando )a transcurrido un determinado espacio de tiempo& La 1uncin set=imeout(- permite ejecutar una 1uncin una vez /ue )a,a transcurrido un periodo de tiempo indicado& La de1inicin de la 1uncin es*
set=imeout(nombreEuncion0 milisegundos-S
La 1uncin /ue se va a ejecutar se debe indicar mediante su nombre sin parntesis , el tiempo /ue debe transcurrir )asta /ue se ejecute se indica en milisegundos& $e esta 1orma0 si se crea una 1uncin encargada de mostrar la )ora del reloj , se denomina muestra eloj(-0 se puede indicar /ue se ejecute dentro de 2 segundo mediante el siguiente cdigo*
1unction muestra eloj(- a var 1ec)a<ora R ne. $ate(-S var )oras R 1ec)a<ora&get<ours(-S var minutos R 1ec)a<ora&get>inutes(-S var segundos R 1ec)a<ora&getSeconds(-S i1()oras L 2'- a )oras R T'T W )orasS b i1(minutos L 2'- a minutos R T'T W minutosS b i1(segundos L 2'a segundos R T'T W segundosS b
document&getElement8,Id(PrelojP-&inner<=>L R )orasWT*TWminutosWT*TWsegundosS
!o obstante0 el cdigo anterior simplemente muestra el contenido del reloj 2 segundo despus de /ue se cargue la pgina0 por lo /ue no es mu, Itil& Para ejecutar una 1uncin de 1orma peridica0 se utiliza una 1uncin de JavaScript mu, similar a set=imeout(- /ue se denomina setInterval(-& Su de1inicin es*
setInterval(nombreEuncion0 milisegundos-S
La de1inicin de esta 1uncin es idntica a la 1uncin set=imeout(-0 salvo /ue en este caso0 la 1uncin programada se ejecuta in1initas veces de 1orma peridica con un lapso de tiempo entre ejecuciones de tantos milisegundos como se )a,an establecido& Js0 para construir el reloj completo0 se establece una ejecucin peridica de la 1uncin muestra eloj(- cada segundo*
1unction muestra eloj(- a var 1ec)a<ora R ne. $ate(-S var )oras R 1ec)a<ora&get<ours(-S var minutos R 1ec)a<ora&get>inutes(-S var segundos R 1ec)a<ora&getSeconds(-S i1()oras L 2'- a )oras R T'T W )orasS b i1(minutos L 2'- a minutos R T'T W minutosS b i1(segundos L 2'a segundos R T'T W segundosS b document&getElement8,Id(PrelojP-&inner<=>L R )orasWT*TWminutosWT*TWsegundosS b .indo.&onload R 1unction(- a setInterval(muestra eloj0 2'''-S b Ldiv idRPrelojP +M
Empleando el objeto $ate , sus 1unciones0 es posible construir "cuentras atr%s"0 es decir0 relojes /ue muestran el tiempo /ue 1alta )asta /ue se produzca un evento& Jdems0 las 1unciones set=imeout(- , setInterval(- pueden resultar mu, Itiles en otras tcnicas de programacin&
(.2. Calendario
Cuando una aplicacin muestra un 1ormulario para /ue el in1ormacin ms complicada de obtener siempre suelen ser 1ec)as& El motivo es /ue eCisten muc)as 1ormas di1erentes de por ejemplo se pueden indicar como dd+mm+aa0 dd+mm+aaaa0 aaaa0 etc& usuario inserte sus datos0 la los nImeros de tel1ono , las indicar estos datos& Las 1ec)as aaaa+mm+dd0 dd"mm"aa0 dd mm
Los mtodos ms utilizados para /ue el usuario introduzca la in1ormacin relativa a una 1ec)a suelen ser un cuadro de teCto en el /ue tiene /ue insertar la 1ec)a completa (indicndole el 1ormato /ue debe seguir- o un cuadro de teCto para el da0 una lista desplegable para el mes , otro cuadro de teCto para el aKo& En cual/uier caso0 para el usuario suele ser ms cmodo /ue la aplicacin inclu,a un calendario en el /ue pueda indicar la 1ec)a pinc)ando sobre el da elegido* Eigura ?&2& Jspecto de un calendario creado con JavaScript Jdems0 este mtodo es menos propenso a cometer errores0 ,a /ue si el calendario est bien construido0 no es posible introducir 1ec)as invlidas , tampoco es posible insertar las 1ec)as en un 1ormato incorrecto& !o obstante0 realizar un calendario completo en JavaScript no es una tarea trivial0 por lo /ue no se va a estudiar su desarrollo completo& J1ortunadamente0 eCisten scripts gratuitos para mostrar calendarios , /ue permiten su uso libre incluso en aplicaciones comerciales& $e entre todos los calendarios disponibles0 uno de los ms completos es el desarrollado por la empresa $,nJrc)0 /ue se puede acceder desde su pgina .eb o1icial* )ttp*++...&d,narc)&com+ projects+calendar+ , /ue se puede descargar gratuitamente desde )ttp*++source1orge&net+ projects+jscalendar+ El arc)ivo descargado inclu,e todos los scripts necesarios0 su documentacin0 ejemplos de uso0 di1erentes estilos CSS para el calendario0 etc& J continuacin se indican los pasos necesarios para incluir un calendario bsico en cual/uier pgina .eb* 2- Enlazar los arc)ivos JavaScript , CSS re/ueridos* Se descomprime el arc)ivo descargado0 se guardan los arc)ivos JavaScript , CSS en el sitio adecuado (en este ejemplo se supone /ue los arc)ivos JavaScript se guardan en el directorio js+ , los arc)ivos CSS en el directorio css+- , se enlazan directamente desde la cabecera de la pgina <=>L&
L)eadM &&& Lst,le t,peRPteCt+cssPMjimport url(Pcss+calendar"estilo&cssP-SL+st,leM Lscript t,peRPteCt+javascriptP srcRPjs+calendar&jsP +M Lscript t,peRPteCt+javascriptP srcRPjs+calendar"es&jsP +M Lscript t,peRPteCt+javascriptP srcRPjs+calendar"setup&jsP +M &&& L+)eadM
El calendario inclu,e traducciones a ms de :' idiomas0 entre los /ue se encuentra el espaKol& Para mostrar el calendario en un determinado idioma0 tan solo es necesario enlazar el arc)ivo del idioma correspondiente& Las traducciones se encuentran en el directorio lang , su 1ormato es calendar";;&js0 donde ;;es el cdigo del idioma& 7- JKadir el cdigo ;<=>L necesario para el elemento /ue va a mostrar el calendario*
LpMIntroduce la 1ec)a pulsando sobre la imagen del calendarioL+pM Linput t,peRPteCtP nameRPdateP idRP1ec)aP readonl,RPreadonl,P +M Limg srcRPcalendario&pngP idRPselectorP +M
En este caso0 el calendario est 1ormado por dos elementos* Hn cuadro de teCto llamado 1ec)a , /ue almacena el valor introducido por el usuario& Como se le )a asignado un atributo readonl,RPreadonl,P0 el usuario no puede modi1icar su valor& Hna pe/ueKa imagen o icono /ue se utiliza para activar el calendario& Cuando el usuario pinc)a con el ratn sobre la imagen0 se muestra el calendario de JavaScript& %- Con1igurar el calendario*
Lscript t,peRPteCt+javascriptPM .indo.&onload R 1unction(- a Calendar&setup(a inputEield* P1ec)aP0 i1Eormat* P`d + `m + `OP0 button* PselectorP b-S b L+scriptM
Hna vez enlazados los arc)ivos del calendario , preparado el cdigo ;<=>L0 es necesario inicializar , con1igurar el calendario& La con1iguracin del calendario consiste en establecer el valor de alguna de sus propiedades& Las propiedades bsicas imprescindibles son* inputEield* se trata del atributo iddel elemento en el /ue se mostrar la 1ec)a seleccionada0 en este ejemplo sera 1ec)a& i1Eormat* 1ormato en el /ue se mostrar la 1ec)a una vez seleccionada (en este caso se )a optado por el 1ormato dd + mm + aaaa-& button* atributo id del elemento /ue se pulsa (botn0 imagen0 enlace- para mostrar el calendario de seleccin de 1ec)a& En este ejemplo0 el idde la imagen es selector&
$espus de esta con1iguracin bsica0 el calendario ,a puede utilizarse en la aplicacin* 2- Jspecto por de1ecto del selector de calendario* Eigura ?&7& Elementos ;<=>L del calendario JavaScript* cuadro de teCto e icono
7- Jl pinc)ar una vez sobre la imagen del calendario* Eigura ?&%& Jspecto inicial del calendario JavaScript cuando se abre por primera vez Se muestra el calendario con el aspecto e idioma establecidos , aparece resaltada la 1ec)a del da actual& %- Se selecciona la 1ec)a deseada* Eigura ?&:& Seleccionando una 1ec)a en el calendario JavaScript
:- $espus de pinc)ar con el ratn sobre la 1ec)a deseada* Eigura ?&6& El cuadro de teCto muestra la 1ec)a establecida por el usuario con el calendario JavaScript Jl pulsar con el ratn sobre la 1ec)a deseada0 el calendario se cierra automticamente , el cuadro de teCto muestra la 1ec)a seleccionada con el 1ormato indicado en la con1iguracin del calendario& Si se vuelve a abrir el calendario para seleccionar otra 1ec)a0 se mostrar resaltada la 1ec)a del da seleccionado , no la 1ec)a del da actual&
>ejorar el calendario creado aKadiendo las opciones necesarias para /ue muestre el siguiente aspecto* Eigura ?&9& Jspecto mejorado del calendario JavaScript
2 7
4ue no se muestre el nImero de la semana en el calendario (pista* .eeG!umbers>odi1icar el 1ormato en el /ue se muestra la 1ec)a seleccionada& El 1ormato original es 72 + '? + 7''B (indicado como `d + `m + `O-& El 1ormato deseado es >artes0 72 de Jgosto de 7''B (pistas* `J0 `8% El nuevo 1ormato de 1ec)a es muc)o ms agradable para los usuarios0 pero ms incmodo para los scripts /ue tienen /ue manejarlo& J1ortunadamente0 el calendario dispone de la posibilidad de guardar dos valores* un valor para mostrar a los usuarios , otro valor para /ue lo procesen los scripts& Cuando el usuario seleccione una 1ec)a0 la 1ec)a con el 1ormato original se debe almacenar en un campo oculto de 1ormulario , el otro 1ormato ms largo debe mostrar al usuario en un elemento de tipo LspanM (pistas* displa,Jrea0 daEormat-
(.#. =ooltip
Los tooltips son pe/ueKos recuadros de in1ormacin /ue aparecen al posicionar el ratn sobre un elemento& !ormalmente se utilizan para o1recer in1ormacin adicional sobre el elemento seleccionado o para mostrar al usuario pe/ueKos mensajes de a,uda& Los tooltips son )abituales en varios elementos de los sistemas operativos* Eigura ?&B& Jspecto de un tooltip tpico en el Sistema #perativo ealizar un tooltip completo mediante JavaScript es una tarea mu, compleja0 sobre todo por la di1icultad de mostrar el mensaje correctamente en 1uncin de la posicin del ratn& J1ortunadamente0 eCisten scripts /ue ,a estn preparados para generar cual/uier tipo de tooltip& La librera /ue se va a utilizar se denomina overLI80 , se puede descargar desde su pgina .eb principal* )ttp*++...&bosrup&com+.eb+overlib+ La descarga inclu,e todos los scripts necesarios para el 1uncionamiento del sistema de tooltips0 pero no su documentacin0 /ue se puede consultar en* )ttp*++...&bosrup&com+.eb+overlib+ 5$ocumentation& La re1erencia de todos los comandos disponibles se puede consultar en* )ttp*++...&bosrup&com+.eb+overlib+5CommandX e1erence
J continuacin se indican los pasos necesarios para incluir un tooltip bsico en cual/uier pgina .eb* 2- Enlazar los arc)ivos JavaScript re/ueridos*
Lscript t,peRPteCt+javascriptP srcRPjs+overlib&jsPMLN"" overLI8 (c- EriG 8osrup ""ML+scriptM
Se descomprime el arc)ivo descargado0 se guarda el arc)ivo JavaScript en el sitio adecuado (en este ejemplo se supone /ue los arc)ivos JavaScript se guardan en el directorio js+- , se enlaza directamente desde la cabecera de la pgina <=>L& Los tooltips slo re/uieren /ue se enlace un Inico arc)ivo JavaScript ( overlib&js-& El comentario /ue inclu,e el cdigo ;<=>L es el aviso de cop,rig)t de la librera0 /ue es obligatorio incluirlo para poder usarla& 7- $e1inir el teCto /ue activa el tooltip , su contenido*
LpMLorem ipsum dolor sit amet0 La )re1RPfP onmouseoverRPreturn overlib(TPrueba de un tooltip bsico , mu, sencillo&T-SP onmouseoutRPreturn nd(-SPMconsectetuer adipiscing elitL+aM& Etiam eget metus& Proin varius auctor tortor& Cras augue ne/ue0 porta vitae0 vestibulum nec0 pulvinar id0 nib)& Eusce in arcu& $uis ve)icula nonumm, orci&L+pM
Los tooltip se inclu,en como enlaces de tipo LaM para los /ue se de1inen los eventos onmouseover , onmouseout& Cuando el ratn se pasa por encima del enlace anterior0 se muestra el tooltip con el aspecto por de1ecto* Eigura ?&?& Jspecto por de1ecto del tooltip creado con la librera overLI8
La librera overLI8 permite con1igurar completamente el aspecto , comportamiento de cada tooltip& Las opciones se indican en cada tooltip , se inclu,en como parmetros al 1inal de la llamada a la 1uncin overlib(-*
La )re1RPfP onmouseoverRPreturn overlib(TPrueba de un onmouseoutRPreturn nd(-SPMconsectetuer adipiscing elitL+aM tooltip bsico , mu, sencillo&T0 CE!=E -SP
#tra opcin /ue se puede controlar es la anc)ura del tooltip& Por de1ecto0 su anc)ura es de 7''pC0 pero la opcin QI$=< permite modi1icarla*
La )re1RPfP onmouseoverRPreturn overlib(TPrueba de un tooltip bsico , mu, sencillo&T0 CE!=E 0 QI$=<0 27'-SP onmouseoutRPreturn nd(-SPMconsectetuer adipiscing elitL+aM
El valor de la nueva anc)ura se indica en el parmetro /ue va detrs de QI$=<& El nuevo aspecto del tooltip es el siguiente* Eigura ?&2'& $e1iniendo la anc)ura /ue muestra el tooltip El uso de los parmetros de con1iguracin en la propia llamada a la 1uncin /ue muestra los tooltips no es recomendable cuando el nImero de parmetros empieza a ser mu, numeroso& J1ortunadamente0 overLI8 permite realizar una Inica con1iguracin /ue se utilizar para todos los tooltips de la pgina& La con1iguracin global consiste en llamar a la 1uncin overlibXpagede1aults(- con todos los parmetros de con1iguracin deseados& Por tanto0 el cdigo JavaScript necesario para realizar los cambios con1igurados )asta el momento sera*
Lscript t,peRPteCt+javascriptP srcRPjs+overlib&jsPMM=77 overL@I KcL EriH Iosrup 77NL+scriptM Lscript t,peRPteCt+javascriptPM overlibXpagede1aults(CE!=E 0 QI$=<0 27'-S L+scriptM LpMLorem ipsum dolor sit amet0 La )re1RPfP onmouseoverRPreturn overlib(TPrueba de un tooltip bsico , mu, sencillo&T-SP onmouseoutRPreturn nd(-SPMconsectetuer adipiscing elitL+aM& Etiam eget metus& Proin varius auctor tortor& Cras augue ne/ue0 porta vitae0 vestibulum nec0 pulvinar id0 nib)& Eusce in arcu& $uis ve)icula nonumm, orci&L+pM
Htilizando esta con1iguracin global0 se va a modi1icar por Iltimo el aspecto del tooltip para )acerlo ms parecido a los tooltips de los sistemas operativos* Eigura ?&22& =ooltip creado con la librera overLI8 , personalizado para /ue parezca un tooltip de Sistema #perativo En el ejemplo anterior se )a modi1icado el tamaKo , tipo de letra , el color de 1ondo del tooltip mediante la siguiente con1iguracin*
overlibXpagede1aults(QI$=<026'0E@C#L# 0Tf1111ccT08@C#L# 0Tf999999T0=E;=E#!=0PJrial0 DerdanaP0=E;=SIcE0P&?emP-S <elvetica0
>ejorar el tooltip propuesto aKadiendo las siguientes caractersticas* 2& 4ue el tooltip no se muestre instantneamente0 sino /ue transcurra un cuarto de segundo )asta /ue se muestre (pista* $ELJO-
4ue eCista una separacin )orizontal de 26 pCel entre el puntero del ratn , el tooltip (pista* #EESE=;7 4ue el tooltip se muestre en la parte superior del puntero del ratn , no en la parte in1erior (pista* J8#DEEl nuevo aspecto del tooltip se muestra en la siguiente imagen* Eigura ?&27& !uevo aspecto del tooltip
$e esta 1orma0 todos los arc)ivos re/ueridos por las utilidades de Oa)oo se pueden servir directamente desde sus servidores0 muc)o ms rpidos , 1iables /ue cual/uier servidor particular& Como el usuario se descarga los arc)ivos desde los servidores de Oa)oo0 el a)orro de anc)o de banda es total , la aplicacin carga muc)o ms rpido& Para crear un menI vertical0 se deben enlazar los siguientes arc)ivos*
M=77 ,ependencias 77N LlinG relRPst,les)eetP t,peRPteCt+cssP )re1RP)ttp*++,ui&,a)ooapis&com+7&%&'+build+menu+ assets+sGins+sam+menu&cssPM Lscript t,peRPteCt+javascriptP srcRP)ttp*++,ui&,a)ooapis&com+7&%&'+build+ ,a)oo" dom"event+,a)oo"dom"event&jsPML+scriptM Lscript t,peRPteCt+javascriptP srcRP)ttp*++,ui&,a)ooapis&com+7&%&'+build+container+ containerXcore"min&jsPML+scriptM M=77 Cdigo para men"s 77N Lscript t,peRPteCt+javascriptP srcRP)ttp*++,ui&,a)ooapis&com+7&%&'+build+menu+ menu"min&jsPML+scriptM
Si se opta por servir los arc)ivos desde nuestro propio servidor0 es recomendable enlazar las versiones comprimidas de cada arc)ivo0 /ue se pueden reconocer por/ue su nombre termina en "min&js& 7- $e1inir el cdigo ;<=>L de los elementos del menI*
Ldiv idRPmenuXverticalP classRP,uimenuPM Ldiv classRPbdPM Lul classRP1irst"o1"t,pePM Lli classRP,uimenuitemPMLa )re1RPfPMLorem ipsumL+aML+liM Lli classRP,uimenuitemPMLa )re1RPfPM$olor sit ametL+aML+liM Lli classRP,uimenuitemPMConsectetuer Ldiv idRPconsectetuerP classRP,uimenuPM Ldiv classRPbdPM LulM Lli classRP,uimenuitemPMLa )re1RPfPM$onec /uis nuncL+aML+liM Lli classRP,uimenuitemPMLa )re1RPfPMEusce elei1endL+aML+liM Lli classRP,uimenuitemPMLa )re1RPfPM$onec eratL+aML+liM Lli classRP,uimenuitemPMLa )re1RPfPMEaucibus orciL+aML+liM Lli classRP,uimenuitemPMLa )re1RPfPMDolutpat /uamL+aML+liM L+ulM L+divM L+divM L+liM Lli classRP,uimenuitemPMLa )re1RPfPMJdipiscing elitL+aML+liM L+ulM L+divM L+divM
La librera OHI dispone de muc)os tipos di1erentes de menIs& Jdems0 los menIs se pueden construir completamente con JavaScript (en la pgina ;<=>L no aparecen los elementos del menI- o a partir del cdigo ;<=>L de los elementos del menI incluido en la pgina&
Este Iltimo mtodo0 de1inir el menI con ;<=>L , despus aplicarle JavaScript0 es la 1orma recomendada0 ,a /ue si el usuario no tiene JavaScript activado0 el menI se visualiza correctamente& Por ese motivo0 no se va a estudiar el mtodo de construccin de un menI de OHI eCclusivamente con JavaScript& Los elementos /ue 1orman los menIs creados con OHI se constru,en mediante listas no ordenadas con las eti/uetas LulM , LliM& Hn pe/ueKo inconveniente de los menIs de1inidos con la librera OHI es /ue cada uno de los menIs (el principal , todos los desplegables- debe encerrarse con dos elementos de tipo LdivM& En otras palabras0 el es/uema de cada menI (, submenI desplegable- es el siguiente*
Ldiv idRPcual/uierXidenti1icadorP classRP,uimenuPM Ldiv classRPbdPM Lul classRP1irst"o1"t,pePM &&& L+ulM L+divM L+divM
Los valores de los atributos class de los elementos LdivM anteriores deben mantenerse para /ue el menI 1uncione correctamente& %- Construir el menI , mostrarlo en la pgina*
Lscript t,peRPteCt+javascriptPM OJ<##&util&Event&onContent ead,(PmenuXverticalP0 1unction (- a var el>enu R ne. OJ<##&.idget&>enu(PmenuXverticalP0 a .idt)* T26'pCT b-S el>enu&render(-S el>enu&s)o.(-S b-S L+scriptM
El cdigo JavaScript /ue crea dinmicamente el menI re/uiere /ue el rbol $#> de la pgina se )a,a construido completamente0 por lo /ue se utiliza la 1uncin onContent ead,(- /ue 1orma parte de las utilidades para eventos de la librera OHI& Para construir el menI se crea un nuevo objeto de tipo OJ<##&.idget&>enu , se le pasan las opciones de inicializacin (en este caso0 /ue tenga una anc)ura de 26' pCel-&*
var el>enu R ne. OJ<##&.idget&>enu(PmenuXverticalP0 a .idt)* T26'pCT b-S
Hna vez creado el objeto del menI0 se constru,e mediante la instruccin el>enu&render(- , se muestra en la pgina con la instruccin el>enu&s)o.(-& El resultado 1inal es un menI vertical desplegable con el siguiente aspecto* Eigura ?&2%& Jspecto 1inal del menI vertical desplegable creado con la librera Oa)oo OHI
Lig)tboC utiliza dos de las libreras ms conocidas , utilizadas para realizar aplicaciones JavaScript complejas* Protot,pe , Scriptaculous& Jdems de estos dos arc)ivos JavaScript0 tambin es necesario enlazar un arc)ivo de tipo CSS /ue controla el aspecto de Lig)tboC , enlaza las imgenes utilizadas& 7- Jctivar Lig)tboC* La pgina ;<=>L original contiene un enlace simple /ue abre una nueva pgina en la /ue se puede ver ampliada la imagen original*
Para
J)ora0 si el usuario tiene activado JavaScript0 al pinc)ar en el enlace* Eigura ?&2:& Enlace con el atributo Plig)tboCP aKadido
Se mostrar la imagen ampliada centrada en la misma pgina* Eigura ?&26& Imagen ampliada /ue se muestra al pinc)ar sobre el enlace Lig)tboC se activa automticamente para todos los enlaces cu,o atributo rel sea igual a lig)tboC& Jdems0 Lig)tboC muestra como ttulo de la imagen el valor del atributo title del enlace& Si el usuario no tiene activado JavaScript0 la imagen se abrir en una pgina nueva0 como ocurre si no se utiliza Lig)tboC& La sencillez de uso , el resultado tan espectacular /ue se consigue son los puntos 1uertes de Lig)tboC& !ormalmente0 Lig)tboC no se utiliza con enlaces de teCto sino con imgenes /ue contienen enlaces*
titleRP=tulo
de
la
imagen
2PMLimg
J)ora0 si el usuario tiene activado JavaScript0 al pinc)ar sobre la imagen pe/ueKa* Eigura ?&29& Imagen en miniatura con el enlace preparado para Lig)tboC
Se mostrar la imagen ampliada centrada en la misma pgina* Eigura ?&2B& Imagen ampliada /ue se muestra al pinc)ar sobre la imagen en miniatura La imagen ampliada se muestra con una vistosa animacin , el 1ondo de la pgina completa se oscurece para /ue el usuario centre toda su atencin en la imagen& El usuario puede cerrar la imagen ampliada , volver a la pgina original pulsando sobre la imagen CL#SE ; de la es/uina in1erior derec)a de la imagen& Htilizar Lig)tboC aporta muc)as ventajas respecto de la eCperiencia de usuario del sitio .eb& Jdems0 el cdigo ;<=>L permanece intacto , no se ensucia con llamadas a 1unciones JavaScript0 ,a /ue lo Inico /ue )a, /ue aKadir es un atributo relRPlig)tboCP a las imgenes , enlaces /ue va,an a utilizar Lig)tboC& Jdems0 Lig)tboC permite relacionar varias imgenes entre s para crear una galera de imgenes& Js0 mientras se visualiza una imagen ampliada es posible pasar a la siguiente imagen de la galera& Para relacionar varias imgenes entre s0 tan slo es necesario aplicar un valor Inico al atributo relcomo se muestra a continuacin*
=odas las imgenes /ue tengan el mismo valor del atributo rel0 automticamente pasarn a 1ormar parte de una galera de 1otos por la /ue se puede navegar )acia la siguiente o )acia la anterior imagen& La tcnica Lig)tboC presentada solamente es vlida para elementos de tipo imagen& !o es posible por tanto mostrar una pgina .eb o cierto cdigo ;<=>L dentro de una ventana de ese tipo& J1ortunadamente0 eCisten otras libreras basadas en Lig)tboC , /ue permiten mostrar cual/uier tipo de cdigo ;<>=L en el interior de la ventana& La ms conocida es la tcnica creada por Particle=ree , /ue se puede encontrar en* )ttp*++particletree&com+1eatures+lig)tboC"gone".ild+
JavaScript es un lenguaje de programacin interpretado0 lo /ue signi1ica /ue no se pueden detectar la ma,ora de errores en el cdigo )asta /ue se ejecutan los scripts& $e esta 1orma0 antes de considerar un script como correcto0 es necesario probarlo en todos los navegadores sobre los /ue se va,a a utilizar& Cuando se producen errores durante la ejecucin de un script0 los navegadores proporcionan cierta in1ormacin Itil para descubrir el punto eCacto en el /ue se )a producido el error , su posible solucin& Solucionar los errores de un script se denomina "depurar el script" o "de#ugear el script" (trmino /ue viene de la palabra inglesa "de#ug"0 /ue signi1ica Peliminar los errores de una aplicacinP-& $esa1ortunadamente0 no todos los navegadores proporcionan la misma in1ormacin Itil0 lo /ue complica la solucin de los errores para cada tipo de navegador& J continuacin se muestran las )erramientas /ue proporciona cada navegador para detectar , corregir los errores en JavaScript&
Hna vez activado0 se mostrar un mensaje de error cada vez /ue se produzcan errores de JavaScript en una pgina& Jdems0 en la es/uina in1erior iz/uierda se muestra un pe/ueKo mensaje indicando /ue la pgina contiene errores* Eigura A&7& >ensaje de aviso de Internet ECplorer sobre los errores de JavaScript
Pulsando sobre el botn >ostrar $etalles MM es posible acceder a cierta in1ormacin adicional sobre el error producido* Eigura A&%& In1ormacin adicional proporcionada por Internet ECplorer sobre los errores de JavaScript
Internet ECplorer es el navegador /ue menos in1ormacin proporciona& Jdems0 cuando se produce un error no siempre indica correctamente la posicin del posible error& El tipo de mensajes (mu, breves , en ocasiones ambiguos- , la 1alta de precisin sobre el lugar en el /ue se )a producido realmente el error0 )acen /ue depurar un script en Internet ECplorer sea una tarea eCcesivamente complicada&
La consola de errores permite di1erenciar los mensajes de in1ormacin0 los mensajes de aviso , los mensajes de error& Jdems0 permite visualizar todos los errores de la pgina simultneamente& Por cada error detectado se indica la posible solucin mediante un mensaje en ingls , se muestra el trozo de cdigo del script donde se )a producido el error& Jdems0 pulsando sobre el enlace incluido se accede a la lnea concreta del arc)ivo concreto donde se )a producido el error& Jdems0 Eire1oC permite instalar pe/ueKas mejoras , ampliaciones en el navegador0 /ue se conocen con el nombre de eCtensiones& Hna de las eCtensiones ms interesantes para los desarrolladores de aplicaciones .eb es Eirebug0 /ue se puede descargar gratuitamente desde )ttp*++...&get1irebug&com+ El mismo error de JavaScript muestra la siguiente in1ormacin en Eirebug* Eigura A&6& In1ormacin mostrada por Eirebug sobre un error de JavaScript
Si se pinc)a sobre el mensaje de error0 Eirebug tambin redirige a la lnea concreta del script en la /ue se est produciendo el error* Eigura A&9& Eirebug permite ir directamente a la lnea concreta del script en la /ue se est produciendo el error
Eirebug inclu,e cientos de utilidades , )erramientas necesarias para depurar aplicaciones .eb , para diseKar pginas .eb& Jdems0 proporciona in1ormacin detallada sobre ;<=>L0 CSS0 $#> , JavaScript& =oda la documentacin0 tutoriales , preguntas 1recuentes sobre Eirebug se pueden encontrar en )ttp*++...&get1irebug&com+docs&)tml
Eigura A&B& Consola de errores de #pera donde se muestra toda la in1ormacin sobre los errores de JavaScript
Jrc)ivo codigo&js
// Al cargarse el arc-ivo GavaScript) se muestra un mensaje alert(P<ola >undoNP-S // ,espues del primer mensaje) se muestra otro mensaje seguido alert(PSo, el primer scriptP-S
!!.2. E0ercicio 2
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 7 " >ostrar mensajes complejosL+titleM Lscript t,peRPteCt+javascriptPM var mensaje R P<ola >undoN Zn 4u 1acil es incluir ZTcomillas simplesZT Zn , ZPcomillas doblesZP PS alert(mensaje-S L+scriptM L+)eadM Lbod,M LpMEsta pgina muestra un mensaje complejoL+pM L+bod,M L+)tmlM
!!.#. E0ercicio #
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2"transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp" e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio % " Jrra,s simplesL+titleM Lscript t,peRPteCt+javascriptPM // Arra! que almacena los (* meses del aBo var meses R [PEneroP0 PEebreroP0 P>arzoP0 PJbrilP0 P>a,oP0 PJunioP0 PJulioP0 PJgostoP0 PSeptiembreP0 P#ctubreP0 P!oviembreP0 P$iciembreP\S // Se muestra el nom#re de cada mes alert(meses['\-S alert(meses[2\-S alert(meses[7\-S alert(meses[%\-S alert(meses[:\-S alert(meses[6\-S alert(meses[9\-S alert(meses[B\-S alert(meses[?\-S alert(meses[A\-S alert(meses[2'\-S alert(meses[22\-S L+scriptM L+)eadM Lbod,M LpMEsta pgina muestra los 27 meses del aKoL+pM L+bod,M L+)tmlM
var resultado R valor2 ^^ valor7S alert(resultado-S // ;#tener un resultado EALSE resultado R valor2 ]] valor7S alert(resultado-S // ;peraciones matem%ticas var num2 R valores[2\S var num7 R valores[6\S var suma R num2 W num7S alert(suma-S var resta R num2 " num7S alert(resta-S var multiplicacion R num2 U num7S alert(multiplicacion-S var division R num2 + num7S alert(division-S var modulo R num2 ` num7S alert(modulo-S L+scriptM L+)eadM Lbod,M LpMEsta pgina muestra el uso bsico de los operadoresL+pM L+bod,M L+)tmlM
!!.5. E0ercicio 5
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 6 " Estructuras de control0 IEL+titleM Lscript t,peRPteCt+javascriptPM var numero2 R 6S var numero7 R ?S i1(numero2 LR numero7- a alert(Pnumero2 no es ma,or /ue numero7P-S b i1(numero7 MR 'a alert(Pnumero7 es positivoP-S b i1(numero2 L ' ^^ numero2 NR '- a alert(Pnumero2 es negativo o distinto de ceroP-S b
i1(WWnumero2 L numero7- a alert(PIncrementar en 2 unidad el valor de numero2 no lo )ace ma,or o igual /ue numero7P-S b L+scriptM L+)eadM Lbod,M LpMEsta pgina muestra el uso bsico de la estructura de control IEL+pM L+bod,M L+)tmlM
!!.,. E0ercicio ,
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM
Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio B " Eactorial de un nImero enteroL+titleM Lscript t,peRPteCt+javascriptPM var numero R prompt(PIntroduce un nImero , se mostrar su 1actorialP-S var resultado R 2S 1or(var iR2S iLRnumeroS iWW- a resultado UR iS b alert(resultado-S L+scriptM L+)eadM Lbod,M L+bod,M L+)tmlM
!!.(. E0ercicio (
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio ? " Eunciones bsicasL+titleM Lscript t,peRPteCt+javascriptPM var numero R prompt(PIntroduce un nImero enteroP-S var resultado R parImpar(numero-S alert(PEl nImero PWnumeroWP es PWresultado-S 1unction parImpar(numero- a i1(numero ` 7 RR 'a return PparPS b else a return PimparPS b b L+scriptM L+)eadM Lbod,M L+bod,M L+)tmlM
!!.9. E0ercicio 9
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M
LtitleMEjercicio A " In1ormacin sobre cadenasL+titleM Lscript t,peRPteCt+javascriptPM 1unction in1o(cadena- a var resultado R PLa cadena ZPPWcadenaWPZP PS // Compro#ar ma!"sculas ! min"sculas i1(cadena RR cadena&toHpperCase(-- a resultado WR P est 1ormada slo por ma,IsculasPS b else i1(cadena RR cadena&toLo.erCase(-- a resultado WR P est 1ormada slo por minIsculasPS b else a resultado WR P est 1ormada por ma,Isculas , minIsculasPS b return resultadoS b alert(in1o(P#D!I R #8JE=# D#LJ$# L+scriptM L+)eadM Lbod,M L+bod,M L+)tmlM !# I$E!=IEICJ$#P--S alert(in1o(PEn un lugar de la manc)a&&&P--S
!!.!0. E0ercicio !0
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 2' " $eteccin de palndromosL+titleM Lscript t,peRPteCt+javascriptPM 1unction palindromo(cadena- a var resultado R PLa cadena ZPPWcadenaWPZP ZnPS // Rasar a minusculas la cadena var cadena#riginal R cadena&toLo.erCase(-S // Convertir la cadena en un arra! var letrasEspacios R cadena#riginal&split(PP-S // Eliminar los espacios en #lanco Keste paso es demasiado largo !a que no se utiliza la funcion "replace"L var cadenaSinEspacios R PPS 1or(i in letrasEspacios- a i1(letrasEspacios[i\ NR P P- a
cadenaSinEspacios WR letrasEspacios[i\S b b var letras R cadenaSinEspacios&split(PP-S var letras eves R cadenaSinEspacios&split(PP-&reverse(-S // Este paso tam#ien es mu! largo porque no se utiliza la sentencia "#reaH" var iguales R trueS 1or(i in letras- a i1(letras[i\ RR letras eves[i\- a // Aodo #ien b else a // Alguna letra es distinta) por lo que !a no es un palindromo iguales R 1alseS b b i1(iguales- a resultado WR P es un palndromoPS b else a resultado WR P no es un palndromoPS b return resultadoS b alert(palindromo(PLa ruta nos aporto otro paso naturalP--S alert(palindromo(PEsta 1rase no se parece a ningun palindromoP--S L+scriptM L+)eadM Lbod,M L+bod,M L+)tmlM
!!.!!. E0ercicio !!
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 22 " $#> bsicoL+titleM Lscript t,peRPteCt+javascriptPM .indo.&onload R 1unction(- a var in1o R document&getElement8,Id(Pin1ormacionP-S // ?umero de enlaces de la pagina var enlaces R document&getElements8,=ag!ame(PaP-S in1o&inner<=>L R P!umero de enlaces R PWenlaces&lengt)S
// ,ireccion del penultimo enlace var mensaje R PEl penultimo enlace apunta a* PWenlaces[enlaces&lengt)"7\&)re1S in1o&inner<=>L R in1o&inner<=>L W PLbr+MP W mensajeS // ?umero de enlaces que apuntan a -ttpC//prue#a var contador R 'S 1or(var iR'S iLenlaces&lengt)S iWW- a // Es necesario compro#ar los enlaces -ttpC//prue#a ! // -ttpC//prue#a/ por las diferencias entre navegadores i1(enlaces[i\&)re1 RR P)ttp*++pruebaP ^^ enlaces[i\&)re1 RR P)ttp*++prueba+P- a contadorWWS b b in1o&inner<=>L R in1o&inner<=>L W PLbr+MP W contador W P enlaces apuntan a )ttp*++pruebaP // ?umero de enlaces del tercer p%rrafo var parra1os R document&getElements8,=ag!ame(PpP-S enlaces R parra1os[7\&getElements8,=ag!ame(PaP-S in1o&inner<=>L R in1o&inner<=>L W PLbr+MP W P!umero de enlaces del tercer prra1o R PWenlaces&lengt)S b L+scriptM L+)eadM Lbod,M Ldiv idRPin1ormacionP st,leRPborder*t)in solid silverS padding*&6emPML+divM LpMLorem ipsum dolor sit amet0 La )re1RP)ttp*++pruebaPMconsectetuer adipiscing elitL+aM& Sed mattis enim vitae orci& P)asellus libero& >aecenas nisl arcu0 conse/uat congue0 commodo nec0 commodo ultricies0 turpis& 4uis/ue sapien nunc0 posuere vitae0 rutrum et0 luctus at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& !ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& La )re1RP)ttp*++prueba7PMEusce portaL+aM& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue& $onec lacus ne/ue0 ve)icula in0 elei1end vitae0 venenatis ac0 1elis& $onec arcu& !am sed tortor nec ipsum ali/uam ullamcorper& $uis accumsan metus eu urna& Jenean vitae enim& Integer lacus& Destibulum venenatis erat eu odio& Praesent id metus&L+pM LpMJenean at nisl& >aecenas egestas dapibus odio& Destibulum ante ipsum primis in 1aucibus orci luctus et ultrices posuere cubilia CuraeS Proin conse/uat auctor diam& La )re1RP)ttp*++pruebaPMHt bibendum blandit estL+aM& Curabitur vestibulum& !unc malesuada porttitor sapien& Jenean a lacus et metus venenatis porta& Suspendisse cursus0 sem non dapibus tincidunt0 lorem magna porttitor 1elis0 id sodales dolor dolor sed urna& Sed rutrum nulla vitae tellus& Sed /uis eros nec lectus tempor lacinia& Jli/uam nec lectus nec ne/ue ali/uet dictum& Etiam La )re1RP)ttp*++prueba%PMconse/uat sem /uis massaL+aM& $onec ali/uam euismod diam& In magna massa0 mattis id0 pellentes/ue sit amet0 porta sit amet0 lectus& Curabitur posuere& Jli/uam in elit& Eusce condimentum0 arcu in sceleris/ue lobortis0 ante arcu sceleris/ue mi0 at cursus mi risus sed tellus&L+pM LpM$onec sagittis0 nib) nec ullamcorper tristi/ue0 pede velit 1eugiat massa0 at sollicitudin justo tellus vitae justo& Destibulum ali/uet0 nulla sit amet imperdiet suscipit0 nunc erat laoreet est0 a La )re1RP)ttp*++pruebaPMali/uam leo odio sed semL+aM& 4uis/ue eget eros ve)icula diam euismod tristi/ue& Ht dui& $onec in metus sed
risus laoreet sollicitudin& Proin et nisi non arcu sodales )endrerit& In sem& Cras id augue eu lorem dictum interdum& $onec pretium& Proin La )re1RP)ttp*++prueba:PMegestasL+aM adipiscing ligula& $uis iaculis laoreet turpis& >auris mollis est sit amet diam& Curabitur )endrerit0 eros /uis malesuada tristi/ue0 ipsum odio euismod tortor0 a vestibulum nisl mi at odio& La )re1RP)ttp*++prueba6PMSed non lectus non est pellentes/ueL+aM auctor&L+pM L+bod,M L+)tmlM
!!.!2. E0ercicio !2
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 27 " $#> bsico , atributos ;<=>LL+titleM Lst,le t,peRPteCt+cssPM &oculto a displa,* noneS b &visible a displa,* inlineS b L+st,leM Lscript t,peRPteCt+javascriptPM 1unction muestra(- a var elemento R document&getElement8,Id(PadicionalP-S elemento&class!ame R PvisiblePS var enlace R document&getElement8,Id(PenlaceP-S enlace&class!ame R PocultoPS b L+scriptM L+)eadM Lbod,M Lp idRPteCtoPMLorem ipsum dolor sit amet0 consectetuer adipiscing elit& Sed mattis enim vitae orci& P)asellus libero& >aecenas nisl arcu0 conse/uat congue0 commodo nec0 commodo ultricies0 turpis& 4uis/ue sapien nunc0 posuere vitae0 rutrum et0 luctus at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& Lspan idRPadicionalP classRPocultoPM!ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue& $onec lacus ne/ue0 ve)icula in0 elei1end vitae0 venenatis ac0 1elis& $onec arcu& !am sed tortor nec ipsum ali/uam ullamcorper& $uis accumsan metus eu urna& Jenean vitae enim& Integer lacus& Destibulum venenatis erat eu odio& Praesent id metus&L+spanML+pM La idRPenlaceP )re1RPfP onclicGRPmuestra(-S return 1alseSPMSeguir le,endoL+aM L+bod,M L+)tmlM
!!.!#. E0ercicio !#
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 2% " $#> bsico , atributos ;<=>LL+titleM Lscript t,peRPteCt+javascriptPM 1unction anade(- a var elemento R document&createElement(PliP-S var teCto R document&create=eCt!ode(PElemento de pruebaP-S elemento&appendC)ild(teCto-S var lista R document&getElement8,Id(PlistaP-S lista&appendC)ild(elemento-S var nuevoElemento R PLliM=eCto de pruebaL+liMPS lista&inner<=>L R lista&inner<=>L W nuevoElementoS b L+scriptM L+)eadM Lbod,M Lul idRPlistaPM LliMLorem ipsum dolor sit ametL+liM LliMConsectetuer adipiscing elitL+liM LliMSed mattis enim vitae orciL+liM LliMP)asellus liberoL+liM LliM>aecenas nisl arcuL+liM L+ulM Linput t,peRPbuttonP valueRPJKadir elementoP onclicGRPanade(-SPM L+bod,M L+)tmlM
var enlace R document&getElement8,Id(TenlaceXTWid-S i1(elemento&st,le&displa, RR PP ^^ elemento&st,le&displa, RR PblocGP- a elemento&st,le&displa, R PnonePS enlace&inner<=>L R T>ostrar contenidosTS b else a elemento&st,le&displa, R PblocGPS enlace&inner<=>L R T#cultar contenidosTS b b L+scriptM L+)eadM Lbod,M Lp idRPcontenidosX2PM[2\ Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& Sed mattis enim vitae orci& P)asellus libero& >aecenas nisl arcu0 conse/uat congue0 commodo nec0 commodo ultricies0 turpis& 4uis/ue sapien nunc0 posuere vitae0 rutrum et0 luctus at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& !ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue&L+pM La idRPenlaceX2P )re1RPfP onclicGRPmuestra#culta(T2T-S return 1alseSPM#cultar contenidosL+aM Lbr+M Lp idRPcontenidosX7PM[7\ Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& Sed mattis enim vitae orci& P)asellus libero& >aecenas nisl arcu0 conse/uat congue0 commodo nec0 commodo ultricies0 turpis& 4uis/ue sapien nunc0 posuere vitae0 rutrum et0 luctus at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& !ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue&L+pM La idRPenlaceX7P )re1RPfP onclicGRPmuestra#culta(T7T-S return 1alseSPM#cultar contenidosL+aM Lbr+M Lp idRPcontenidosX%PM[%\ Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& Sed mattis enim vitae orci& P)asellus libero& >aecenas nisl arcu0 conse/uat congue0 commodo nec0 commodo ultricies0 turpis& 4uis/ue sapien nunc0 posuere vitae0 rutrum et0 luctus at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& !ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue&L+pM La idRPenlaceX%P )re1RPfP onclicGRPmuestra#culta(T%T-S return 1alseSPM#cultar contenidosL+aM L+bod,M L+)tmlM
at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& !ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue&L+pM La idRPenlaceX7P )re1RPfPM#cultar contenidosL+aM Lbr+M Lp idRPcontenidosX%PM[%\ Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& Sed mattis enim vitae orci& P)asellus libero& >aecenas nisl arcu0 conse/uat congue0 commodo nec0 commodo ultricies0 turpis& 4uis/ue sapien nunc0 posuere vitae0 rutrum et0 luctus at0 pede& Pellentes/ue massa ante0 ornare id0 ali/uam vitae0 ultrices porttitor0 pede& !ullam sit amet nisl elementum elit convallis malesuada& P)asellus magna sem0 semper /uis0 1aucibus ut0 r)oncus non0 mi& $uis pellentes/ue0 1elis eu adipiscing ullamcorper0 odio urna conse/uat arcu0 at posuere ante /uam non dolor& Lorem ipsum dolor sit amet0 consectetuer adipiscing elit& $uis sceleris/ue&L+pM La idRPenlaceX%P )re1RPfPM#cultar contenidosL+aM L+bod,M L+)tmlM
!!.!5. E0ercicio !5
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 26 " In1ormacin sobre eventosL+titleM Lst,le t,peRPteCt+cssPM bod, a1ont"1amil,* arial0 )elveticaSb fin1o a.idt)*29'pCS border*t)in solid silverS padding*&6emS position*1iCedSb fin1o )2 amargin* 'Sb L+st,leM Lscript t,peRPteCt+javascriptPM 1unction in1ormacion(elEvento- a var evento R elEvento ^^ .indo.&eventS s.itc)(evento&t,pe- a case TmousemoveT* document&getElement8,Id(Tin1oT-&st,le&bacGgroundColor R TfEEEEEETS var ie R navigator&userJgent&toLo.erCase(-&indeC#1(TmsieT-NR"2S var coordenada;relativa0 coordenadaOrelativa0 coordenada;absoluta0 coordenadaOabsolutaS i1(ie- a i1(document&documentElement ]] document&documentElement&scroll=op-a coordenada;absoluta R evento&client; W document&documentElement&scrollLe1tS coordenadaOabsoluta R evento&clientO W document&documentElement&scroll=opS b else a coordenada;absoluta R evento&client; W document&bod,&scrollLe1tS coordenadaOabsoluta R evento&clientO W document&bod,&scroll=opS bb
else a coordenada;absoluta R evento&page;S coordenadaOabsoluta R evento&pageOS b coordenada;relativa R evento&client;S coordenadaOrelativa R evento&clientOS muestraIn1ormacion([T atnT0 T!avegador [TWcoordenada;relativaWT0 TWcoordenadaOrelativaWT\T0 TPagina [TWcoordenada;absolutaWT0 TWcoordenadaOabsolutaWT\T\-S breaGS case TGe,pressT* document&getElement8,Id(Tin1oT-&st,le&bacGgroundColor R TfCCE9EETS var caracter R evento&c)arCode ^^ evento&Ge,CodeS var letra R String&1romC)arCode(caracter-S var codigo R letra&c)arCodeJt('-S muestraIn1ormacion([T=ecladoT0 TCarcter [TWletraWT\T0 TCdigo [TWcodigoWT\T\-S breaGS case TclicGT* document&getElement8,Id(Tin1oT-&st,le&bacGgroundColor R TfEEEECCTS breaGS bb 1unction muestraIn1ormacion(mensaje- a document&getElement8,Id(Pin1oP-&inner<=>L R TL)2MTWmensaje['\WTL+)2MTS 1or(var iR2S iLmensaje&lengt)S iWW- a document&getElement8,Id(Pin1oP-&inner<=>L WR TLpMTWmensaje[i\WTL+pMTS b b document&onmousemove R in1ormacionS document&onGe,press R in1ormacionS document&onclicG R in1ormacionS L+scriptM L+)eadM Lbod,M Ldiv idRPin1oPML+divM Lbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+ M Lbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+ M Lbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+ M L+bod,M L+)tmlM
Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 29 " In1ormacin sobre eventosL+titleM Lst,le t,peRPteCt+cssPM bod, a1ont"1amil,* arial0 )elveticaSb fin1o a.idt)*29'pCS border*t)in solid silverS padding*&6emS position*1iCedSb fin1o )2 amargin* 'Sb L+st,leM Lscript t,peRPteCt+javascriptPM 1unction in1ormacion(elEvento- a var evento R elEvento ^^ .indo.&eventS var coordenada; R evento&client;S var coordenadaO R evento&clientOS var dimensiones R tamanoDentana!avegador(-S var tamano; R dimensiones['\S var tamanoO R dimensiones[2\S var posicion<orizontal R PPS var posicionDertical R PPS i1(coordenada; M tamano;+7- a posicion<orizontal R Pderec)aPS b else a posicion<orizontal R Piz/uierdaPS b i1(coordenadaO M tamanoO+7- a posicionDertical R PabajoPS b else a posicionDertical R ParribaPS b muestraIn1ormacion([TPosicionT0 posicion<orizontal0 posicionDertical\-S b 1unction muestraIn1ormacion(mensaje- a document&getElement8,Id(Pin1oP-&inner<=>L R TL)2MTWmensaje['\WTL+)2MTS 1or(var iR2S iLmensaje&lengt)S iWW- a document&getElement8,Id(Pin1oP-&inner<=>L WR TLpMTWmensaje[i\WTL+pMTS b b 1unction tamanoDentana!avegador(-a // Adaptada de -ttpC//DDD9-oDtocreate9co9uH/tutorials/javascript/#roDserDindoD var dimensiones R [\S i1(t,peo1(.indo.&innerQidt)- RR TnumberT- a // ?o es @E dimensiones R [.indo.&innerQidt)0 .indo.&inner<eig)t\S b else i1(document&documentElement ]] (document&documentElement&clientQidt) ^^
document&documentElement&client<eig)t-- a //@E 0 en modo estandar Kno quirHsL dimensiones R [document&documentElement&clientQidt)0 document&documentElement&client<eig)t\S b else i1(document&bod, ]] (document&bod,&clientQidt) ^^ document&bod,&client<eig)t-- a //@E en modo quirHs dimensiones R [document&bod,&clientQidt)0 document&bod,&client<eig)t\S b return dimensionesS b document&onclicG R in1ormacionS L+scriptM L+)eadM Lbod,M Ldiv idRPin1oPML+divM Lbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+ M Lbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+ M Lbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+MLbr+ M L+bod,M L+)tmlM
!!.!,. E0ercicio !,
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 2B " Limitar nImero de caracteres en teCtareaL+titleM Lst,le t,peRPteCt+cssPM bod, a1ont"1amil,* arial0 )elveticaSb L+st,leM Lscript t,peRPteCt+javascriptPM 1unction limita(elEvento0 maCimoCaracteres- a var elemento R document&getElement8,Id(PteCtoP-S // ;#tener la tecla pulsada var evento R elEvento ^^ .indo.&eventS var codigoCaracter R evento&c)arCode ^^ evento&Ge,CodeS // Rermitir utilizar las teclas con flec-a -orizontal i1(codigoCaracter RR %B ^^ codigoCaracter RR %Aa return trueS b // Rermitir #orrar con la tecla IacHspace ! con la tecla Supr9
i1(codigoCaracter RR ? ^^ codigoCaracter RR :9- a return trueS b else i1(elemento&value&lengt) MR maCimoCaracteres - a return 1alseS b else a return trueS b b 1unction actualizaIn1o(maCimoCaracteres- a var elemento R document&getElement8,Id(PteCtoP-S var in1o R document&getElement8,Id(Pin1oP-S i1(elemento&value&lengt) MR maCimoCaracteres - a in1o&inner<=>L R P>Cimo PWmaCimoCaracteresWP caracteresPS b else a in1o&inner<=>L R PPuedes escribir )asta PW(maCimoCaracteres" elemento&value&lengt)-WP caracteres adicionalesPS b b L+scriptM L+)eadM Lbod,M Ldiv idRPin1oPM>Cimo 2'' caracteresL+divM LteCtarea idRPteCtoP onGe,pressRPreturn limita(event0 2''-SP onGe,upRPactualizaIn1o(2''-P ro.sRP9P colsRP%'PML+teCtareaM L+bod,M L+)tmlM
!!.!(. E0ercicio !(
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 2? " Htilidades0 CalendarioL+titleM LlinG relRPst,les)eetP t,peRPteCt+cssP mediaRPallP )re1RPcss+calendar"estilo&cssP +M Lscript t,peRPteCt+javascriptP srcRPjs+calendar&jsPML+scriptM Lscript t,peRPteCt+javascriptP srcRPjs+calendar"es&jsPML+scriptM Lscript t,peRPteCt+javascriptP srcRPjs+calendar" setup&jsPML+scriptM L+)eadM Lbod,M
LpML+pM Linput t,peRP)iddenP nameRP1ec)aP idRP1ec)aP +M Lspan st,leRPbacGground"color* f11cS cursor*de1aultS padding*&%emS border*t)in solid f11'S teCt"decoration*underlineS color* blueSP onmouseoverRPt)is&st,le&cursorRTpointerTS t)is&st,le&cursorRT)andTS t)is&st,le&bacGgroundColorRTf11?TS t)is&st,le&teCt$ecorationRTnoneTSP onmouseoutRPt)is&st,le&bacGgroundColorRTf11cTS t)is&st,le&teCt$ecorationRTunderlineTSP idRP1ec)aXusuarioPM Pinc)a a/u para seleccionar la 1ec)a L+spanM
Lscript t,peRPteCt+javascriptPM Calendar&setup(a inputEield* P1ec)aP0 i1Eormat* P`d+`m+ `OP0 .eeG!umbers* 1alse0 displa,Jrea* P1ec)aXusuarioP0 daEormat* P`J0 `d de `8 de `OP b-S L+scriptM L+bod,M L+)tmlM
!!.!9. E0ercicio !9
LN$#C=OPE )tml PH8LIC P"++Q%C++$=$ ;<=>L 2&' =ransitional++E!P P)ttp*++...&.%&org+= + C)tml2+$=$+C)tml2" transitional&dtdPM L)tml CmlnsRP)ttp*++...&.%&org+2AAA+C)tmlPM L)eadM Lmeta )ttp"e/uivRPContent"=,peP contentRPteCt+)tmlS c)arsetRiso"??6A"2P +M LtitleMEjercicio 2A " Htilidades0 =ooltipL+titleM Lscript t,peRPteCt+javascriptP srcRPjs+overlib&jsPMLN"" overLI8 (c- EriG 8osrup ""ML+scriptM Lscript t,peRPteCt+javascriptPM overlibXpagede1aults(QI$=<026'0E@C#L# 0Tf1111ccT08@C#L# 0Tf999999T0=E;=E#!=0PJrial0 <elvetica0 DerdanaP0=E;=SIcE0P&?emP0$ELJO076'0#EESE=;0260J8#DE-S L+scriptM L+)eadM Lbod,M LpMLorem ipsum dolor sit amet0 La )re1RPfP onmouseoverRPreturn overlib(TPrueba de un tooltip bsico , mu, sencillo&T-SP onmouseoutRPreturn nd(-SPMconsectetuer adipiscing elitL+aM& Etiam eget metus& Proin varius auctor tortor& Cras augue ne/ue0 porta vitae0 vestibulum nec0 pulvinar id0 nib)& Eusce in arcu& $uis ve)icula nonumm, orci&L+pM LpM4uis/ue 1acilisis0 lacus vel adipiscing tempor0 ne/ue /uam tincidunt ante0 sed bibendum velit urna /uis ipsum& Jli/uam convallis justo at turpis& Sed iaculis dictum ne/ue& Praesent varius augue /uis ligula& Suspendisse potenti&L+pM LpMPellentes/ue )abitant morbi tristi/ue senectus et netus et malesuada 1ames ac turpis egestas& $uis non nunc at augue ultrices viverra& Pellentes/ue tempus& $uis nisi ipsum0
condimentum vel0 accumsan non0 sodales )endrerit0 nisi& Jenean vel velit& Proin at massa&L+pM L+bod,M L+)tmlM
lllmn mn
mn
&& &"#$%&
! !
& "#$%
& ! "#$%"#$% &' (& ' (& )&& )& )& &
*+ *"#$%, *+ *&- *- *)+ *.+& **+ &%/ *0(& & *1 - *$&%/2 * *+& &3-34 *& & *- *) %- *.- 0 !5 & 0
0 &