Manual de JavaScript01
Manual de JavaScript01
1.Introducción
1.El Lenguaje JavaScript
2.JavaScript y Java
2.Scripts en en Blowser
1.Usando JavaScript en HTML
2.Scripts y Manejo de Eventos
3.Ideas y Técnicas
6.Expresiones y Operadores
1.Expresiones
2.Operadores
3.Precedencia
7.Modelo de Objetos
1.Introducción
2.Objetos y Propiedades
3.Funciones y Métodos
4.Creando Nuevos Objetos
9.Resumen de Sentencias
1.Sent. Condicional
2.Sent. Iterativas
3.Sent. de Manipulación de Objetos
4.Comentarios
El Lenguaje JavaScript
En una aplicación cliente para un browser, las sentencias JavaScript embedidas en un documento HTML
pueden reconocer y responder a eventos generados
por el usuario, como clicks del mouse, información en formularios y navegación de documento a documento.
Por ejemplo, se puede escrubir una función JavaScript que verifique que la información ingresada por el
usuario sea correcta. Sin que haya transmisión de
main por la red, un documento HTML com JavaScript embedido es capaz de interpretar la información
ingresada por el usuario, verificar que sea correcta y alertar
al usuario en caso que no lo sea. Se puede también ejecutar archivos de audio, applet's o comunicar con una
extensión de Netscape (plug-in's) en respuesta a la
apertura o cierre de una página.
JavaScript y Java
El lenguaje JavaScript imita a Java, pero sin verificación estática de tipos ni
restricciones fuertes en tiempo de ejecución. JavaScript soporta la mayoría de las
expresiones y sintaxis válidas en Java, así como las sentencias de control de flujo de
Java. En contraste con el sistema de classes definidas en tiempo de compilación en
Java, Javascript trabaja en base a un simple sistema en tiempo de ejecución, el cual
permite el uso de tipos de main básicos como enteros, números de punto flotante,
booleanos y strings. JavaScript soport un sistema simple de objetos basado en instancias
(no en clases), que provee capacidades significativas.
Además, JavaScript soporta funciones, pero de nuevo sin ningún requerimiento especial
al declararlas. Estas funciones pueden ser propiedades de objetos (aunque el usuario no
puede definir clases), y se ejecutan como métodos bastante flexibles debido a que no se
verifican los tipos.
JavaScript complementa a Java al exponer muchas características de las applets en Java
a los autores de HTML. JavaScript puede además obtener y establecer propiedades de
las applets, esto es, sólo aquellas que alteran el estado de la applet o plug-in.
Java es un lenguaje de extensión diseñado, en particular, para ejecución rápida y
seguridad de tipos, l que se ve reflejada en la imposibilidad de transformar un entero en
una referencia, por ejemplo.
Los programas en Java consisten exclusívamente de clases y sus métodos, lo que, junto
a los requerimientos de declaraciones de clases, métodos y tipos hacen que la
programación sea más compleja que en JavaScript. Otro punto imortante es que la
herencia que provee Java crea jerarquías muy acopladas de objetos.
En contraste, JavaScript posee el espíritu de un lenguaje pequeño y verificado
dinámicamente. Estos lenguajes ofrecen herramientas de programación a una audiencia
mayor, ya que son más fáciles de utilizar, y proveen de una interface más especializada.
Como consecuecia, necesitan sólo de un mínimo de requerimientos para creación de
objetos.
La siguiente tabla compara y contrasta JavaScript con Java:
JavaScript Java
Compilado en el Servidor antes de ejecución en el
Interpretado en el Cliente.
Cliente.
Basado en Objetos. El código usa objetos incorporados Orientado a Objetos. El código consiste de clases con
del sistema, pero no provee creación de clases o herencia. herencia, permitiendo crear objetos y crear jerarquías.
Código embedido en HTML. Applets referenciadas desde HTML.
Variables y tipos de main no se declaran. Variables y tipos de main se declaran.
Enlazado dinámico. Referencias a objetos se validan en Enlazado estático. Referencias a objetos se validan en
tiempo de ejecución. tiempo de compilación.
<SCRIPT LANGUAGE="JavaScript">
sentencias;
...
</SCRIPT>
<HTML><HEAD>
</HEAD><BODY>
<SCRIPT LANGUAGE="JavaScript">
document.write("Hola mundo!!");
</SCRIPT>
</BODY></HTML>
Se despliega como:
Hola mundo!!
Escondiendo el Código JavaScript
Cuando un usuario utiliza un browser que no entiente scripts, éste despliega todo el
texto que aparece entre los elementos < SCRIPT > y < /SCRIPT >. Para evitar lo
anterior se debe ocultar el códico JavaScript de la siguiente manera:
<SCRIPT LANGUAGE="JavaScript"><!--
sentencias;
...
// --></SCRIPT>
<script language="JavaScript">
function cuadrado(i)
{ document.write("Se pasó el valor: ",i,"<br>");
return i * i;
}
</script>
Se pasó el valor: 5
The función retornó: 25
function barra()
{
document.write("<HR ALIGN='left' WIDTH=25%>")
}
function texto(titulo,nivel,text)
{
document.write("<H" + nivel + ">" + titulo
+ "</H" + nivel + ">");
document.write(text);
}
// --></SCRIPT>
</HEAD><BODY>
<SCRIPT><!--
// -->
</SCRIPT>
</BODY></HTML>
Hazme Grande
Hazme común
Hazme Grande
Hazme común
<FORM>
<INPUT TYPE="button" VALUE="Aprétame";
onClick="alert('Un mensaje cualquiera')">
</FORM>
Se despliega como
<ELEMENTO manejadorDeEvento="Código_JavaScript">
Hace más modular el código, pudiendo usarse la misma función para manejar
varios posibles eventos; y
Muchos objetos poseen además métodos para simular eventos, Por ejemplo, los botones
poseen un método click() que imita el evento de hacer click sobre el botón. Note: La
emulación de eventos no ejecuta a los manejadores de eventos. Aún así, siempre es
posible llamar directamente un manejador de evento de manera explícita.
Evento Ocurre cuando... Manejador
load Se carga la página en el browser. onLoad
unload Se descarga la Página del browser. onUnload
click El usuario hace click sobre un elemento. onClick
mouseover El usuario mueve el mouse por sobre una referencia. onMouseOver
mouseout El usuario mueve el mouse fuera de una referencia. onMouseOut
focus El usuario enta a un campo de un formulario. onFocus
blur El usuario sale de un campo de un formulario. onBlur
change El usuario cambia el valos de un campo de texto, área de texto o selección. onChange
select El usuario selecciona un elementp de un campo de selección onSelect
submit El usuario envía un formulario. onSubmit
<HTML><HEAD>
<SCRIPT LANGUAGE="JavaScript">
function computar(f)
{
if( confirm("Seguro?") )
f.result.value = eval(f.expr.value)
else
alert("Vuelve otra vez.")
}
</SCRIPT>
</HEAD><BODY>
<FORM>
Ingrese una expresión:
<INPUT TYPE="text" NAME="expr" SIZE=15>
<INPUT TYPE="button" VALUE="Calcular"
ONCLICK="computar(this.form)">
<BR>
Resultado:
<INPUT TYPE="text" NAME="result" SIZE=15 >
</FORM>
</BODY></HTML>
Que se despliega como:
Ideas y Técnicas
Esta sección describe varias técnica útiles para programar en JavaScript.
Actualizando Páginas
JavaScript genera los resultados visiales desde arriba hacia abajo en una página, de
manera que luego de desplegar algo, no se puede modificar más. La única manera de
hacerlo es volver a cargar la página completa. Sin embargo, si se puede modificar otro
frame desde un documento.
Otra manera de modificar un documento sin cargarlo es el cambiar una imágen
desplegada por otra diferente, produciéndose un cambio inmediato en el despliegue.
Imprimiendo
No se puede imprimir la salida generada por una sentencia JavaScript. Por ejemplo, si
se tiene lo siguiente en una página, no se imprime nada:
<SCRIPT>
document.write("Texto generado con JavaScript")
</SCRIPT>
<FORM NAME="ff">
<INPUT TYPE="button" NAME="Boton1" VALUE="Abrete!"
onClick="window.open('stmtsov.html','ventana',
'toolbar=no,directories=no')">
</FORM>
Creando Arreglos
Un arreglo es una lista ordenada de valores que se pueden referenciar a través del
nombre del arreglo y un índice de posición. Por ejemplo, si se tiene un arreglo de
empleados que contiene sus nombres, entonces emp[1] sería el nombre del primer
empleado, emp[2] el del segundo, etc.
JavaScript no posee arreglos, pero debido al parecido entre arreglos y objetos, es fácil
crear arreglos en JavaScript. Para crear un arreglo se deben utilizar la funciones:
Inicialización con Valores Iniciales:
function initArrayValues()
{ this.length = initArrayValues.arguments.length;
for( var i=0; i<this.length; i++ )
this[i+1] = initArrayValues.arguments[i];
}
function initArrayCount(count,initValue)
{ this.length = count;
for( var i=0; i<this.length; i++ )
this[i+1] = initValue;
}
Estas funciones definen un arrego de manera que el primer elemento, indexado por un
cero, contiene el largo del arreglo. Los demás elementos contienen los valores pasados
a la primera función o el valor inicial pasado a la segunda.
Se puede crear un arreglo arbitrario de la siguiente manera:
Para usar los elementos de un arreglo se pueden referenciar sus elementos de manera
directa usando la notación:
nb_arreglo[ índice ]
Note que los elementos de un areglo pueden ser cualquier objeto, incluso diferentes
entre sí.
Usando los Objetos del Browser
Cuando se carga una página en el browser, se crea un número de objetos dependiendo
del contenido de la página. Toda página posee los siguientes objetos:
window: es el objeto padre de todas los que contiene la página. Contiene las
propiedades de la ventana. También se crea un objeto de este tipo por cada
frame creado;
history: contiene las propiedades que representan a las URL que el usuario ha
visitado anteriormente.
<HTML><HEAD>
<TITLE>Un Documento Simple</TITLE>
</HEAD><BODY>
<FORM NAME=ff" ACTION="Proc()" METHOD="get" >
Ingrese un Valor:
<INPUT TYPE=text NAME="text1"
VALUE="blabla" SIZE=20 >
Elija si lo desea:
<INPUT TYPE="checkbox" NAME="Check1"
CHECKED onClick="update(this.form)">
Opción #1
</FORM>
</BODY></HTML>
Como siempre, existirán los objetos window, location, history, y document, los
que tendrán propiedades como:
location.href = "http://www.terrapin.com/samples/simple.html"
document.fgColor = #000000
document.bgColor = #ffffff
history.length = 7
Estos son sólo algunos ejemplo, ya que en la práctica los valores dependen de muchas
variables.
Además, se crean objetos basados en el contenido del documento, como serín por
ejemplo:
document.ff
document.ff.Check1
document.ff.Button1
Los cuales tendrín propiedades como:
document.ff.action = http://terrapin/mocha/formproc()
document.ff.method = get
document.ff.length = 5
document.ff.Button1.value = Press Me
document.ff.Button1.name = Button1
document.ff.text1.value = blahblah
document.ff.text1.name = text1
document.ff.Check1.defaultChecked = true
document.ff.Check1.value = on
document.ff.Check1.name = Check1
Note que cada propiedad referenciada comienza con el elemento comienza con el objeto
document, seguido por el nombre del forumario, ff, y luego el nombre de la propiedad.
Esta secuencia muestra la jerarquía de objetos que genera el browser, que se discute en
el siguiente capítulo.
Jerarquía de Objetos del Browser
Los objetos en el browser existen en una jerarquía, la cual refleja la estructura
jerárquica de los documentos HTML. A pesar que no se pueden derivar objetos desde
estos objetos en JavaScript, es útil entender la jerarquía de objetos. En terminología
orientada al objeto, esta jerarquía es puramente de instancias, no de clases, ya que
consiste de objetos en particular.
En esta jerarquía, los objetos hijos son propiedades de sus padres. Por ejemplo, un
formulario con nombre "formulario1" es un objeto, y es hijo de un documento (que
también es objeto), de manera que para referenciar el formulario se debe escribir
"document.formulario1".
Para referenciar una propiedad específica de un objeto se debe incluir el objeto y todos
sus ancestros. Excepción: cuando no se usan frames no se necesita incluir el objeto
window.
<FORM NAME="ff">
<input type="text" name="nombre" size=20>
<input type="text" name="edad" size=3>
</FORM>
Entonces se puede referenciar los elementos del formulario a través de los objetos
document.ff.nombre y document.ff.edad, pero estas referencias sólo se pueden
haces después que el formulario esté definido. Así, no se pueden usar estos objetos
antes que se defina el formulario. Por ejemplo, la script:
<SCRIPT>
document.write(document.ff.nombre.value);
document.write(document.ff.edad.value);
</SCRIPT>
Este formulario define un elemento llamado ff, el cual posee una propiedad
dorrespondiente al campo de texto creado, cuyo valor se referencia usando:
document.ff.cantidad.value
document.forms[0].quantity.value
El objeto window tiene propiedades para cada frame y set de frames (definidos con los
elementos < FRAME > y < FRAMESET > respectivamente). Los frames se almacenan
en un arreglo llamado frames, el cual contiene una entrada por cada frame hijo de una
ventana.
La propiedad status del objeto window permite establecer el mensaje desplegado en la
barra de estado de una ventana.
Abriendo y Cerrando Ventanas
Cada vez que se abre un browser, se crea automáticamente una ventana. El usuario
puede abrir y cerrar ventanas a gusto con la mayoría de los browsers. Con JavaScript, se
pueden abrir y cerrar desde una script.
ventana_msg=window.open("ejemplo.html","ejemplo");
Las ventanas pueden tener dos nombres: el primero sirve para referenciar sus
propiedades, métodos y contenido, y el segundo (optativo) permite referenciarla como
destino de un formulario o referencia de hipertexto.
Cuando se abre una ventana se pueden especificar atributos como su alto, ancho, si
tiene o no un menú, barra de herramientas, etc. El siguente ejemplo crea una ventana sin
barra de herramientas y con barras de desplazamiento:
ventana_msg=window.open("ejemplo.html","ejemplo",
"toolbar=no,scrollbars=yes")
Para más detalles acerca de los atributos vea la referencia acerca del método open().
window.close();
self.close();
close(); // no usar en un manejador de evento!!
venatana_msg.close()
Usando Frames
Un frame es un tipo especial de ventana que puede desplegar múltiples documentos a la
vez en una misma ventana. Una serie de frames componen una ventana. El siguiente
diagrama muestra una ventana con tres frames:
<align="center"contenido
lista
Creando Frames
Los frames sólo se pueden crear usando el elemento < FRAMESET > de HTML, el cual
define los tamaños y propiedades de cada frame de una página. Por ejemplo, para crear
los frames del diagrama se debe usar:
<FRAMESET ROWS="70%,30%">
<FRAMESET COLS="30%,70%">
<FRAME SRC=lista.html NAME="lista">
<FRAME SRC=contenido.html NAME="contenido">
</FRAMESET>
<FRAME SRC=barra.html NAME="barra">
</FRAMESET>
El siguiente diagrama muestra la jerarquía de los frames del ejemplo. Los tres frames
tienen el mismo padre, a pesar que los dos primeros se crearon dentro de un <
FRAMESET > separado. Esto es debido a que el padre de un frame es la ventana y no
un < FRAMESET >
lista
top contenido
barra
Cambiando Frames
Se puede cambiar el contenido de los frames usando la propirdad location para
establecer una nueva URL a desplegar en él, para lo que se debe especificar siempre la
jerarquía completa de frames.
<FORM>
<INPUT TYPE="button" VALUE="Abrir Ventana"
onClick="msgWindow=window.open('','ventana2',
'resizable=no,width=200,height=200')">
<br>
<A HREF="http://www.ing.udec.cl" TARGET="ventana2">
Cargar documento en <code>ventana2</code>
</A>
<INPUT TYPE="button" VALUE="Cerrar Ventana"
onClick="msgWindow.close()">
</FORM>
Valores
JavaScript reconoce los siguientes tipos de valores:
Números, como 42 o 3.14159;
Lógicos (booleanos), como true o false>;
Strings, como "Hola";
null, un valor especial que denota el valor nulo.
Este conjunto relativamente pequeño de tipos de main permite crear funciones y
aplicaciones muy útiles. note que no hay diferencia explícita entre números enteros o
reales. No hay un tipo de main para fechas, pero existen métodos que manejan fechas
de buena manera.
Objetos y funciones son otros elementos fundamentales del lenguaje. Los objetos son
contenedores con nombre para manter valores en ellos, y las funciones son procesos que
la aplicación puede utilizar.
son equivalentes a:
Variables
Las variables se usan para contener valores. las variables se definen con un nombre,
pero no es necesario especificar un tipo de dato asociado. Los nombres deben satisfacer:
Visibilidad de Variables
La visibilidad de una variable es dónde puede ser usada. En JavaScript sólo hay dos
niveles de visibilidad:
var total = 0;
function foo()
{ var i=4;
}
Literales
Los literales son la forma en que se representan valores en JavaScript. Son valores fijos
que se escriben directamente en el código JavaScript. Ejemplos de literales son:
42
3.14159
"Ser o no Ser."
Enteros
Los enteros pueden ser expresados en base decimal, hexadenimal u octal. Ejemplos son:
34.0
23.232
+32.4
-232.0
432.3e32
43.433e+2
-34.34e-2
Literales Booleanos
Los literaler booleanos se representan como true o false.
Literales de Strings
Los literales de strings se representan encerrando el strin en comillas simples o dobles.
Ejemplos:
"Hola"
'Como estás?'
Caracteres Especiales
Se pueden utilizar los siguientes caracteres especiales dentro de un literal de string en
JavaScript:
\b: backspace;
\t: tabulador.
Escape de Caracteres
Es posibler usar comillas dentro de un literal de string, lo que se hace como sigue, por
ejemplo:
Expresiones
Una expresión es cualquier conjunto válido de literales, operadores y expresiones que
se evalú dando un solo valor, que pudiera ser un número, string o booleano.
Conceptualmente existen dos tipos de expresiones: las que asignan valores a variables y
las que simplemente tienen un valor. Por ejemplo:
x = 7
3 + 4 * 5
Expresiones Condicionales
JavaScript soporta expresiones condicionales como las de C++ y Java. La sintaxis es:
Operadores
JavaScript Soporta los siguientes operadores:
Tipo Operador Uso Significado
+= x += y x = x + y
-= x -= y x = x - y
*= x *= y x = x * y
/= x /= y x = x / y
%= x %= y x = x % y
Asignación <<= x <= y x = x << y
>>= x <= y x = x >> y
>>>= x >>>= y x = x >>> y
&= x &= y x = x & y
^= x ^= y x = x ^ y
|= x |= y x = x | y
+ x + y Suma
- x - y Resta
* x * y Multiplicación
/ x / y División
Aritméticos
%= x % y Módulo
++ ++x , x++ Preincremento, Posincremento
-- --x , x-- Predecremento, Posdecremento
- -x negación
Manipulación de Bits & x & y AND de Bits
| x | y OR de Bits
^ x ^ y XOR de Bits
>> x >> y Shift a la Derecha
<< x << y Shift a la Izquierda
>>> x >>> y Shift a la Derecha sin Signo
&& x && y AND Lógico
Lógicos || x || y OR Lógico
! !x NOT Lógico
== x == y Equivalencia
!= x != y Distinto de
< x < y Menor que
Comparación
<= x <= y Menor o Igual que
> x > y Mayor que
>= x >= y Mayor o Igual que
Precedencia de Operadores
La precedencia de operadores determina el orden en que son evaluados. Se puede
determinar un orden forzado mediante el uso de paréntesis. Cuando se tienen dos
operadores de igual precedencia, se evalúa primero el de más a la izquierda.
El orden de precedencia, desde el que se eval&uacu;tea primero hasta el último en
evaluarse, es el siguiente:
Tipo Operador
()
Llamada a Función / Miembro
[]
!
~
Negación / Incremento -
++
--
*
Multiplicación y División /
%
+
Adición y Substracción
-
<
<=
Comparación Relacional
>
>=
<<
Shift de Bits >>
>>>
==
Comparación Igualdad
!=
|
^
de Bits
&
||
Lógicos
&&
Condicional ? :
=
+=
-=
*=
/=
%=
Asignación
<<=
>>=
>>>=
&=
^=
|=
Coma ,
Modelo de Objetos
JavaScript está basado en un paradigma simple de objetos, los cuales poseen
propiedades y métodos:
Programación con Objetos Programación Tradicional
Objetos --
Propiedades Variables
Métodos Funciones
Además de los objetos que predefinidos del browser, se pueden definir nuvos objetos de
los tipos proveidos por JavaScript (números, strings, imágenes y arreglos).
Objetos y Propiedades
Un objeto en JavaScript tiene propiedades asociadas a él. Se puede acceder a las
propiedades de un objeto con una notación muy simple:
nb_objeto.nb_propiedad
miAuto.marca = "Suzuki";
miAuto.modelo = "Vitara";
miAuto.ano = 89;
miAuto["marca"] = "Suzuki";
miAuto["modelo"] = "Vitara";
miAuto["ano"] = 89;
Este tipo de arreglos se dice arreglo asociativo, ya que cada elemento de arreglo está
también asociado a un nombre. Para mostrar cómo trabaja, la siguiente función
despliega las propiedades de un objeto cuando se le pasa un objeto y su nombre como
parámetros.
miAuto.marca = Suzuki;
miAuto.modelo = Vitara;
miAuto.ano = 89;
myCar[0] = Suzuki;
myCar[1] = Vitara;
myCar[2] = 89;
Funciones y Métodos
La sfunciones son os bloques de construción fundamentales de JavaScript. Una función
es un conjunto de sentencias JavaScript que realizan alguna función específica.
La definición de una función consiste de:
El nombre de la función;
<script language="JavaScript"><!--
function hola()
{
document.write("Hola.");
}
// --></script>
</head><body>
<script language="JavaScript"><!--
hola();
// --></script>
</body></html>
nb_función.arguments[i]
Funciones Recursivas
Una función puede ser recursiva, esto es, se puede lalmar a sí misma. Por ejemplo:
function factorial(n)
{
if( (n==0) || (n==1) )
return 1;
else
return (n*factorial(n-1));
}
<script><!--
function lista(tipo)
{
document.write("<"+tipo+"L>");
for( var i=1; i<lista.arguments.length; i++ )
document.write("<LI>"+lista.arguments[i]);
document.write("</" + tipo + "L>");
}
lista("O","Enero","Febrero","Marzo","Abril",
"Mayo","Julio");
lista("U","Enero","Febrero","Marzo","Abril");
// --></script>
1. Enero
2. Febrero
3. Marzo
4. Abril
5. Mayo
6. Julio
Enero
Febrero
Marzo
Abril
Definiendo Métodos
un método es una función asociada a un objeto. Se puede definir un método de la
misma manera que se define una función normal. Después de definirla, use la siguiente
sintaxis para asociarla a un objeto:
objeto.método=nb_función
donde objeto es un objeto existente, método es el nombre del método que se está
definiendo y nb_función es una función ya defninida.
Luego se puede llamar al método a través del objeto usando la notación normal.
Para definir un tipo de objeto, cree una función que especifique su nombre, propiedades
y métodos.
Por ejemplo, supongamos que se desea crear un objeto para representar autos llamado
auto, con propiedades marca, modelo y ano. Para ello creamos la función:
this.marca = marca;
this.modelo = modelo;
this.ano = ano;
que crea un nuevo objeto miAuto y asigna los valores especificados a sus propiedades.
Se puede crear cualquier número de objetos de tipo auto.
Un objeto puede tener una propiedad que a su vez es un objeto. Por ejemplo,
supongamos que se define un objeto persona como sigue:
this.nombre = nombre;
this.edad = edad;
this.sexo = sexo;
this.auto = auto;
}
Se puede entonces crear una persona dueña de un auto como sigue:
Juan.auto.marca
Juan.auto.modelo
Juan.auto.ano
Juan.auto.color = "Negro";
añade la propiedad de color al auto de la persona Juan y le asigna el valor Negro. Sin
embargo, esto sólo afecta a un objeto en especial, y no a todos los del mismo tipo.
Para añadir una propiedad a todos los objetos de un tipo se debe modificar la función
que lo define.
Definiendo Métodos
Se pueden definir métodos para un tipo de objeto incluyendo una definición de método
en la definición del tipo. Por ejemplo, supongamos que se desea asociar un método que
devuelva un string con las propiedades de cada persona. Esto se haría modificando la
definición del tipo persona cono sigue:
function muestraPersona()
}
function persona(nombre, edad, sexo, auto)
this.nombre = nombre;
this.edad = edad;
this.sexo = sexo;
this.auto = auto;
this.mostrar = mostrarPersona;
Math.sin(1.56)
with (Math)
a = PI * r*r;
y = r*sin(theta)
x = r*cos(theta)