Javascript Apuntes

  • Uploaded by: webburgos
  • 0
  • 0
  • March 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Javascript Apuntes as PDF for free.

More details

  • Words: 16,656
  • Pages: 99
Loading documents preview...
A la hora de buscar información sobre desarrollo web nos encontramos multitud de documentos que hablan de la nueva web (web 2.0) y de como ha contribuido a su desarrollo las técnicas que componen AJAX.

Concepto AJAX

AJAX (Asynchronous Javascript and XML) es una técnica de desarrollo web que genera aplicaciones web interactivas combinando: ●XHTML y CSS para la presentación de información ●Document Object Model (DOM) para visualizar dinámicamente e interactuar con la información presentada ●XML, XSLT para intercambiar y manipular datos ●JSON y JSON-RPC pueden ser alternativas a XML/XSLT ● XMLHttpRequest para recuperar datos asíncronamente ●Javascript como nexo de unión de todas estas tecnologías AJAX es un patrón de diseño que propone un nuevo modelo de interacción Web combinando las tecnologías anteriores Los navegadores que soportan las tecnologías mencionadas son las plataformas en las que se ejecutan las aplicaciones AJAX (Firefox, Iexplorer, Opera, Konqueror y Safari) Ya hemos estudiado alguna de estás técnicas(XHTML y CSS) pero de todas las que componen AJAX, la más importante es JavaScript, pues viene a ser el pegamento que permite interactuar con todas estas técnicas dentro de una página html. De forma que podamos recorrer la información contenida en un documento xml e ir generando una tabla xhtml. O comprobar, que los datos introducidos en la página web por parte del cliente, son correctos sin la necesidad de enviarlos a un servidor donde un programa java o de otro tipo analice dichos datos. Es más si no conocemos suficientemente JavaScript no seremos capaces de crear aplicaciones dinámica por mucho que dominemos el resto de las técnicas. Indice de Contenidos: •Introducción •¿Qué

es Javascript? •Primeros pasos •Elementos básicos •Comentarios •Literales •Sentencias y bloques •Tipos de datos •Variables •Referencias •Vectores y matrices •Operadores •Operadores aritméticos •Operadores de comparación •Operadores lógicos •Operadores de asignación •Operadores especiales •Estructuras de control •Bifurcaciones condicionales •Bucles •Estructuras de manejo de objetos 1

•Funciones •Funciones

predefinidas

•Objetos •Propiedades

y métodos •Creación mediante constructores •Herencia •Prototipado •Objetos predefinidos •Objeto Array •Objeto Date •Objeto Math •Objeto Number •Objeto String •Objeto RegExp •Objeto Boolean •Objeto Function •Eventos •Lista de eventos •Definición mediante código •Modelo de objetos del documento •Objeto Window •La barra de estado •Marcos (o frames) •Objeto Document •Cómo escribir en el documento •Cookies •Funciones básicas •Un ejemplo: el contador individualizado •Objeto Image •Tratamiento de imágenes •Objeto Form •Objetos Text •Objetos Checkbox y Radio •Objetos Select y Option •Expresiones regulares •Objeto RegExp •Métodos de String •Otros objetos •Objeto History •Objeto Location •Objeto Navigator •Objeto Screen •Nuevas características •Ficheros .js •Introducción •¿Qué es Javascript? El código JavaScript debe estar incluido dentro de una página HTML(XHTML). Precisamente la función de JavaScript esta en leer , y modifcar los contenidos de las etquetas HTML. Esto es lo que permite que las páginas html sean dinámcas. También se ha de destacar que javascript es un lenguaje de programación interpretado. •Primeros

pasos Para incluiir código JavaScript dentro de la página untilizamos las etiquetas 2

<SCRIPT LANGUAGE="JavaScript"> Ejemplo: <SCRIPT LANGUAGE="JavaScript"> function HolaMundo() { alert("¡Hola, mundo!"); var contestacion = prompt("¿Cómo te llamas, criatura?", ""); if (contestacion) alert("Hola, " + contestacion); } function CambiaColor() { document.bgColor='d0d0a9' }
Viendo el código anterior vemos como JavaScript hace que una página sea dinámica. Otra de las características de este lenguaje esta en que es interpretado. También destaca que las herramientas gráficas como Dreamweaver generan automáticamente el código JavaScript dentro de sus diseños. Por lo tanto se hace imprescindible conocer este lenguaje si queremos ser capaces de leer y entender el código generado por estas herramientas de diseño web. •Elementos

básicos Antes de comenzar a escribir código tenemos que destacar que JAVASCRIPT distigue mayúsculas de minúsculas, por lo tanto habrá que tener cuidado a la hora de nombrar las variables y funciones, ya que en el caso de las variables no es obligatorio definirlas para utilizarlas. •Comentarios Los comentarios se crean igual que en Java // para una sola línea de comentarios /* para varias líneas*/ •Literales

Se llama así a los valores que puede tomar una variable o una constante. Aparte de los distintos tipos de números y valores booleanos: "Soy una cadena" 3434 3.43 true, false •Código JavaScript contenido en ficheros externos(.js) El código que necesitemos crear para una página html lo podemos incluir en la 3

propia página dentro de las etiquetas <script language=”JavaScript”> o bien incluir un fichero asccii con las instrucciones JavaScript. Para incluir dichero fichero en la página html codificamos: <script language=”JavaScript” src=”fichero.js”> Desde este momento las variables y funciones definidas dentro del fichero fichero.js están disponibles. •Tipos

de datos

Variables Aunque no es obligado, se deben declarar las variables antes de utilizarlas. Esto se hace utilizando la palabra clave var . Ejemplos de declaración de variables: var man = "hola"; // El valor almacenado en man es de tipo cadena (string). var tres = 3; // El valor almacenado en tres es de tipo numerico. var verdad = true; // El valor almacenado en verdad es de tipo boleano (Boolean).var e = 2.718281828 // El valor almacenado en e es de tipo numerico. JavaScript es capaz de distinguir entre mayusculas y minusculas, y no solo es capaz de distinguirlas, sino que tratará como variables diferentes dato y Dato. El nombre de una variable no puede ser una palabra reservada, ni comenzar por un dígito numérico. Ejemplos de nombres de variable no validos: 5Dias // Comienza con un numero. Gaston&Daniela // El ampersand (&) no es un caracter valido para nombre de variable. Si declaramos una variable sin asignarla un valor, existe pero su valor es indefinido(undefined). Ej.: var que_sera; Como JavaScript es un lenguaje sin tipos, las variables técnicamente no tienen un tipo fijo. Tienen un tipo equivalente al tipo de valor que contienen. Es posible, en algunas circunstancias, forzar la conversión automática de una variable o una parte de datos en un tipo diferente. Los números pueden incluirse fácilmente en strings, pero los strings no se pueden incluir directamente en números, para eso existen funciones explicitas de conversión, parseInt() y parseFloat(), son las funciones encargadas de hacerlo.

String

Los strings están delimitados por dobles o simples comillas. (Se utilizan comillas simples para delimitar strings que contienen comillas dobles.) Un string también es un objeto en JavaScript, siendo este un caso especial, con propiedades especiales. Son ejemplos de strings, los siguientes: "Este es un string." '"¡Y este tambien!" pero con comillas simples.' "125"

4

JavaScript soporta números enteros y de punto flotante. Los enteros pueden ser positivos, 0, o negativos; un numero de punto flotante puede contener un punto decimal, una "e" (minúscula o mayúscula), que se utiliza para representar "diez elevado a " en notación cientíifica, o ambos. Los enteros se pueden representar en base 10 (decimal), base 8 (octal), y base 16 (hexadecimal). Los enteros octales se especifican por un "0" a la izquierda, y solo pueden contener los dígitos 0 a 7. Si un número tiene un "0" a la izquierda pero tiene los dígitos "8" y/o "9", es un número decimal. Un numero, que por el contrario, podría ser un número octal pero que contenga la letra "e" (o "E") genera un error. Enteros hexadecimales ("hex") se especifican comenzando por "0x" (la "X" puede ser mayúscula o minúscula) y puede contener dígitos 0 a 9 y letras de la A a F (también en minúsculas o mayúsculas). La letra "e" es un digito válido en notación hexadecimal y no significa un numero exponencial. Las letras A a F se utilizan para representar, como dígitos, los números que van desde el 10 al 15 en base 10. Es decir, 0xF es equivalente a 15, y 0x10 es equivalente a 16. Números octales y hexadecimales pueden ser negativos, pero no pueden ser fraccionarios. Un Numéricos número que comience con un "0" y contenga un punto decimal es numero decimal de coma flotante; si un número que comienza con "0x" o "00" contiene un punto decimal, se ignora todo lo que este situado a la derecha del punto decimal. Veamos algunos ejemplos de números: .0001, 0.0001, 1e-4, 1.0e-4 // Cuatro formas distintas de representar el mismo número de punto flotante. 8.23e2 // Número de punto flotante, equivalente a 823. 102 // Número entero. 0377 // Entero octal, equivalente a 255. 00.0001 // Como un número octal no puede tener parte decimal, equivale a 0. 0378 // Número entero, equivale a 378. 0Xff // Entero hexadecimal, equivale a 255. 0x37CF // Entero hexadecimal, equivale a 14287. 0x3e7 // Entero hexadecimal, equivale a 999. 0x3.45e2 // Como un número hexadecimal no puede tener parte decimal, equivale a 3. Boleanos

Los valores boleanos posibles son true (verdad) y false (falso). Son valores especiales, y no se pueden utilizar como 1 y 0.

Objetos

Los objetos son construcciones lógicas que tienen unas propiedades y pueden ejecutar determinados métodos. Se usa la notación del punto: - objeto.propiedad, es una referencia a la propiedad citada - objeto.metodo, invoca el método en cuestión y se ejecuta Por ej. el objeto window, tiene la propiedad window.location, que contiene la dirección de la página y el método window.resizeTo(x,y), que dimensiona la ventana al tamaño x*y pixels.

Indefinido

Un valor que es indefinido es simplemente un valor dado a una variable despues de haber sido creada, pero antes de que se haya asignado un valor a esta.

Null

Un valor null es algo que no tiene valor y no quiere decir nada.

•Vectores

y matrices 5

En los lenguajes de programación existen estructuras de datos especiales que nos sirven para guardar información más compleja que simples variables. Una estructura típica en todos los lenguajes es el Array, que es como una variable donde podemos introducir varios valores, en lugar de solamente uno como ocurre con la variables normales. Los arrays nos permiten guardar varias variables y acceder a ellas de manera independiente, es como tener una variable con distintos compartimentos donde podemos introducir datos distintos. Para ello utilizamos un índice que nos permite especificar el compartimiento o posición a la que nos estamos refiriendo. Los arrays se introdujeron en versiones Javascript 1.1 o superiores, es decir, solo los podemos utilizar a partir de los navegadores 3.0. Para navegadores antiguos se puede simular el array utilizando sintaxis de programación orientada a objetos, pero dada la complejidad de esta tarea, por lo menos en el momento en que nos encontramos y las pocas ocasiones que los deberemos utilizar vamos a ver cómo utilizar el auténtico array de Javascript. Creación de Arrays El primer paso para utilizar un array es crearlo. Para ello utilizamos un objeto Javascript ya implementado en el navegador.Para crear un objeto array: var miArray = new Array() Esto crea un array en la página que esta ejecutándose. El array se crea sin ningún contenido, es decir, no tendrá ningún elemento creado. También podemos crear el array especificando el número de elementos que va a tener. var

miArray

miArray[0] miArray[1] miArray[2] = 127

=

new

= =

Array(10) 290 97

Los datos se introducen indicando entre corchetes el índice de la posición donde queríamos guardar el dato. Los arrays empiezan siempre en la posición 0, así que un array que tenga por ejemplo 10 posiciones, tendrá elementos del 0 a la 9. Para recoger datos de un array lo hacemos igual: poniendo entre corchetes el índice de la posición a la que queremos acceder. Veamos cómo se imprimiría en la pantalla el contenido de un array. var

miArray

miArray[0] miArray[1] miArray[2] for document.write("Posición

= = = =

new

Array(3) 155 4 499

(i=0;i<3;i++){ " + i + " del array: document.write("
")

"

+

miArray[i])

} Tipos de datos en los arrays En los arrays podemos guardar datos de cualquier tipo. Podemos ver un 6

array

donde

introducimos

datos

de

tipo

caracter.

miArray[0] = "Hola" miArray[1] = "a" miArray[2] = "todos" Incluso, en Javascript podemos guardar distintos tipos de datos en un mismo array. Es decir, podemos introducir números en unas casillas, textos en otras, boleanos o cualquier otra cosa que deseemos. miArray[0] miArray[1] miArray[1] miArray[2]

=

"desarrolloweb.com" 1275 0.78 true

= = =

Longitud de los arrays Para saber la longitud de un array se utiliza la propiedad length. document.write("Longitud

del

array:

"

+

for

(i=0;i<miArray.length;i++){ document.write(miArray[i])

miArray.length)

} Hay que fijarse que el bucle for se ejecuta siempre que i valga menos que la longitud del array, extraída de su propiedad length. El siguiente ejemplo nos servirá para conocer mejor los recorridos por los arrays, el funcionamiento de la propiedad length y la creación dinámica de nuevas posiciones. Vamos a crear un array con 2 posiciones y rellenar su valor. Posteriormente introduciremos un valor en la posición 5 del array. Finalmente imprimiremos todas las posiciones del array para ver lo que pasa. var

miArray

miArray[0] miArray[1]

=

new

= =

miArray[5] for document.write("Posición

"Estados =

Array(2) "Colombia" Unidos" "Brasil"

(i=0;i<miArray.length;i++){ " + i + " del array: document.write("
")

"

+

miArray[i])

} Arrays multidimensionales Los arrays multidimensionales son un estructuras de datos que almacenan los valores en más de una dimensión. En Javascript no existe un auténtico objeto array-multidimensinal. Para utilizar estas estructuras podremos definir arrays que donde en cada una de sus posiciones habrá otro array. En nuestros programas podremos utilizar arrays de cualquier dimensión, veremos a continuación cómo trabajar con arrays de dos 7

dimensiones,

que

serán

los

más

comunes.

En este ejemplo vamos a crear un array de dos dimensiones donde tendremos por un lado departamentos y por el otro los ciclos de cada departamento. <script> var dpto = new Array(4); var infor= new Array(3); infor[0]="asi"; infor[1]="dai"; var adm = new Array(3); adm[0]="af"; adm[1]="ga"; adm[3]="sec"; var ef = new Array(3); ef[0]="afd"; dpto[0]=infor; dpto[1]=adm; dpto[2]=ef; for(i=0;iCiclo" + dpto[i][j])+""} } También podemos crear un array a la vez que le indicamos sus datos. var diasSemana = new Array("Lunes","Martes","Miércoles,","Jueves","Viernes","Sábado","Domingo") y también un array bidimiensional. var temperaturas_cuidades = new Array(new Array (12,10,11), new Array(5,0,2),new Array(10,8,10))

Operadores 8

Aritméticos Descripcion Negacion

Logicos

Simbolo

Descripcion

De Bit

Asignación

Simbolo

Descripcion

Simbolo ~

Asignacion Operadores compactos

-

NO Logico

!

NOT bit a bit

Incremento

++

Menor que

<

Desplazamiento izquierdo Bit a Bit

<<

Decremento

--

Mayor que

>

Desplazamiento derecho Bit a Bit

>>

>>>

Multiplicacion

*

Menor que o igual a

<=

Desplazamiento derecho sin signo

Division

/

Mayor que o igual a

>=

AND bit a bit

&

Modulo aritmetico

%

Igualdad

==

XOR bit a bit

^

Suma

+

Distinto

!=

OR bit a bit

|

Resta

-

Y Logico AND

&&

O Logico OR

||

Descripcion

Varios

Simbolo = += -= *= /=

Descripcion

Simbolo

delete

delete

typeof

typeof

void

Void

•Operadores

aritméticos de comparación •Operadores lógicos •Operadores de asignación •Operadores especiales •Estructuras de control •Bifurcaciones condicionales •Operadores

if (condicion_a_evaluar) { ; } else { ; } switch(variable) { case “valor1”: acciones ; break; case “valor2”: acciones ; break; default: sentencias; } •Bucles

for (valor inicialt; condición; incremento ;) { ; [brrak] 9

[continue] } while (condicion) { ; [break] [continue] } do { ; [break] [continue] } while (condicion) •Funciones

Incluso los programas más sencillos tienen la necesidad de dividirse. Las funciones son los únicos tipos de subprogramas que acepta JavaScript. Tienen la siguiente estructura: function nombre(argumento1, argumento2,..., argumento n) {código de la funcion} Los parámetros se pasan por valor. Eso significa que si cambiamos el valor de un argumento dentro de una función, este cambio no se verá fuera: function sumarUno(num) { num++; } var a = 1: sumarUno(a); En este ejemplo, a seguirá valiendo 1 después de llamar a la función. Esto tiene una excepción, que son las referencias. Para devolver un valor de retorno desde la función se utiliza la palabra reservada return: function cuadrado(num) { return num * num; } a = cuadrado(2); En este ejemplo, a valdrá 4. Se pueden definir funciones con un número variable de argumentos. Para poder luego acceder a dichos parámetros dentro de la función se utiliza el vector argumentos. Este ejemplo sumaría el valor de todos los parámetros: <script> function sumarArgumentos() { resultado = 0; 10

for (i=0; i<arguments.length; i++) resultado += arguments[i]; return resultado; } alert( "nº de argumentos:"+ sumarArgumentos("1","2")); Funciones predefinidas JavaScript dispone de las siguientes funciones predefinidas: eval(cadena) Ejecuta la expresión o sentencia contenida en la cadena que recibe como parámetro. mensaje = 'Hola'; eval("alert('" + mensaje + "');"); Este ejemplo nos muestra una ventana con un saludo. parseInt(cadena [, base]) Convierte en un número entero la cadena que recibe, asumiendo que está en la base indicada. Si este parámetro falta, se asume que está en base 10. Si fracasa en la conversión devolverá el valor NaN. parseInt("3453"); Devuelve el número 3453. parseInt("3453",16); Devuelve el número 13395 parseFloat(cadena) Convierte en un número real la cadena que recibe, devolviendo NaN si fracasa en el intento. parseFloat("3.12.3"); Este ejemplo devuelve NaN ya que la cadena no contiene un número real válido. isNaN(valor) Devuelve true sólo si el argumento es NaN. isFinite(numero) Devuelve true si el número es un número válido y no es infinito. Number(referencia) String(referencia) Convierten a número (o referencia) el objeto que se les pase como argumento •Objetos

Para crear objetos, primero es necesario definir su tipo (o clase): function empleado(nombre, edad, puesto) { this.nombre = nombre this.edad = edad this.puesto = puesto } En JavaScript, la partícula this se refiere al objeto en el que se utiliza. Una vez definida la clase, podemos crear variables (instanciar objetos) de esa clase de la siguiente manera: 11

empleado_1 = new empleado("Pedro", 26, "Programador") Pueden añadirse propiedades a los objetos aunque estas no haya sido declaradas en la definición de la clase. Por ejemplo: empleado_1.jefe = "Luis" Estas propiedades nuevas sólo afectaran a ese objeto y no al resto. Los objetos pueden anidarse de forma que un objeto sea un a propiedad de otro objeto. Por ejemplo: function oficina(ciudad, pais) { this.ciudad = ciudad this.pais = pais } oficinaPedro = new oficina("Madrid","España") empleado_1 = new empleado("Pedro", 26, "Programador", oficinaPedro) En el ejemplo anterior, hay que definir la clase empleado de esta forma: function empleado(nombre, edad, puesto, oficina) this.nombre = nombre this.edad = edad this.puesto = puesto this.oficina = oficina } Dentro de la definición de la clase o tipo del objeto, pueden incluirse funciones que accedan a sus propiedades. Estas funciones reciben el nombre de métodos. Un método se define de la siguiente manera: function mostrarPerfil() { document.write("Nombre: " + this.nombre + "
") document.write("Edad: " + this.edad + "
") document.write("Puesto: " + this.puesto + "
") } function empleado(nombre, edad, puesto) { this.nombre = nombre this.edad = edad this.puesto = puesto this.mostrarPerfil = mostrarPerfil } <TITLE>Empleados <SCRIPT LANGUAGE="JavaScript"> Perfil del empleado " + this.nombre + "
") document.writeln("Edad: " + this.edad) document.writeln("Puesto: " + this.nombre) 12

document.write("
") } //DEFINE EL OBJECTO EMPLEADO function empleado() { this.nombre = prompt("Introduzca el nombre del empleado: ", "Nombre") this.edad = prompt("Introduzca la edad de " + this.nombre, "00") this.mostrarPerfil = mostrarPerfil } //--> <SCRIPT LANGUAGE="JavaScript"> Otro Ejemplo:

Documento sin título <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script language="JavaScript"> listas=new Array(); var c=0;pos=0; function objetonotas(alumno,modulo,nota) { 13

this.alumno=alumno; this.modulo=modulo; this.nota=nota; this.graba=grabaalumno; this.leerAlumno=leerAlumno; } function grabarA() { a=calumno.value; m=cmodulo.value; n=cnota.value; al= new objetonotas(a,m,n); al.graba() } function grabaalumno() { c=c+1; pos=c; listas[c]=al; } function leerAlumno() { calumno.value=al.alumno; cmodulo.value=al.modulo; cnota.value=al.nota; } function siguiente() { pos=pos+1; if(pos>c) {pos=c;} al = new objetonotas(); al=listas[pos]; al.leerAlumno(); } function anterior() { pos=pos-1; if(pos<1) {pos=1;} al = new objetonotas(); al=listas[pos]; al.leerAlumno(); } function listar() { var i=1; document.write(""); 14

for(i;i<= c;i++) { document.write(""); } document.write("
Alumno :" + listas[i].alumno + "Modulo :" + listas[i].modulo + " Nota :" + listas[i].nota +"
"); }

nombre
modulo
nota




•Objetos predefinidos •Objeto Array Ya explicado. •Objeto Date Este objeto nos permitirá manejar fechas y horas. fecha = new Date(); fecha = new Date(año, mes, dia); fecha = new Date(año, mes, dia, hora, minuto, segundo); Si no utilizamos parámetros, el objeto fecha contendrá la fecha y hora actuales, obtenidas del reloj del sistema. En caso contrario hay que tener en cuenta que los meses comienzan por cero. Así, por ejemplo: navidad99 = new Date(1999, 11, 25) El objeto Date dispone, entre otros, de los siguientes métodos: getTime() setTime(milisegundos) Obtienen y ponen, respectivamente, la fecha y la hora tomados como milisegundos transcurridos desde el 1 de enero de 1970. getYear() setYear(año) 15

Obtienen y poner, respectivamente, el año de la fecha. Éste se devuelven como números de 4 dígitos excepto en el caso en que estén entre 1900 y 1999, en cuyo caso se devolverán las dos últimas cifras. Hay que tener cuidado, ya que la implementación de éstos métodos puede variar en las últimas versiones de Netscape. getFullYear() setFullYear(año) Realizan la misma función que los anteriores, pero sin tantos líos, ya que siempre devuelven números con todos sus dígitos. Funciona en Explorer 4 y Netscape 4.06 y superiores. getMonth() setMonth(mes) getDate() setDate(dia) getHours() setHours(horas) getMinutes() setMinutes(minutos) getSeconds() setSeconds(segundos) Obtienen y ponen, respectivamente, el mes, día, hora, minuto y segundo de la fecha, también respectivamente, respectivamente hablando. getDay() Devuelve el día de la semana de la fecha en forma de número que va del 0 (domingo) al 6 (sábado). •Objeto

Math Este objeto no está construido para que tengamos nuestras variables Math, sino como un contenedor donde meter diversas constantes (como Math.E y Math.PI) y los siguientes métodos matemáticos: Método

Descripción

Expresión de ejemplo Math.abs(-2)

Resultado del ejemplo

abs

Valor absoluto

sin, cos, tan

Funciones Math.cos(Math.PI) trigonométricas, reciben el argumento en radianes

-1

asin, acos, atan

Funciones trigonométricas inversas

1.57

exp, log

Exponenciación logaritmo, base E

ceil

Devuelve el entero más pequeño mayor o igual al argumento

Math.asin(1)

y Math.log(Math.E)

Math.ceil(-2.7)

2

1

-2

16

floor

Devuelve el entero más grande menor o igual al argumento

Math.floor(-2.7)

round

Devuelve el entero más Math.round(-2.7) cercano o igual al argumento

-3

min, max

Devuelve el menor (o Math.min(2,4) mayor) de sus dos argumentos

2

pow

Exponenciación, siendo Math.pow(2,4) el primer argumento la base y el segundo el exponente

16

sqrt

Raíz cuadrada

2

Math.sqrt(4)

-3

• Objeto Number Al igual que en el caso anterior, no se pueden crear objetos de tipo Number, sino que debemos referirnos al genérico. Este objeto contiene como propiedades los siguientes valores numéricos Propiedad Descripción NaN

Valor que significa "no es un número"

MAX_VALUE y MIN_VALUE

Máximo y mínimo número representable

NEGATIVE_INFINITIVE y POSITIVE_INFINITIVE

Infinito negativo y positivo, se utilizan cuando hay desbordamiento al realizar alguna operación matemática

•Objeto

String

Este es un objeto que se puede confundir con los datos normales de tipo cadena. Conviene utilizar estos últimos, ya que los objetos String tienen un comportamiento extraño cuando se utilizan como cadenas normales. Además, al crear una cadena estamos creando a la vez un objeto String asociado. Su utilidad está en sus métodos, entre los que cabe destacar: charAt(pos) charCodeAt(pos) Devuelven el carácter o el código numérico del carácter que está en la posición indicada de la cadena. indexOf(subcadena) Devuelven la posición de la subcadena dentro de la cadena, o -1 en caso de no estar. split(separador) Devuelven un vector con subcadenas obtenidas separando la cadena por el 17

carácter separador. cadena = "Navidad,Semana Santa,Verano"; vector = cadena.split(","); En el ejemplo, el vector tendrá tres elementos con cada una de las vacaciones de un escolar español normal. concat(cadena2) Devuelve el resultado de concatenar cadena2 al final de la cadena. substr(indice, longitud) substring(indice1, indice2) Devuelven una subcadena de la cadena, ya sea cogiendo un número de caracteres a partir de un índice o pillando todos los caracteres entre dos índices. toLowerCase() toUpperCase() Transforman la cadena a minúsculas y mayúsculas, respectivamente. •Eventos

Un evento, como su mismo nombre indica, es algo que ocurre. Para que una rutina nuestra se ejecute sólo cuando suceda algo extraño deberemos llamarla desde un controlador de eventos. Estos controladores se asocian a un elemento HTML y se incluyen así: •Lista

de eventos

Evento

Descripción

Elementos que lo admiten

onLoad

Terminar de cargarse una página



onUnLoad

Salir de una página (descargarla)



onMouseOver

Pasar el ratón por encima



onMouseOut

Que el ratón deje de estar encima



onSubmit

Enviar un formulario



onClick

Pulsar un elemento



onBlur

Perder el cursor



onChange

Cambiar de contenido o perder el cursor



onFocus

Conseguir el cursor



onSelect

Seleccionar texto



18

Como ejemplo, vamos a hacer que una ventana aparezca automáticamente en cuanto pasemos un cursor por encima de un elemento
(e impidiendo, de paso, que quien esté viendo la página pueda hacer uso del mismo). <SCRIPT LANGUAGE="JavaScript"> Pasa por aquí encima Otro Ejemplo <TITLE> Prueba de eventos <SCRIPT LANGUAGE="JavaScript"> function mensaje() { alert("Estoy en mensajes"); }









19








Otro Ejemplo

<TITLE> Prueba de eventos <SCRIPT LANGUAGE="JavaScript"> function mensaje() { alert("Estoy en mensajes"); } 20

















•Definición

mediante código Existe otra forma de definir eventos.. Por ejemplo, la página: load1.html <SCRIPT LANGUAGE="JavaScript"> 21

... Se puede reescribir como: load2.html <SCRIPT LANGUAGE="JavaScript"> •Modelo

de objetos del documento Los objetos del navegador son:

navigator

Permite manipular información referente al browser del cliente. window

Ofrece métodos y propiedades de cada ventana del navegador que finalizan cuando éste se cierra. Cada ventana es un objeto.

frame

Facilita el uso de métodos y propiedades que posee cada frame presente en una ventana.

location

Habilita al navegador para trabajar con las direcciones de Web cargadas previamente en la ventana.

history

Es usada para trabajar con el historial de la ventana (lista de direcciones visitadas).

document

Tiene métodos y propiedades para trabajar con el documento actual creando salidas interactivas en la misma ventana donde se encuentra este documento, y haciendo más eficiente el trabajo realizado con él. link

Permite manipular los enlaces.

form

Establece los métodos y propiedades para trabajar con los formularios presentes en un documento, así como los elementos que las constituyen. Es el contenedor de todos los elementos del formulario.

anchor Proporciona los mecanismos necesarios para manipular las 22

navigator

Permite manipular información referente al browser del cliente. marcas. applet Sirve para incluir applets en el HTML. image

Permite manejar las imágenes.

area

Para definir los mapas sensibles.

Los objetos del navegador están organizados jerárquicamente

Programa que visualiza las propiedades de todos los objetos del navegador <TITLE> <script language="JavaScript"> document.onmousedown =boton function boton(k) { alert(event.button ); alert(event.srcElement.id ); propiedades(); } function propiedades() { alert(event.button ); var cadena; var sw; sw=0; 23

obj = new Array(); obj[0]="window"; obj[1]="navigator"; obj[2]="location"; obj[3]="history"; obj[4]="document"; obj[5]="screen"; cadena = cadena + "

Proiedades de los objetos del Navegador

"; for(i=0;i<6;i++) { //cadena = cadena + "
Propiedades del Objeto : "; cadena = cadena + "

" + obj[i] + "


" var objeto; objeto =obj[i]; for(m in eval(objeto)) { /* if (sw==1) { sw=0; continue; }*/ // alert( "Propiedad:" + m + " Valor = " + objeto[m]); cadena = cadena + "Propiedad:" + m + " Valor = " + objeto[m] + "
" // if(m == "event") // { sw=1;} } } cadena = cadena + ""; document.write(cadena); }
Propiedades de los Objetos del Navegador
Objeto Window El objeto window hace referencia a la ventana actual. •PROPIEDADES

closed

Es un booleano que nos dice si la ventana está cerrada( closed = true ) o no ( closed = false ).

defaultStatus

Cadena que contiene el texto por defecto que aparece en la barra de estado (status bar) del navegador.

frames

Es un array: cada elemento de este array (frames[0], frames[1], ...) es uno de los frames que contiene la ventana. Su orden se asigna según se definen en el

24

closed

Es un booleano que nos dice si la ventana está cerrada( closed = true ) o no ( closed = false ). documento HTML.

history

Se trata de un array que representa las URLS visitadas por la ventana (están almacenadas en su historial)

length

Variable que nos indica cuántos frames tiene la ventana actual.

location

Cadena con la URL de la barra de dirección.

name

Contiene el nombre de la ventana, o del frame actual.

opener

Es una referencia al objeto window que lo abrió, si la ventana fue abierta usando el método open() que veremos cuando estudiemos los métodos.

parent

Referencia al objeto window que contiene el frameset.

self ó window

Es un nombre alternativo del window actual.

status

String con el mensaje que tiene la barra de estado.

Top

Nombre alternativo de la ventana del nivel superior. •METODOS

alert(mensaje)

Muestra el mensaje 'mensaje' en un cuadro de diálogo

blur()

Elimina el foco del objeto window actual.

clearInterval(id)

Elimina el intervalo referenciado por 'id' (ver el método setInterval(), también del objeto window).

clearTimeout(nombre)

Cancela el intervalo referenciado por 'nombre' (ver el método setTimeout(), también del objeto window).

close()

Cierra el objeto window actual.

confirm(mensaje)

Muestra un cuadro de diálogo con el mensaje 'mensaje' y dos botones, uno de aceptar y otro de cancelar. Devuelve true si se pulsa aceptar y devuelve false si se pulsa cancelar.

focus()

Captura el foco del ratón sobre el objeto window actual.

moveBy(x,y)

Mueve el objeto window actual el número de pixels especificados por (x,y).

moveTo(x,y)

Mueve el objeto window actual a las coordenadas (x,y).

25

Abre la URL que le pasemos como primer parámetro en una ventana de nombre 'nombre'. Si esta ventana no existe, abrirá una ventana nueva en la que mostrará el contenido con las características especificadas. Las características que podemos elegir para la ventana que queramos abrir son las siguientes: toolbar = [yes|no|1|0]. Nos dice si la ventana tendrá barra de herramientas (yes,1) o no la tendrá (no,0). location = [yes|no|1|0]. Nos dice si la ventana tendrá campo de localización o no. directories = [yes|no|1|0]. Nos dice si la nueva ventana tendrá botones de dirección o no. status = [yes|no|1|0]. Nos dice si la nueva ventana tendrá barra de estado o no. menubar = [yes|no|1|0]. Nos dice si la nueva ventana tendrá open(URL,nombre,caracter barra de menús o no. isticas) scrollbars = [yes|no|1|0]. Nos dice si la nueva ventana tendrá barras de desplazamiento o no. resizable = [yes|no|1|0]. Nos dice si la nueva ventana podrá ser cambiada de tamaño (con el ratón) o no. width = px. Nos dice el ancho de la ventana en pixels. height = px. Nos dice el alto de la ventana en pixels. outerWidth = px. Nos dice el ancho *total* de la ventana en pixels. outerHeight = px. Nos dice el alto *total* de la ventana el pixels. left = px. Nos dice la distancia en pixels desde el lado izquierdo de la pantalla a la que se debe colocar la ventana. top = px. Nos dice la distancia en pixels desde el lado superior de la pantalla a la que se debe colocar la ventana. Muestra un cuadro de diálogo que contiene una caja de texto en la cual podremos escribir una respuesta a lo que nos prompt(mensaje,respuesta pregunte en 'mensaje'. El parámetro 'respuesta_por_defecto' _por_defecto) es opcional, y mostrará la respuesta por defecto indicada al abrirse el cuadro de diálogo. El método retorna una cadena de caracteres con la respuesta introducida. scroll(x,y)

Desplaza el objeto window actual a las coordenadas especificadas por (x,y).

scrollBy(x,y)

Desplaza el objeto window actual el número de pixels especificado por (x,y).

scrollTo(x,y)

Desplaza el objeto window actual a las coordenadas especificadas por (x,y).

Evalua la expresión especificada después de que hayan setInterval(expresion,ti pasado el número de milisegundos especificados en tiempo. empo) Devuelve un valor que puede ser usado como identificativo (id) por clearInterval().

Evalua la expresión especificada después de que hayan setTimeout(expresion,tie pasado el número de milisegundos especificados en tiempo. mpo) Devuelve un valor que puede ser usado como identificativo por clearTimeout().

Ejemplo 26

TODO supply a title <script language="JavaScript"> var ventana=null; function abreventana(){ var caracteristicas ="width=450,height=400,scrollbars=yes"+",left="+500+",top="+100; if (ventana==null || ventana.closed==true){ ventana = window.open("","OpenWindow",caracteristicas); } } function escribeventana() { texto=document.getElementById("cajatexto"); // alert(" texto :" +texto.value); ventana.document.write("
"+texto.value); ventana.document.write("PROPIEDADES
") ventana.document.write("PROPIEDADES
") ventana.document.write(ventana.closed + "
") ventana.document.write(ventana.defaultstatus + "
") ventana.document.write(ventana.frames.lengtn + "
") ventana.document.write(ventana.history + "
") ventana.document.write(ventana.length + "
") ventana.document.write(ventana.location + "
") ventana.document.write(ventana.name + "
") ventana.document.write(ventana.opener + "
") ventana.document.write(ventana.parent + "
") ventana.document.write(ventana.status + "
") ventana.document.write(ventana.top + "
") } function CambiaTamano(x,y) 27

{ ventana.moveTo(x,y) } abreventana();

Trabajando con el Objeto Window

cierra ventana


Abre Ventana

X


Y





•Objeto

Document El objeto document es el que tiene el contenido de toda la página que se está visualizando. Esto incluye el texto, imágenes, enlaces, formularios, ... Gracias a este objeto vamos a poder añadir dinámicamente contenido a la página, o hacer cambios, según nos convenga.

PROPIEDADES alinkColor

Esta propiedad tiene almacenado el color de los enlaces activos

28

anchors

Se trata de un array con los enlaces internos existentes en el documento

applets

Es un array con los applets existentes en el documento

bgColor

Propiedad que almacena el color de fondo del documento

cookie

Es una cadena con los valores de las cookies del documento actual

domain

Guarda el nombre del servidor que ha servido el documento

embeds

Es un array con todos los EMBED del documento

fgColor

En esta propiedad tenemos el color del primer plano

forms

Se trata de un array con todos los formularios del documento. Los formularios tienen a su vez elementos (cajas de texto, botones, etc) que tienen sus propias propiedades y métodos, y serán tratados en el siguiente capítulo. images. Array con todas las imágenes del documento

images

Un array de objetos imagen que contiene los nombres de las mismas.

lastModified

Es una cadena con la fecha de la última modificación del documento

linkColor

Propiedad que almacena el color de los enlaces

links

Es un array con los enlaces externos

location

Cadena con la URL del documento actual

referrer

Cadena con la URL del documento que llamó al actual, en caso de usar un enlace.

title

Cadena con el título del documento actual

vlinkColor

Propiedad en la que se guarda el color de los enlaces visitados

METODOS clear()

Limpia la ventana del documento

open()

Abre la escritura sobre un documento

close()

Cierra la escritura sobre el documento actual

write()

Escribe texto en el documento

writeln()

Escribe texto en el documento, y además lo finaliza con un salto de línea

Ejemplo 29

Titulo <script language="JavaScript"> function visualiza() { var n =document.images.length; alert("Elementos :" +n); var datos="" for (i=0; i"; } document.write(datos); } Imagen
Imagen
Imagen
Imagen
•Cómo escribir en el documento A la hora de escribir en un documento por medio de write o writeln hay que tener en cuenta un hecho fundamental. Para poder escribir en un documento, éste debe estar abierto y, al abrirlo, se destruye todo el código que haya en él. Un documento se abre automáticamente cuando empieza a cargarse y se cierra cuando termina de hacerlo. Así pues, si deseamos escribir en un documento sin sobreescribir su contenido, deberemos hacerlo antes de que éste termine de cargar. Si lo hacemos después, sobreescribiremos su contenido. Por lo tanto: escribir.html <TITLE>Escribe y no sobreescribe Este es un documento muy interesante y que fue modificado por última vez el día <SCRIPT LANGUAGE="JavaScript"> document.write(document.lastModified); Este ejemplo os mostrará la cadena completa, ya que se llama a write antes de cerrarse el documento. Es decir, antes de que termine de cargar. Sin embargo, el siguiente ejemplo: sobreescribir.html 30

<TITLE>Sobreescribe <SCRIPT LANGUAGE="JavaScript"> function escribir() { document.write("Este es un documento muy interesante y " + "que fue modificado por última vez el día"); document.write(document.lastModified); Hola. Sobreescribirá el documento y no podremos ver ese "Hola", al ser llamado después de cargar el documento, es decir, después de cerrarlo. HISTORY: • Objeto history Objeto derivado de window, contiene todas las direcciones que se han ido visitando durante la sesión actual. Al ser un objeto derivado de window, este también puede utilizar sus métodos. Este objeto guarda la información sobre los URLs que el usuario ha visitado dentro de una ventana determinada. La información aquí guardada es la que se lee sobre el menú Go del navegador. El objeto history, al igual que el location, no posee manejador de eventos. Las propiedades de history. length. Guarda el número de entradas en el documento current. URL de la página actual. history.current = undefined Tiene 3 métodos: METODO

DESCRIPCIÓN

SINTAXIS

back()

Vuelve a la página anterior.

window.history.back();

forward()

Nos lleva a la página siguiente

window.history.forward();

go(valor)

Carga el URL indicado en el índice que se le pasa como argumento respecto del do- window.history.go(valor); cumento actual, valor.Si el índice es positivo iremos hacia delante en la lista de documentos, si por el contrario es negativo, iremos hacia atrás. También podemos indicarle directamente el URL

31

Uno.html Documento sin título <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> dos Dos.html Documento sin título <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> tres Tres.html Documento sin título <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 32

uno

Objeto location Este objeto es el encargado de guardar la información del URL actual. Cada propiedad posee una parte del URL. Este objeto carece de métodos y de manejadores de eventos. Así, las propiedades del objeto location son las siguientes: •

hash. Cadena de caracteres que representa el nombre del ancla definida por los caracteres tras el símbolo #. En esta página:



host. Nombre de la máquina y puerto del URL actual.



hostname. Nombre de máquina del URL actual.



href. URL actual en forma de objeto string.



pathname. El camino del recurso indicado en el URL.



port. Puerto precisado en el URL.



protocol. Protocolo precisado en el URL.



referrer. URL a partir de que el documento actual se consulta.



search. Parte del URL que caracteriza una consulta (a continuación de ?) Ejemplo: <script language="javascript"> function pagina() { document.write("hash :"+window.location.hash+"
"); document.write("host :"+window.location.host+"
"); document.write("hostname:"+window.location.hostname+"
"); document.write("href :"+window.location.href+"
"); document.write("pathname :"+window.location.pathname+"
"); document.write("port :"+window.location.port+"
"); document.write("protocol :"+window.location.protocol+"
"); document.write("referrer :"+window.location.referrer+"
"); document.write("search :"+window.location.search+"
"); } 33

Lo mismo pero utilizando DOM Trabajo con el objeto Location <style type="text/css"> h1{ color:red; font-family:verdana; font-size:24; } div{ color:teal; font-family:courier; font-size:16; } p{ color:black; font-family:Arial; font-size:16; font-weight: bold; font-style: italic } <script language="JavaScript"> var ccolor=new Array("teal","maroon","green","cyan","yellow","purple","blue"); var pos=0; function carga() { for(propiedad in location) { var cadena="location."+propiedad var mip=document.createTextNode("Porpiedad: location."+propiedad + "=" + eval(cadena)); miparrafo=document.createElement("P"); //var el = document.getElementById('parrafo'); var caja = document.getElementById('caja'); miparrafo.style.color=eval("ccolor[pos]"); //el.style.fontSize="24"; //el.appendChild(mip); miparrafo.appendChild(mip); caja .appendChild(miparrafo); //alert(eval(cadena)) pos++; } }

Propiedades del Objeto Location

34



Otra vez utilizamos DOM pero generamos una tabla

Trabajo con el objeto Location <style type="text/css"> h1{ color:red; font-family:verdana; font-size:24; } p{ color:black; font-family:Arial; font-size:16; font-weight: bold; font-style: italic } <script language="JavaScript"> var ccolor=new Array("teal","maroon","green","cyan","black","purple","blue","teal","maroon","green","cyan","white", "purple","blue"); var pos=0; function carga() { raiz=document.getElementsByTagName("body").item(0); tabla=document.createElement("table"); tabla.border=1; mibody=document.createElement("TBODY"); 35

for(propiedad in location) { var cadena="location."+propiedad var mip =document.createTextNode("Porpiedad: location."+propiedad + "=" + eval(cadena)); miparrafo=document.createElement("P"); miparrafo.appendChild(mip); miparrafo.style.color=eval("ccolor[pos]"); pos=pos+1; fila=document.createElement("TR"); columna=document.createElement("td"); columna.appendChild(miparrafo); fila.appendChild(columna); mibody.appendChild(fila); } tabla.appendChild(mibody); raiz.appendChild(tabla); }

Propiedades del Objeto Location





Objeto link Un objeto link es un objeto que enlaza a otro URL mediante hipertexto.

Cada enlace presente en un documento corresponde a un objeto que se coloca en la matriz links. Así, se accederá al primer enlace mediante document.links[0], al segundo mediante document.links[1], y así sucesivamente. El objeto link carece de métodos pero no de propiedades como veremos a continuación. A continuación analizaremos las propiedades de un link. Para ello, utilizaremos el primer link que se encuentra en esta página que es: capítulo anterior Las propiedades de link. •

length. Tamaño enlace1.length = undefined

del

objeto



target. Indica la ventana de destino en la que se visualizará la respuesta de tratamiento del formulario. Se indica mediante el atributo TARGET de la marca A. enlace1.target = window



host. Nombre de la máquina enlace1.host = www.ulpgc.es:80

y

puerto

del

link.

URL

enlazado.

36



hostname. Nombre de máquina enlace1.hostname = www.ulpgc.es



href. URL enlazado en forma de objeto string. enlace1.href = http://www.ulpgc.es/otros/tutoriales/JavaScript/cap6.htm



pathname. El camino del recurso indicado enlace1.pathname = otros/tutoriales/JavaScript/cap6.htm



port. Puerto enlace1.port = 80



protocol. Protocolo enlace1.protocol = http:



search. Parte del URL que caracteriza una consulta (a continuación de ?) enlace1.search =



Objeto anchor

precisado precisado

del

en

URL

en

enlazado.

el

el en

URL.

URL. el

URL.

Una anchor o ancla es una parte de texto que define una etiqueta para ser referenciada desde otro lugar por un enlace hipertexto. Cada ancla presente en un documento corresponde a un objeto que se coloca en la matriz anchors. Así, se accederá al primer enlace mediante document.anchors[0], al segundo mediante document.anchors[1], y así sucesivamente. Este objeto carece de métodos y la única propiedad que tiene es length que indica el tamaño del objeto anchor. También carece de eventos asociados al mismo.

ir_arriba ir_centro ir_abajo

 

arriba

 

centro

 

abajo

 

<script LANGUAGE="JavaScript"> var i; for (i=0;i<document.anchors.length;i++) { document.write("Name : " + document.anchors[i].name + "
"); document.write("Target : " + document.anchors[i].target + "
"); document.write("

"); }

• Objeto form El cliente, el navegador, crea un objeto de tipo form por formulario contenido en el documento (especificado por la marca form. Cada formulario se identifica por el atributo NAME de la marca FORM. Es útil hacer un formulario para mandar datos a un servidor. 37

Cada formulario presente en un documento corresponde a un objeto que se coloca en la matriz forms. Así, se accederá al primer formulario mediante document.forms[0], al segundo mediante document.forms[1], y así sucesivamente. Ocurre lo mismo con los distintos elementos de un formulario (texto, botones...) que se colocan en la matriz elements, permitiendo así un acceso simple y genérico a las propiedades del objeto form. El único método que posee este objeto es submit() que produce el envío de un formulario mediante uno de los métodos selecionados en la propiedad que veremos a continuación. Estos datos los recogerá el cgi asignado en la pròpiedad correspondiente del formulario. Este método equivale al botón SUBMIT del formulario. Para ver las propiedades y los métodos del objeto form construiremos el siguiente formulario:


Nombre y Apellidos:
Sexo:
Masculino
Femenino
Aficiones:
Música

onClick ="alert('Generado click checkbox')">Música
Lectura
Cine
Fotografía
Otros
Otras aficiones:

Tipo de revista que le gustaría recibir: <select name="revista" onClick="alert('Click en revista')">


name src width height hspace vspace code •

Objeto applet Contiene el nombre del applet. Contiene el nombre del archivo fuente. Ancho del applet. Alto del applet. Borde horizontal. Borde vertical. El nombre del archivo *.class que contiene el código java. Objeto area

39

hash host

Cadena que contiene el nombre del enlace, dentro de la URL. Cadena que contiene el nombre del servidor dentro de la URL. Cadena que contiene el nombre de dominio del servidor (o la dirección IP), dentro de hostname la URL. href Cadena que contiene la URL completa. pathname Cadena que contiene el camino al recurso, dentro de la URL. port Cadena que contiene el número de puerto del servidor, dentro de la URL. Cadena que contiene el protocolo utilizado (incluyendo los dos puntos), dentro de la protocol URL Cadena que contiene la información pasada en una llamada a un script, dentro de la search URL. target Especifica la cadena de destino del enlace. <script LANGUAGE="JavaScript">


Doble ancho
Doble Alto
Mitad ancho
Mitad Alto


Objeto image

40

border Contiene el valor del grosor del borde. complete Es un valor booleano que nos dice si la imagen se ha descargado completamente o no height Contiene la altura de la imagen. hspace Contiene el valor en pixels del margen horizontal. lowsrc Contiene la dirección de la imagen en baja resolución. name Contiene el nombre de la imagen. src Contiene el nombre del archivo fuente. vspace Contiene el valor en pixels del margen vertical. width Ancho de la imagen. Nos sirve el ejercicio anterior para ver el uso de la etiqueta img. •Cookies

Una cookie es un elemento de una lista que se guarda en el ordenador del visitante. Cada elemento de esa lista tiene dos campos obligatorios: el nombre y su valor; y uno opcional: la fecha de caducidad. Este último campo sirve para establecer la fecha en la que se borrará la galleta. Tiene este formato: nombre=valor;[expires=caducidad;] Sólo el servidor que ha enviado al usuario una determinada cookie puede consultarla. Cada una tiene un tamaño máximo de 4 Kb ypuede haber un máximo de 300 cookies en el disco duro. Cada servidor podrá almacenar como mucho 20 galletas en el fichero cookies.txt (en el caso de usar Netscape) o en el directorio cookies (si utilizamos Explorer) del usuario. Si no especificamos la fecha de caducidad la "galleta" se borrará del disco duro del usuario en cuanto éste cierre el navegador. Ejemplo:

<script language="javascript"> var dni=prompt("Introduce DNI del alumno","13102395"); 41

var posc=0; aalumnos = new Array(); function graba() { ddni=cdni.value; dnombre=cnombre.value; dcurso=ccurso.value; dedad=cedad.value; hoy = new Date("December 31,2006"); alert(hoy); var galleta="DNI"+ddni+"="+ddni+","+dnombre+","+dcurso+","+dedad+";expires="+hoy.toGMTString(); alert(galleta); document.cookie=galleta; } function leer() { datos=document.cookie; aalumnos=datos.split(";"); for(i=0;i
posc=posc+1; var n=aalumnos.length -1 ; if(posc rel="nofollow"> n) { posc=aalumnos.length -1; } else{ //posc=aalumnos.length; valora=aalumnos[posc]; //alert (valora); posigual=valora.indexOf("=")+1; ada=valora.substr(posigual,valora.length -13); //alert(valora+".."+ada); td=ada.split(","); //alert(dni+"---"+td[0]); cdni.value=td[0]; cnombre.value=td[1] ccurso.value=td[2] cedad.value=td[3] } } function anterior() { posc=posc-1; if(posc < 0){ posc=0;} valora=aalumnos[posc]; //alert (valora); posigual=valora.indexOf("=")+1; ada=valora.substr(posigual,valora.length -13); //alert(valora+".."+ada); td=ada.split(","); //alert(dni+"---"+td[0]); cdni.value=td[0]; cnombre.value=td[1] ccurso.value=td[2] cedad.value=td[3] } function borrar() { 43

fborrar = new Date() fborrar.setDate(fborrar.getDate()-1) nombrec="DNI"+cdni.value; cadena =nombrec+"=;expires="+fborrar.toGMTString(); //alert(cadena); document.cookie=cadena; } function listado() { v=window.open("",""); v.document.write(""); datos=document.cookie; aalumnos=datos.split(";"); pos=12; for(i=0;i"; v.document.write(cadena); } v.document.write("
DNINombreCursoEdad
"+td[0]+""+td[1]+""+td[2]+""+td[3]+"
"); } function limpiadatos() { cdni.value=""; cnombre.value=""; ccurso.value=""; cedad.value=""; } <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> Documento sin título

44

DNI .................:
Nombre ...........:
<script language="JavaScript">cdni.value=dni;cnombre.focus(); Curso ...............:
Edad ................:



 
 

Temporizador Por medio del método window.setInterval podemos establecer un temporizador que una vez llegue al tiempo establecido em milésimas de segundo ejecutará la función javascript que le indiquemos. id=window.setInterval("cerrarv()",5000); El método window.clearInterval(id) elimina el temporizador. De ho eliminarse transcurrido nuevamente el tiempo establecido la función volverá a ejecutarse. <script> id=window.setInterval("cerrarv()",5000); ¡function cerrarv() { window.clearInterval(id) window.close() document.location.reload()

45

} <script> for(i=0;i<5000;i++){ document.write("
"+i); }

46

Ejercicios.

Java Script> <script language="JavaScript">
} if (minuto == 60) { hora=hora+1; minuto=1; } if (hora == 24) { hora=hora+1; } */ //alert(hora+":"+minuto+":"+segundo); form.hora.value=hora+":"+minuto+":"+segundo; var shora = new String(hora); var hora1 = shora.charAt(0); if(shora.length==2){var hora2 = shora.charAt(1);}else{hora2=hora1;hora1="0";} var sminuto = new String(minuto); var minuto1 = sminuto.charAt(0); if(sminuto.length==2){var minuto2 = sminuto.charAt(1);}else{minuto2=minuto1;minuto1="0";} var ssegundo = new String(segundo); var segundo1 = ssegundo.charAt(0); if(ssegundo.length==2){var segundo2 = ssegundo.charAt(1);}else{segundo2=segundo1;segundo1="0";} document.h1.src=hora1+".gif"; document.h2.src=hora2+".gif"; document.m1.src=minuto1+".gif"; document.m2.src=minuto2+".gif"; document.s1.src=segundo1+".gif"; document.s2.src=segundo2+".gif"; } function pararalarma() { document.campana.style.visibility="hidden"; form.alarma.select(); form.activa.checked=false; } --> <noscript>
Hora Alarma Activa Alarma
0
alt="0">: 00:: 00: Ring !!!!!!!!!!!!!!!!!!!!

<%@ Language=JavaScript %> Menu <SCRIPT TYPE="TEXT/JAVASCRIPT" LANGUAGE="JAVASCRIPT"> var numeromenu = 1; function cambia(op,nn,pp) { op.style.backgroundColor="black"; op.style.color="olive"; op.style.fontWeight="bold"; visualiza_submenu(nn,pp); } function cambiacm(op) { op.style.backgroundColor="teal"; 49

op.style.color="white"; op.style.fontWeight="bold"; } function oculta(mop) { mop.style.display="none"; } function visualiza_submenu(nmenu,y) { cod="menuop"+numeromenu+".style.display='none'"; eval(cod); numeromenu = nmenu; cod="menuop"+nmenu+".style.display='block'"; eval(cod); cod="menuop"+nmenu+".style.left='"+y+"'"; eval(cod);

} function sin_submenu() { cod="menuop"+1+".style.display='none'"; eval(cod); cod="menuop"+2+".style.display='none'"; eval(cod); cod="menuop"+3+".style.display='none'"; eval(cod); cod="menuop"+4+".style.display='none'"; eval(cod); } function obj_window() { alert("responswe"); Response.write("

parrafo


parrafo


parrafo


parrafo

parrafo


parrafo


parrafo


parrafo


") ; }

50

<STYLE type="text/css"> .borde { border-top-width: thin; border-right-width: medium; border-bottom-width: thick; border-left-width: 4px; border-style: solid; border-color:black; width=100%; position:absolute; top:10px; left:10px; background-color:teal; color:white; font-weight:800; font-size:10pt; } .elementos_menu { border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 4px; border-style: solid; border-color:black; width=180; position:absolute; top:40px; left:10px; background-color:white; color:black; display:none; background-color:transparent; font-size:10pt; } A:link {font-family: sans-serif;color: #009900; text-decoration: none} A:visited {background-color: silver; color: #009900;text-decoration: none} A:hover {cursor: help; background-color: yellow; font-family: sans-serif} BODY { background-image: url(cuaderno.jpg); } 51



onmouseout=cambiacm(op1)

onmouseout=cambiacm(op2)

onmouseout=cambiacm(op3)

onmouseout=cambiacm(op4)

Opciones Biblioteca Fichero Servicios


52

<pre style="display:block;">

Equivalencia entre CSS y JavaScript CSS JavaScript CSS font-family fontFamily width font-size fontSize height text-decoration textDecoration left text-transform textTransform top text-align textAlign visibility color color z-Index background-color backgroundColor

JavaScript width height left top visibility zIndex



Java Script> <script language="JavaScript">
=

new 53

Array("Burgos","Soria","Segovia","Avila","Valladolid","Palencia","Leon","Zamora","Salamanca"); var prov1 = new Array("Lerida","Tarragona"); var prov2 = new Array("Caceres","Bdajoz"); var prov3 = new Array("Ciudad Real","Guadalajara"); function cargacomunidad() { form1.comunidad.options[0].value = com[0]; form1.comunidad.options[0].text = com[0]; form1.comunidad.options[1].value = com[1]; form1.comunidad.options[1].text = com[1]; form1.comunidad.options[2].value = com[2]; form1.comunidad.options[2].text = com[2]; form1.comunidad.options[form1.comunidad.length]=new Mancha");

Option("Castilla

la

Mancha","Castilla

la

} function cargaprovincia() { var indice =form1.comunidad.selectedIndex; /* dato = eval("prov"+indice+"[0]") form1.provincia.options[0].text = dato; dato = eval("prov"+indice+"[1]") form1.provincia.options[1].text = dato; */ dato = eval("prov"+indice) lista=new String(dato).split(","); // Borra las provincias de la lista de otras comunidades for(var j=0;j 57 ){return false;} } function pulsadaLETRA() { var codigoTecla = event.keyCode; var cadenaTecla = (String.fromCharCode(event.keyCode)); 54

//alert (codigoTecla +"--" +cadenaTecla); if(codigoTecla < 65 || codigoTecla > 122 ) {return false;} } function obtieneletradni() { var ndni = parseInt(form1.dni.value); var letras ='TRWAGMYFPDXBNJZSQVHLCKE'; var numero = ndni%23; form1.letra.value=letras.substring(numero,numero+1); } function verificar() { var vacio=0; // verificar campos vacios if(form1.nombre.value == "") { form1.nombre.style.background="red"; vacio=1;} if(form1.dni.value == "") { form1.dni.style.background="red"; vacio=1;} if(form1.apellidos.value == "") { form1.apellidos.style.background="red"; vacio=1;} if(form1.email.value == "") { form1.email.style.background="red"; vacio=1;} if(vacio==1){return false;} // ///////////////////////////////////////////// } function borrar() { form1.nombre.style.background="white"; form1.dni.style.background="white"; form1.apellidos.style.background="white"; form1.email.style.background="white"; } function caracteres() { if(form1.otros.value.length>100) {return false;} } function emailcorrecto() 55

{ eemail=form1.email.value; var n1=0; var n2=0; var n1 = eemail.indexOf("."); var n2 = eemail.indexOf("@"); if(n1<0 || n2 <0 || n2>n1) { alert("Email Incorrecto"); form1.email.focus(); } } --> <noscript>
56

* Nombre   * Apellidos  
* DNI   ej:01222222 J * E-mail  
Dirección   Comunidad   <select name="comunidad" onclick="cargaprovincia();"> Provincia   <select name="provincia"> . -->
Otros   Máximo 100 caracteres
<script language="JavaScript"> form1.comunidad.click(); cargaprovincia();

57

DOM(Modelo de Objetos de Documento), es una interfaz estándar que permite a scripts y programas, y de forma dinámica, el acceso y manipulación de la escritura, estilo y contenido de los documentos. Como hemos indicado la manipulación la podremos realizar sobre distintos documentos, creados con formato HTML o XML y manipulados mediante lenguajes de script como JavaScript y programas construidos con Java y .net. EN el presente manual utilizaremso javascript sobre HTML. DOM es un estándar soportado por todos los navegadores. Cuando el navegador carga una página HTML, crea internamente una representación del documento en forma de árbol jerárquico. Ejemplo: ARBOL DOM

Estudio de DOM

Enlace

Para este código HTML el árbol generado sería el siguiente:

Document

Element HTML

Element BODY

Element HEAD

Element P

Element TITLE

“ARBOL DOM”

Element p Element A Id

Id primera

a

“Estudio de DOM”

segunda

a

“Enlace”

href index.h tml

58

En el gráfico podemos ver cuatro tipos de nodos: • Nodo Documento(document). No tiene padre y únicamente tiene un hijo, el nodo elemento raíz, que es el elemento HTML. A través de sus métodos y propiedades podemos crear y acceder a nodos elemento. • Nodos Elementos(element). Se corresponden con etiquetas HTML. Pueden ser hijos o padres de otros elementos. • Nodos de Texto(”..”). Son hijos de un nodo elemento y no pueden tener hijos. • Atributos(id,href). Son siempre nodos hijo de un n odo elemento y tampoco pueden tener hijos. Los elementos se corresponden con las etiquetas HTML, los nodos de texto con las cadenas de caracteres y los atributos con los atributos de las etiquetas. Documento se corresponde con la raíz del documento HTML. Además se establecen relaciones entre los nodos: Padre-hijo: HTML es padre de Head que a su vez lo es de Title. Un padre puede tener varios hijos y un hijo un solo padre. Hermanos:Son hermanos cuando son hijos del mismo padre.En el ejemplo son hermanos los dos elementos p. Para acceder a un nodo elemento, lo hacemos desde el nodo documento o desde otro nodo elemento. Para acceder a un nodo de texto o un nodo de atributo, lo hacemos desde el nodo elemento del que descienden. DOM ofrece una serie de interfaces, objetos, propiedades y métodos para recorrer, manipular, eliminar y crear nodos en el árbol del documento. Para acceder a un nodo: Utilizando el atributo id getElementById(idnetificativo del elemento) Utilizando el atributo Name getElementsByName(name del elemento) Recorriendo toda la estructura: Mas teoría Ejemplo: ARBOL DOM <script> function cambia(){ var nuevousuario=document.getElementById('usuario').getAttribute('value'); document.getElementById('pusuario').firstChild.nodeValue= nuevousuario document.getElementById('pclave').firstChild.nodeValue= document.getElementById('clave').getAttribute('value') } function estructura(){ var estru="";

59

alert(document.firstChild.nodeValue) alert(document.lastChild.tagName) estru=estru+"

Primer Elemento Nombre Nodo : "+document.lastChild.tagName+"

" estru=estru+"

Primer Elemento Valor Nodo : "+document.firstChild.nodeValue+"

" if(!document.lastChild.hasChildNodes()) { alert("No Tiene hijos") estru=estru+"

No Tiene hijos

" } else { alert("Tiene hijos") estru=estru+"

Tiene hijos

" oo=document.documentElement; alert(oo.firstChild.tagName) estru=estru+"

Primer Hijo"+ oo.firstChild.tagName +"

"; alert(oo.lastChild.tagName) estru=estru+"

Ultimo Hijo"+ oo.lastChild.tagName +"

"; oo2=oo.lastChild; estru=estru+"

Creamos un objeto a partir de l ultimo objeto del padre

" estru=estru+"

Primer hijo de este objeto

" alert(oo2.firstChild.tagName+ ":"+oo2.firstChild.firstChild.nodeValue) estru=estru+"

"+oo2.firstChild.tagName+ ":"+oo2.firstChild.firstChild.nodeValue+"

" estru=estru+"

Ahora todos los objetos contenidos en el mismo

" for(i=0;iTiene Hijos "+oo2.childNodes(i).hasChildNodes() +"

" if(oo2.childNodes(i).hasChildNodes()) { alert(oo2.childNodes(i).tagName); estru=estru+"

"+oo2.childNodes(i).tagName+"

" estru=estru+"

SI el objeto es un FORM visualizamos los elementos del formulario

" if(oo2.childNodes(i).tagName !="FORM"){ alert(oo2.childNodes(i).tagName +":"+oo2.childNodes(i).firstChild.nodeValue); estru=estru+"

"+oo2.childNodes(i).tagName +":"+oo2.childNodes(i).firstChild.nodeValue+"

" } else { oo3=oo2.childNodes(i); for(j=0;j"+oo3.childNodes(j).getAttribute('id') +"

"; } } } else

60

{

alert(oo2.childNodes(i).tagName +":"+oo2.childNodes(i).firstChild.nodeValue); estru=estru+"

"+oo2.childNodes(i).tagName +":"+oo2.childNodes(i).firstChild.nodeValue+"

" } } } alert(estru) document.write(estru) }

Usuario

Clave

Pinchame para Visualiza Estrutura del documento



61

Introducción a DOM Todos los derechos reservados www.nosolousabilidad.com INTRODUCCIÓN DOM, Document Object Model o Modelo de Objetos de Documento, es una interfaz estándar que posibilita a scripts y programas, y de forma dinámica, el acceso y manipulación de la estructura, estilo y contenido de los documentos. En este documento vamos a tratar el acceso y manipulación de documentos HTML con JavaScript y a través del estándar DOM2. Esto significa que muchos de los métodos y propiedades que vamos a utilizar no están soportados por algunos navegadores antiguos, aunque al tratarse DOM de un estándar, los actuales navegadores más extendidos, al igual que (presuponemos) futuros navegadores, no tendrán problemas en interpretar correctamente el código. EMPEZANDO... Cuando el navegador carga una página HTML, crea internamente una representación del documento en forma de árbol jerárquico. En el siguiente ejemplo de página HTML: <TITLE>Mi primera página para DOM

Hola Mundo!

Inicio

El árbol generado internamente por el navegador sería como este:

62

Como podemos observar en el grafo, el documento está compuesto por una serie de nodos relacionados jerárquicamente. Entre los nodos podemos diferenciar cuatro tipos diferentes: Nodo de Documento (document), Nodos de Elementos (element), Nodos de Texto (“..”) y Atributos. Los Elementos se corresponden con las etiquetas del documento HTML. Los Nodos de Texto con las cadenas de caracteres (encerradas entre etiquetas), y los Atributos con los atributos de las etiquetas. El nodo de documento representa el documento HTML en sí. Además, esta jerarquía establece implícitamente relaciones entre los nodos: Padre-Hijo: Por ejemplo, el elemento HTML es padre del elemento HEAD, que a su vez lo es del elemento TITLE. Un padre puede tener muchos hijos, aunque un hijo únicamente un padre. Hermanos: Dos elementos se consideran hermanos cuando son hijos del mismo padre. En nuestro ejemplo, los dos elementos P son hermanos, ya que ambos son hijos de BODY.

Tipos de Nodos

Ya hemos comentado que hay diversos tipos de nodos, pero veamos un poco más específicamente sus características. Nodos de Elemento En un documento HTML se definen a través de etiquetas. Pueden ser hijos de otro nodo elemento, y también tener hijos (nodos elemento o nodos de texto). Su acceso y manipulación se realiza a través de la interfaz Node y el objeto document. Nodos de Texto Estos nodos siempre son hijos de un nodo elemento, y no pueden tener hijos. Su acceso y manipulación se realiza a través del nodo elemento del que son hijos. Nodos de Atributo Al igual que los de Texto, son siempre hijos de un nodo elemento, y no 63

pueden tener hijos. Su acceso y manipulación se realiza a través del nodo elemento del que son hijos. Nodo de Documento Es un nodo único y diferente del resto. No tiene padre y únicamente tiene un hijo, el nodo elemento raíz, en un documento HTML es el elemento HTML. A través de los métodos y propiedades del objeto document podemos crear y acceder a nodos elemento. Resumiendo: Para acceder a un nodo elemento, lo hacemos desde el nodo documento o desde otro nodo elemento. Para acceder a un nodo de texto o un nodo de atributo, lo hacemos desde el nodo elemento del que desciendan. DOM ofrece una serie de interfaces, objetos, propiedades y métodos para recorrer, manipular, eliminar y crear nodos en el árbol del documento, que se muestra en la siguiente sección de referencia.

REFERENCIA DOCUMENT El acceso a nodos del documento:

getElementById() Acceder a un elemento del documento a través de su atributo id. getElementsByTagName() Acceder a un conjunto (array) de elementos a través del nombre de su etiqueta. documentElement Accede al nodo raiz, es decir, al primer hijo de ‘document’, en el caso de un documento HTML este elemento se corresponde con el elemento HTML (...). Ejemplo de uso: oo=document.documentElement; alert(oo.tagName)

Creación de nuevos nodos en el documento:

createElement() Crear un nuevo nodo de tipo elemento en el documento. parrafo= document.createElement("P");

createTextNode() Crear un nuevo nodo de tipo texto en el documento. parrafo= document.createElement("P"); Untitled Page <script language="javascript"> function carga() { oo=document.documentElement; alert(oo.tagName) var ccaja=document.getElementById('caja'); alert(caja.hasChildNodes()); alert(ccaja.lastChild.firstChild.nodeValue)

64

alert(ccaja.firstChild.firstChild.nodeValue) alert(ccaja.childNodes.length +ccaja.childNodes(1).firstChild.nodeValue); for(i=0;i
var bboton=document.getElementById('boton').getAttribalert(bboton); var bb=document.getElementById('boton'); alert(bb.getAttribute('value')); bb.setAttribute('style',"text"); texto=document.createTextNode(bb.getAttribute('value')); parrafo= document.createElement("P"); parrafo.setAttribute('id','np'); parrafo.appendChild(texto); caja.appendChild(parrafo)

} function borraNodo() { var oo=document.getElementById('caja') var hijo=document.getElementById('np') oo.removeChild(hijo); }

Párrafo 1

Párrafo 2

Párrafo 3



NODE Acceso a nodos cercanos: firstChild Acceso al primer hijo del nodo. alert(ccaja.firstChild.firstChild.nodeValue)

lastChild Acceso al último hijo del nodo.

alert(ccaja.lastChild.firstChild.nodeValue)

childNodes Acceso al conjunto (array) de hijos del nodo. var ccaja=document.getElementById('caja'); alert(ccaja.childNodes.length +ccaja.childNodes(1).firstChild.nodeValue); for(i=0;i
65

}

parentNode Acceso al padre del nodo. alert(ccaja.parentNode.tagName ) parra=ccaja.firstChild; alert(parra.parentNode.tagName )

nextSibling Acceso al siguiente hermano del nodo. parra=ccaja.firstChild; alert(parra.parentNode.tagName ) alert(parra.nextSibling.firstChild.nodeValue )

prevSibling (No funciona) Acceso al anterior hermano del nodo. alert(parra.nextSibling.firstChild.nodeValue )

Obtención de información sobre los nodos:

tagName Nos informa del nombre de la etiqueta del nodo (en nodos de tipo Elemento). oo=document.documentElement; alert(oo.tagName)

nodeValue Nos informa del valor del nodo (en nodos de tipo Texto). ccaja.childNodes(1).firstChild.nodeValue

hasChildNodes() Nos devuelve true o false en caso de que tenga o no hijos el nodo. Manipulación de los atributos de un nodo: alert(caja.hasChildNodes());

getAttribute() Devuelve el valor del atributo indicado. var bboton=document.getElementById('boton').getAttribute('type'); alert(bboton); var bb=document.getElementById('boton'); alert(bb.getAttribute('value'));

setAttribute() Especifica un atributo para el nodo. Añadir o eliminar nodos:

bb.setAttribute('style',"text");

appendChild(); Añade un nodo hijo al nodo actual. texto=document.createTextNode(bb.getAttribute('value')); parrafo= document.createElement("P"); parrafo.setAttribute('id','np'); parrafo.appendChild(texto); caja.appendChild(parrafo)

removeChild(); Elimina un nodo hijo al nodo actual.

function borraNodo() { var oo=document.getElementById('caja') var hijo=document.getElementById('np')

66

oo.removeChild(hijo); }

ESTILO CSS Tabla de correspondencia entre propiedades CSS y propiedades de ‘style’ en DOM. Propiedades CSS Style background background background-color backgroundColor border border border-bottom, border-bottom-color, borderBottom, borderBottomColor, border-bottom-style, border-bottom- borderBottomStyle, borderBottomWidth width border-color borderColor border-left, border-left-color, borderLeft, borderLeftColor, border-left-style, border-left-width borderLeftStyle, borderLeftWidth border-right, border-right-color, borderRight, borderRightColor, border-right-style, border-right-width borderRightStyle, borderRightWidth border-style borderStyle border-top, border-top-color, borderTop, borderTopColor, border-top-style, border-top-width borderTopStyle, borderTopWidth border-width borderWidth bottom bottom clip clip color color display display font, font-familiy, font-size, fontfont, fontFamiliy, fontSize, fontStyle, style, fontVariant, fontWeight font-variant, font-weight height height left left letter-spacing letterSpacing line-height lineHeight list-style, list-style-type, list-stylelistStyle, listStyleType, listStyleImage, image, listStylePosition list-style-position margin, margin-left, margin-top, margin, marginLeft, marginTop, margin-right, margin-bottom marginRight, marginBottom overflow overflow padding, padding-left, padding-top, padding, paddingLeft, paddingTop, padding-bottom, padding-right paddingBottom, paddingRight position position right right text-align, text-indent, texttextAlign, textIndent, textDecoration, decoration, textTransform text-transform top top visibility visibility width width 67

z-index

zIndex

Yusef Hassan Montero y Francisco Jesús Martín Fernández, 2003 ©

68

Scripts Para Los Navegadores 6.0 Por Scott Andrew LePera

Traduccil espa‫ﬠ‬de Jose Luis Pumarega y Fernando Gutierrez Revisado en Enero 12, 2001 Por fin alguien entra en razón. Despues de años de espezanza, rezando, y en algunos casos arrastrándonos, por fín ha salido un navegador que soporta las recomendaciones del World Wide Web Consortium para el Document Object Model. Cierto, Netscape 6.0 está lejos de ser perfecto. Pero su amplio soporte del DOM-1 y CSS-1 es un gran paso en la dirección correcta. Esperemos que sea el primero en una linea de navegadores populares y exitosos que serán adoptados de modo entusiasta por el público que navega por internet y que nos haga la vida más sencilla a los desarrolladores. De modo que ¿qué nos importa a nosotros como creadores de scripts? Todo, por que la estructura del DOM expone nuevos y poderosos métodos que nos permiten acceder y manipular los elementos de cualquier documento. Esto va más allá del DHTML y de las etiquetas
; es el control absoluto sobre cada elemento de la página vía JavaScript. Con métodos de Script DOM-1, puedes: - Crear nuevos elementos al vuelo. Olvídate de usar document.write para insertar HTML y CSS en tu página, no más constructores de objetos. El DOM te permite crear elementos completos de la nada. - Capturar todas las etiquetas del documento, o sólo el texto, sin las etiquetas. - Insertar nuevo texto, y cambiar o eliminar texto de cualquier elemento sin recurrir a innerHTML o document.write() - Mover partes completas del documento, o eliminar partes o fragmentos y trabajar con ellos. - Y lo mejor: Todos estos nuevos métodos deben funcionar en cualquier navegador compatible con DOM-1. Adios a la detección del navegador. No necesitamos construir

69

diferentes versiones de la misma página para distintos navegadores. Un conjunto común de técnicas de script es todo lo necesario. Este artículo tratará de ser una introducción no excesivamente técnica a los scripts del DOM, prestando relevancia al Netscape 6. Aquellos que quieran seguir estrictamente las referencias (¿?) querrán echar un ojo a la especificación del W3C respecto a DOM y CSS en profundidad, papeles blancos llenos de jerga técnica. ¿Estás dispuesto? Echemos un ojo al asuntillo del DOM.

Parte 1: Nuevas Piezas Del Puzzle La mejor manera de concebir el DOM es como un árbol gigante, con un tronco que representa el documento, y muchas ramas que representan diferentes elementos de la página. Cada parte del árbol es llamada nodo. Los nodos pueden ser etiquetas, como HTML o XML, o atributos de esas etiquetas, como "align=left" o "size=3". Los nodos también pueden ser cadenas de texto en el documento, como las que estás leyendo ahora mismo. Un nodo puede ser parte de otro más grande, llamado el padre (parent) de ese nodo. Un nodo puede también ser padre de cualquier número de nodos hijos (child nodes). Por ejemplo, el documento es un nodo. Si el documento contiene imágenes, el documento es el padre de los nodos imagen, que son sus hijos. Al mismo tiempo las imágenes son padres de sus atributos, como nodos hijos. Exactamente igual que un árbol: es padre de la rama, que es padre de la hoja. Así es el Document Object Model. Buf!! ¿lo has cogido? En los navegadores de cuarta generación, estábamos limitados por el número de nodos que podíamos manipular con JavaScript. Con soporte DOM completo aplicaciones como Netscape 6 y Mozilla podremos acceder a cualquier elemento -o nodo-. El cómo somos capaces de acceder a ellos depende principalmente del atributo ID del elemento. Echemos un ojo a dos importantes métodos DOM que nos permiten hacer todo esto. getElementById()

70

Si conoces el ID de un elemento, puedes acceder a el con el nuevo método getElementById(). Simplemente pásale el ID del elemento como parámetro y devolverá la referencia a ese elemento.


Para recoger esto en JavaScript, deberíamos usar: x = document.getElementById("miElemento");

X es ahora una referencia al elemento
. A partir de esto, podemos usar x para manipular la etiqueta
, como veremos en breve. getElementsByTagName() Otro modo de recoger elementos es usando getElementByTagName(). Este método toma el tipo de etiqueta (tag) como parámetro y devuelve una colección (o array) de todos los elementos con ese tipo en el documento. Por ejemplo, si quisieras recoger todas las imágenes del documento, podrías hacer esto: x = document.getElementsByTagName("IMG");

X es ahora una colección de referencias a los elementos del documento. Para acceder a un elemento particular en la colección, digamos la primera imagen, podríamos referirnos a ella por su número ordinal o posición dentro de la colección. x = document.getElementsByTagName("IMG"); firstImage = x.item(0) ;

getElementsByTagName() recoge todos los elementos coincidentes tanto si tienen un atributo ID como si no, lo cual es extremadamente útil para etiquetas a las que normalmente no se asignan ID, como

y . getElementById() y getElementsByTagName() son modos muy potentes de atravesar el árbol DOM hacia las ramas más lejanas. En vez de usar document.algo.algoMás para alcanzar un elemento, puedes dirigirte directamente a él, o a elementos de su mismo tipo, con estos dos métodos.

71

Parte 2: Magia Elemental getElementById() y getElementsByTagName() se utilizan para recuperar elementos. Pero los elementos tienen su propio conjunto de métodos que facilitan la manipulación de elementos sin necesidad de realizar scripts. Considera la siguiente etiqueta de imagen para nuestros próximos ejemplos:

Para recuperar este elemento en Java-Script, usaríamos: x = document.getElementById("myImg")

Ahora observa lo que los métodos DOM x tienen disponible para ello: getAttribute() getAttribute() devuelve el valor del atributo que tú le pases. Para obtener el valor SRC de esta etiqueta via Java-Script, podríamos hacer esto: myValue = x.getAttribute("src")

myValue podría entonces contener la cadena "jabberwocky.gif." setAttribute() setAttribute() te permite asignar el valor del atributo que tú le pases. Utiliza dos argumentos: el nombre del atributo y el valor que se le asigna. Para cambiar el valor ALIGN de esta etiqueta de izquierda por el de derecha, podemos hacer esto: x.setAttribute("align","right")

removeAttribute() removeAttribute() simplemente quita el atributo que le pases. Para quitar el atributo ALIGN de esta etiqueta: x.removeAttribute("align")

getElementsByTagName() Hey, espera. ¿No hemos visto esto antes? Lo has pillado. Lo vimos originalmente en el objeto documento, pero cada elemento también dispone de este método. La diferencia es que el método del documento devuelve todas las etiquetas que coincidan para 72

todo el documento, mientras que el método del elemento devuelve las etiquetas coincidentes sólo para ese nodo. Veamos un ejemplo:

Esta es la celda Uno Esta es la celda Dos Esta es la celda Tres
Esta es la celda Cuatro Esta es la celda Cinco Esta es la celda Seis


Tenemos dos tablas, tableOne y tableTwo respectivamente. Podemos usar getElementsByTagName() con el documento para recuperar todos los elementos de celda de tabla en esta página, de esta forma: x = document.getElementsByTagName("TD")

Lo cuál nos devolverá x como una colección de las seis etiquetas . Pero quizás preferiríamos extraer sólo las etiquetas de tableTwo. Para hacer esto, podemos usar primero getElementById() para recuperar el elemento tabla, y entonces usar getElementsByTagName() para recuperar sólo aquellas celdas de este elemento tabla: x = document.getElementById("tableTwo") tableCells = x.getElementsByTagName("TD")

tableCells se convierte ahora en una colección de sólo tres etiquetas contenidas en tableTwo.

Parte 3: Gran Papá document Echemos un ojo hacia atrás al Gran Nodo Padre de Todas Las Cosas - el documento. Ya sabemos que el documento tiene métodos para recoger cualquier elemento a placer. Pero, ¿qué mas puede hacer? Muchas, muchísimas cosas. El documento puede crear nuevos nodos al vuelo, destruirlos, moverlos alrededor de la página, lo que sea. Es perversamente divertido. Y lo hace sin usar document.write() o constructores de nuevos objetos (No te asustes, esos métodos siguen ahí). Echemos un ojo a los métodos de Script de DOM que permiten que esto ocurra. 73

createElement() createElement() permite crear nuevas etiquetas. ¡Si! ¡Puedes crear estructuras HTML completas de la nada. ¡Sorprende e impresiona a tus amigos! ¡Vamos a hacer uno ahora mismo! miImagen = document.createElement("IMG");

¡Ta-da! ¡Simple como un cubo! ¡Acabamos de crear una nueva etiqueta ! Podemos hacer esto para crear qualquier etiqueta válida que queramos. Pero espera. ¿donde se ha creado la imagen? Aún no está en el documento. ¿Por qué? Por que para cada nuevo elemento que quieras que sea mostrado, debes decirle al documento dónde añadirlo dentro del árbol del mismo documento. Esto es algo importante que debes de entender cuando uses creaeteElement(). No estás insertando HTML como podrías hacerlo con document.write(). A cambio, estás creando un nuevo elemento crudo, esperando a ser definido e insertado como un hijo del nodo document. Está flotando en el Limbo, esperando a que alguien le de forma y figura. En el ejemplo anterior, nuestra etiqueta recien nacida no tenía ni ID ni SRC ni un lugar en el documento aún. Así que definámoslo: miImagen.setAttribute("id","imagenUno"); miImagen.setAttribute("src","jabberwocky.gif");

Ahora todo lo que necesitamos es añadirlo al cuerpo del documento. Para ello, usaremos el método para nodos DOM appendChild(): docBody = document.getElementsByTagName("body").item(0); docBody.appendChild(miImagen);

Fíjate ahora cómo hemos recogido la etiqueta del documento y la hemos usado en vez de añadirlo directamente al documento. El motivo de esto es que es el nodo dentro del documento en el que todo se muestra. appendChild() es un método que funciona en cualquier nodo. En el próximo ejemplo, construiremos una tabla de 3x3 de dentro a fuera, primero crearemos el cuerpo, filas y columnas, y las añadiremos a la tabla principal. Finalmente añadiremos la tabla completa al cuerpo del documento. docBody = document.getElementsByTagName("body").item(0); myTable = document.createElement("TABLE"); myTable.id = "TableOne"; myTableBody = document.createElement("TBODY"); for (i = 0; i < 3; i++){

74

row = document.createElement("TR"); for (j = 0; j < 3; j++){ cell = document.createElement("TD"); row.appendChild(cell); } myTableBody.appendChild(row); } myTable.appendChild(myTableBody); docBody.appendChild(myTable);

Puedes ver por qué tiene sentido construir códigos HTML complejos comenzando primero por los nodos y luego ensamblarlas en estructuras mayores. createTextNode() Hmm. Nuestra tabla está un poco, bien, vacía. Añadamos algo de texto con el método DOM createTextNode(). createTextNode() simplemente crea un nodo genérico que no es otra cosa que una cadena de texto. Puedes añadirlo a otros nodos para darlos contenidos dinámicos. Añadamos algo de código a nuestro bucle crea-celdas. for (j = 0; j < 3; j++){ cell = document.createElement("TD"); textVal = "Cell" + i + "_" + j; textNode = document.createTextNode(textVal); cell.appendChild(textNode); row.appendChild(cell); }

Ahora nuestras celdas tienen algo de texto. ¿Y qué pasa con atributos como BGCOLOR o VALIGN? Podemos asignarlos mediante el método DOM setAttribute(): for (j = 0; j < 3; j++){ cell = document.createElement("TD"); cell.setAttribute("WIDTH","50"); cell.setAttribute("HEIGHT","50"); textVal = "Cell" + i + "_" + j; textNode = document.createTextNode(textVal); cell.appendChild(textNode); row.appendChild(cell); }

Vamos a acabar. Aquí está el código completo para nuestra funión generadora de tablas. function construyeTabla(){ docBody = document.getElementsByTagName("body").item(0); myTable = document.createElement("TABLE"); myTable.id ="TableOne"; myTable.border = 1; myTableBody = document.createElement("TBODY"); for (i = 0; i < 3; i++){ row = document.createElement("TR"); for (j = 0; j < 3; j++){ cell = document.createElement("TD"); cell.setAttribute("WIDTH","50");

75

cell.setAttribute("HEIGHT","50"); textVal = "Cell" + i + "_" + j; textNode = document.createTextNode(textVal); cell.appendChild(textNode); row.appendChild(cell);

} myTableBody.appendChild(row);

} myTable.appendChild(myTableBody); docBody.appendChild(myTable); } window.onload = construyeTabla;

Llamamos a la funcion construyeTabla() en el evento window.onload dado que tenemos que estar seguros de que el elemento existe antes de añadirle una tabla. Prueba a copiar el código y pegarlo entre etiquetas <SCRIPT> en el head de un documento HTML en blanco, y abrelo con IE 5.0 o Netscape 6.0 para ver el efecto completo.

Parte 4: Siguiendo A Tus Nodos ¿Hemos llegado hasta aquí? Bien, aún queda mucho más. El DOM provee de un conjunto de métodos y propiedades que todos los nodos pueden usar. Muchos de ellos tienen que ver con manipulación de nodos hijos o padres. Echemos un ojo: (ACTUALIZADO 11.17.00: La versión final de Netscape 6 contiene un bug que puede colgar al navegador cuando se usen los métodos removeChild o replaceChild, así que proceded con precaución. Ojo al parche -nunca mejor dicho- de la próxima actualización.) Métodos para Nodos appendChild(hijo) Ya lo has visto en acción, de hecho. Permite añadir un nuevo nodo a otro existente. replaceChild(nuevo,viejo) Permite eliminar un nodo y reemplazarlo por otro. Nuevo es el ID del nuevo nodo, y viejo es el ID del nodo que quieres reemplazar. nuevaFila = document.createElement("TR"); cuerpoTabla = document.getElementById("miTabla"); viejaFila = document.getElementByTagName("TR").item(0); cuerpoTabla.replaceChild(nuevaFila,viejaFila);

removeChild(hijo) eliminará el nodo hijo del documento. Hijo es el nombre del nodo que quieres eliminar. El siguiente ejemplo elimina una fila de un elemento Table.

76

cuerpoTabla = document.getElementById("miTabla"); hijoUno = document.getElementByTagName("TR").item(0); tableBody.removeChild(hijoUno)

Piensa que al eliminar un elemento eliminas además sus hijos. insertBefore(nuevo,referencia) te permite insertar un nuevo nodo justo antes que otro. Nuevo es el nuevo nodo que quieres insertar. Referencia es el nombre del nodo antes del cual quieres insertarlo. nuevaFila = document.createElement("TR"); cuerpoTabla = document.getElementById("miTabla"); todasLasFilas = tableBody.getElementByTagName("TR"); ultimaFila = allRows.item(allRows.length-1); tableBody.insertBefore(nuevaFila,ultimaFila);

hasChildNodes() devuelve un valor Booleano true si el nodo tiene hijos. Fíjate en que appendChild(), replaceChild(), removeChild() e insertBefore() sólo aceptan referencias a elementos, no los ID de esos elementos, como argumentos. Por ejemplo, si quisieramos eliminar una etiqueta con el ID "miEtiqueta" la siguiente sintaxis sería incorrecta: removeChild("miEtiqueta");

La correcta sería: removeChild(document.getElementById("miEtiqueta"));

Propiedades de los Nodos En adición a esos métodos, los nodos tienen las siguientes propiedades: nodeName devuelve simplemente el nombre de la etiqueta HTML como una cadena de caracteres. No es lo mismo que el atributo NAME de la etiqueta, si no una cadena que representa el tipo de etiqueta. Por ejemplo, el nodeName de una celda de una tabla devolverá "TD". Esto es útil para saber si una etiqueta es de un tipo particular: x = document.getElementById("miElemento"); if (x.nodeName == "IMG") alert("miElemento es una etiqueta IMG");

nodeType devuelve un entero que representa el tipo de nodo de un elemento (NO el tipo de etiqeta) Las que con toda certeza usarás con más frecuencia serán elementos (1), atributo (2) y texto (3). Esto es útil para saber si un nodo es de un tipo determinado. x = document.getElementById("miElemento"); if (x.nodeType == 1) {alert("miElemento es un nodo de tipo elemento");}

77

else if (x.nodeType == 2) {alert("miElemento es un nodo de tipo atributo");} else if (x.nodeType == 3) {alert("miElemento es un nodo de tipo texto");}

nodeValue refleja el valor de un nodo dado. Esto se usa comunmente para obtener y cambiar el contenido o valor de un nodo. Para recoger el valor del quinto nodo en nuestro elemento: a = document.getElementById("miElemento"); b = a.childNodes.item(4).nodeValue;

Para los nodos de atributo, nodeValue devuelve el valor del atributo. Para nodos de tipo texto, nodeValue devuelve el texto como una cadena. parentNode es una referencia al nodo padre del nodo en cuestión. Es útil cuando no estás seguro de donde estás o de cual es el nodo padre de otro nodo: x = document.getElementById("miElemento"); xParent = x.parentNode;

childNodes es una colección de los nodos hijos de un nodo en particular. Puedes usar esto para saber el número de hijos que tiene un nodo, o acceder a caulquiera de sus hijos mediante el índice de esa colección. Por ejemplo, para conocer el número de hijos que tiene un nodo, podrías hacer esto: a = document.getElementById("miElemento"); b = a.childNodes.length;

Para acceder al tercer nodo hijo del elemento: a = document.getElementById("miElemento"); b = a.childNodes.item(2);

firstChild y lastChild apuntan directamente al primer y último nodo de la colección childNodes. Es, sencilamente, una manera de acceder a ellos. a = document.getElementById("miElemento"); PrimerNodoDea = a.firstChild; UltimoNodoDea = a.lastChild;

Parte 5: Sumario Uaaaaaaj. Hay un montón de material para recordar. Las siguientes tablas recogen los distintos métodos DOM y propiedades que hemos cubierto. Métodos del Documento: getElementById(id)

Devuelve una referencia al elemento llamado. 78

Devuelve una colección de todos los getElementsByTagName(nombre) elementos coincidentes en el documento. Crea un nuevo elemento del tipo createElement(nombre) nombrado. createTextNode(texto) Crea un nuevo nodo de puro texto. Métodos de los Elementos: Devuelve el valor del atributo pasado como parámetro. setAttribute(id,valor) Asigna un nuevo valor al atributo. Elimina el atributo pasado como removeAttribute(id) parámetro junto con su valor. Devuelve una colección de todos los getElementsByTagName(nombre) elementos coincidentes en el nodo. getAttribute(id)

Métodos de los Nodos: Añade un nuevo nodo hijo al nodo. Elimina un nodo hijo del removeChild(hijo) nodo . Reemplaza un nodo hijo antiguo replaceChild(nuevoHijo,viejoHijo) por otro nuevo. Inserta un nodo antes del insertBefore(nuevoHijo,referencia) anterior en la jerarquía. Devuelve un true booleano si hasChildNodes() el nodo tiene nodos hijo. appendChild(hijo)

Propiedades de los Nodos: nodeName nodeType nodeValue parentNode

Contiene el nombre del nodo como una cadena de texto. Contiene el tipo de nodo como un entero. Contiene el valor de un nodo en formato útil. La referencia del nodo padre de este nodo. Una colección que contiene referencias a los nodos childNodes hijos de este nodo en cuestion. La referencia al primer nodo hijo en la colección firstChild childNodes. La referancia al último nodo hijo en la coleción lastChild childNodes. Conclusión Como probablemente estés viendo, la funcionalidad del W3C DOM hace posible tener documentos extremadamente dinámicos. Cuando el resto de los navegadores se adecúen al standard, nuestras vidas como desarrolladores serán mucho más sencillas. 79

Podremos abandonar nuestros scripts de detección de navegadores, y ser libres de programar codigo auténticamente multi navegador sin dolores de cabeza. Es posible. Actualmente, depende de ti (¿qué significa esto, en cualquier caso?) seguir aprendiendo las especificaciones DOM-1 y CSS-1. Hemos cubierto la mayor parte del material importante aquí, pero hay mucho más de lo que ofrece el DOM. Emplea algo más de tiempo en el sitio del W3C, familiarízate con las especificaciones y estarás listo para hacerlas pasar por el aro. Feliz scripting! Aprende Más - Comenta este tutorial. - Encuentra algo más sobre Netscape 6 en developer.netscape.com - Aprende acerca del DOM, CSS y soporte standard en http://www.w3c.org/ - Unete a la causa del Web Standards Project http://www.webstandards.org/

80

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%> <sql:setDataSource driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/dietas" var="dietas" user="root" password="arsa0607"/> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select * from dietas"> Untitled Page <style type="text/css"> select{ position:absolute; left:120px; } .comidas{ overflow: auto; } <script language="javascript"> var ccantidad=0; var ccalorias=0; var idalimento="" var comida="comida"; var cuentalinea=0; function cambiaComida(lacomida) { comida=lacomida;

81

} function eventoCantidad(event) { if(window.event.keyCode==13) { //alert(idalimento); oo=document.getElementById(idalimento); var cadena="p"+idalimento; // alert(oo.value+ccalorias+"...."+cadena); oo2=document.getElementById(cadena); //alert("id "+oo2.id); var calculo=oo.value * ccalorias; totallinea=document.createTextNode(calculo+""); oo2.appendChild(totallinea); } } function creaPlato(alimento) { // alert("alimneto" +alimento.text); var cc= "tabla"+comida; tablade=document.getElementById(cc);//'tabladesayuno'); var ccc=comida+"cuerpotabla" cuerpota=document.getElementById(ccc);//'cuerpotabla'); linea= document.createElement("TR"); nplato= document.createElement("P"); nplato.style.fontSize=10; nplato.style.color="green"; nombrenuevoplato=document.createTextNode(alimento.text); cuentalinea++; idalimento=alimento.text+cuentalinea; nplato.appendChild(nombrenuevoplato); columna1= document.createElement("TD"); columna1.appendChild(nplato); linea.appendChild(columna1) cplato= document.createElement("P"); cplato.style.fontSize=10; cplato.style.color="green"; caloriasnuevoplato=document.createTextNode(alimento.value); ccalorias=alimento.value; cplato.appendChild(caloriasnuevoplato); columna2= document.createElement("TD"); columna2.appendChild(cplato); linea.appendChild(columna2) cantidad= document.createElement("INPUT"); cantidad.type="text" cantidad.id=alimento.text+cuentalinea; columna3= document.createElement("TD"); columna3.appendChild(cantidad); linea.appendChild(columna3); columna4= document.createElement("TD"); parrafototal= document.createElement("P"); parrafototal.id="p"+alimento.text+cuentalinea;

82

columna4.appendChild(parrafototal); linea.appendChild(columna4); cuerpota.appendChild(linea); tablade.appendChild(cuerpota); oo=document.getElementById(alimento.text+cuentalinea); oo.onkeypress = eventoCantidad; }

Peso Ideal



Lacteos <select id="Lacteos" name="Lacteos" style="width: 209px" onchange="creaPlato(Lacteos.options[Lacteos.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select * from dietas where Familia='Lacteos'">
Carnes <select id="Carnes" style="width: 209px" onchange="creaPlato(Carnes.options[Carnes.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select * from dietas where Familia='Carnes'">
Pescados <select id="Pescados" style="width: 209px" onchange="creaPlato(Pescados.options[Pescados.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select * from dietas where Familia='Pescados'">
Legumbres <select id="Legumbres" style="width: 209px" onchange="creaPlato(Legumbres.options[Legumbres.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select * from

83

dietas where Familia='Legumbres'">
Hortalizas <select id="Hortalizas" style="width: 209px" onchange="creaPlato(Hortalizas.options[Hortalizas.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select dietas where Familia='Hortalizas'">
Frutas <select id="Frutas" style="width: 209px" onchange="creaPlato(Frutas.options[Frutas.selectedIndex] )" > <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select dietas where Familia='Frutas'">
Verduras <select id="Verduras" style="width: 209px" onchange="creaPlato(Verduras.options[Verduras.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select dietas where Familia='Verduras'">
Dulces <select id="Dulces" style="width: 209px" onchange="creaPlato(Dulces.options[Dulces.selectedIndex] )"> <sql:query var="cursor" dataSource="${pageScope.dietas}" sql="select dietas where Familia='Dulces'">


* from

* from

* from

* from

Desayuno

Alimneto Calorias 100g. Cantidades de 100g. Total Calorias

Comida

Alimneto Calorias 100g. Cantidades de 100g. Total Calorias

Cena

Alimneto Calorias 100g. Cantidades de 100g. Total Calorias


85



86

A

A J

X

Con el siguiente ejercicio completamos todas las técnicas que se utilizan en la tecnología AJAX, también conocida como la nueva Web 2.0. Estas técnicas XML y el objeto XMLHttpRequest nos va a permitir obtener los datos que queramos visualizar en la página web dese un fichero XML que o bien se encuentre en el cliente , descargando el mismo desde la web o solicitando la información en formato XML desde un servlet de java. El objeto XMLHttpRequest nos permitirá solicitar la información XML justo en el momento en el que lo deseemos y así modificar la página (utilizando DOM) en el justo momento. De forma que no tendremos que emplear formularios que llamen a servlet o jsp que generen toda la página de nuevo si no que nos traeremos del servidor ( o desde un fichero xml ) la información que necesitemos en ese momento. Ejemplo:

Haremos el ejercicio de tres formas: 87

La primera desde una página html utilizamos un ojeto XMLHttpRequest para solicitar los datos de un servlet que devuelve la información generando código XML. Una vez recibido el código, con los datos xml, utilizamos DOM para accder al mismo y visualizarlo dentro de un TextArea.

La segunda desde una página html utilizamos un ojeto XMLHttpRequest para

solicitar los datos de un lee información de una base de datos genera un fichero XML y lee del mismo la información. La información que lee se la devuelve al cliente. Una vez recibido el código, con los datos xml, utilizamos DOM para accder al mismo y visualizarlo dentro de un TextArea.

La tercera utiliza la posibilidad que tiene javascript para cargar en memoria el

contenido de un fichero xml por medio de la instrucción : <xml id="writersXML" src="tiendaropa.xml">. A continuación llamamos a una función por medio de la cual utilizando el DOM leemos el contenido del objeto que hemos creado con la información xml : var imagenes= new Array(); var precios= new Array(); var tallas= new Array(); var colores= new Array(); function cargaXML() { var myXml; myXml=document.all("writersXML").XMLDocument;

escribirImagen=myXml.getElementsByTagName("imagen"); escribirPrecio=myXml.getElementsByTagName("precio"); escribirTallas=myXml.getElementsByTagName("tallas"); escribirColores=myXml.getElementsByTagName("colores") …. …. } Si no implementamos esta solución estudia el fichero ofertas.htm. de la aplicación carrito.

88

La primera

FICHERO leeXML.HTML Desde este fichero se llama a los distintos servlet que realizan la tarea de leer el codigo xml. Tabién se encarga de visualizar los datos. Cargar y leer Xml desde Java Script <script type="text/javascript"> function cargar() { idField=document.getElementById('idField'); //var url = "http://localhost:8080/alquiler/trabajarconXstream"; var url = "http://localhost:8080/alquiler/LeerCliente"; //var url = "http://localhost:8080/alquiler/devuelveXml.jsp"; if (window.XMLHttpRequest) { alert("window.XMLHttpRequest"); req = new XMLHttpRequest(); } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); alert("Microsoft.XMLHTTP"); } alert("url..............: "+url) req.open("POST", url, true); req.onreadystatechange = callback; req.send(null); } function callback() { //alert("callback") alert("req.readyState"+req.readyState); if (req.readyState == 4) { if (req.status == 200) { // update the HTML DOM based on whether or not message is valid parseMessage(); } } } function parseMessage() { var message = req.responseXML.getElementsByTagName("message")[0]; alert("Mensaje recibido "+message); alert("Mensaje recibido "+ req.responseXML) var todo=""; for(j=0;j<req.responseXML.getElementsByTagName("libro").length;j++) { var message = req.responseXML.getElementsByTagName("libro")[j]; for(i=0;i<message.childNodes.length;i++) 89

{ alert("Elemento :"+message.childNodes[i].tagName +"..."+message.childNodes[i].firstChild.nodeValue) todo=todo+message.childNodes[i].tagName +"..."+message.childNodes[i].firstChild.nodeValue+"\n"; } } alert(todo); // setMessage(message.childNodes[0].nodeValue); setMessage(todo); } function setMessage(message) { alert(" setMessage" +message) ccaja=document.getElementById('caja'); ccaja.value=message; /* var p=message.indexOf("-"); if(p==-1){ var cajaNombre = document.getElementById("Nombre"); cajaNombre.value= message ; } else { var nombreApellidos=message.substr(0,p); var pago=message.substr(p+1,message.length); var cajaNombre = document.getElementById("Nombre"); cajaNombre.value= nombreApellidos ; var cajaPago = document.getElementById("cpago"); cajaPago.value= pago ; }*/ }

/* var request=null; //alert("Carga xml"); if(window.XMLHttpRequest){ alert("Soporto XMLHttpRequest"); } else if(window.ActiveXObject) { alert("Soporto ActiveXObject"); request=new ActiveXObject("Microsoft.XMLHTTP"); if(! request){ alert("NO microsoft.XMLHTTP"); 90

} else { request=new ActiveXObject("Msxml2.XMLHTTP"); alert("SI microsoft.XMLHTTP");} } var url = "LeerCliente"; request.open("POST", url, true); request.onreadystatechange = callback; request.send(null); function callback() { alert("callback") //alert("req.readyState"+req.readyState); if (request.readyState == 4) { if (request.status == 200) { // update the HTML DOM based on whether or not message is valid parseMessage(); } } } function parseMessage() { // alert("parseMessage") var message = request.responseXML.getElementsByTagName("message")[0]; alert("Mensage :"+ message +" recibido"); //setMessage(message.childNodes[0].nodeValue); } }*/
<script type="text/javascript"> /* var url = "LeerCliente?nif=" + escape(idField.value); if (window.XMLHttpRequest) { //alert("window.XMLHttpRequest"); req = new XMLHttpRequest(); } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); // alert("Microsoft.XMLHTTP"); } //alert("url..............: "+url) req.open("GET", url, true); 91

req.onreadystatechange = callback; req.send(null); } function callback() { //alert("callback") //alert("req.readyState"+req.readyState); if (req.readyState == 4) { if (req.status == 200) { // update the HTML DOM based on whether or not message is valid parseMessage(); } } } function parseMessage() { // alert("parseMessage") var message = req.responseXML.getElementsByTagName("message")[0]; setMessage(message.childNodes[0].nodeValue); } function setMessage(message) { // alert(" setMessage" +message) var p=message.indexOf("-"); if(p==-1){ var cajaNombre = document.getElementById("Nombre"); cajaNombre.value= message ; } else { var nombreApellidos=message.substr(0,p); var pago=message.substr(p+1,message.length); var cajaNombre = document.getElementById("Nombre"); cajaNombre.value= nombreApellidos ; var cajaPago = document.getElementById("cpago"); cajaPago.value= pago ; } } */ FICHERO LeerCliente.java Servlet que genera código XML que envía a la página leeXml.html package alquiler; import javax.servlet.*; import javax.servlet.http.*; 92

import javax.servlet.http.HttpSession; import java.io.*; import java.util.*; import java.sql.*; public class LeerCliente extends HttpServlet { static final private String CONTENT_TYPE = "text/html"; public void init(ServletConfig config) throws ServletException { } //Procesar una petición HTTP Get public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Estroy eb el Servlet.." + request.getMethod() +".."+request.getPathInfo()); String dato="Loly"; dato=""; dato=dato+""; // dato=dato+""; dato=dato+""; dato=dato+""; dato=dato+""; dato=dato+" Introducion a XML XSL"; dato=dato+"<editorial>Anaya"; dato=dato+""; dato=dato+""; dato=dato+"Programacion en Widnows 2000"; dato=dato+"<editorial>Paraninfo"; dato=dato+""; dato=dato+""; System.out.println("DATO: "+dato); dato="<message>"+dato+""; response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); response.getWriter().write(dato);

93

} //Procesar una petición HTTP Post public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } //Limpiar recursos public void destroy() { } } Para que fucnione en tomcar necesitamos implementar el siguiente codigo en el fichero web.wml <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/webapp_2_4.xsd" version="2.4"> alquiler <servlet> <servlet-name>LeerCliente <servlet-class>alquiler.LeerCliente <servlet-mapping> <servlet-name>LeerCliente /LeerCliente <servlet> <servlet-name>lc <servlet-class>alquiler.lc <servlet-mapping> <servlet-name>lc /lc <servlet> <servlet-name>trabajarconXstream <servlet-class>alquiler.trabajarconXstream <servlet-mapping> <servlet-name>trabajarconXstream /trabajarconXstream

94

La segunda Aquí solamente necesitamos el servlet trabajarconXstream.java que leera la información desde una base de datos , la copiará en un fichero xml , lo leera y devolver al información a leeXml.html para que la visualice. Fichero trabajarconXstream.java package alquiler; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.http.HttpSession; import java.io.*; import java.util.*; import java.sql.*; import com.thoughtworks.xstream.XStream; import org.gjt.mm.mysql.*; import javax.sql.rowset.WebRowSet; import java.awt.HeadlessException; import com.sun.rowset.WebRowSetImpl; public class trabajarconXstream extends HttpServlet { static final private String CONTENT_TYPE = "text/html"; WebRowSet wr ; private java.sql.Connection cn; private java.sql.ResultSetMetaData estructura; boolean nuevo_registro; private String isql=""; // Objetos para trabajar con WerRowSet String UsuarioBaseDeDatos="root"; String PasswordBaseDeDatos="alpiap"; String DriverBaseDeDatos = "org.gjt.mm.mysql.Driver"; String OrdenBaseDeDatos = "select * from clientes"; FileWriter fGrabacion; FileReader fLectura; int [] keyCols ={1};

String urlBd = "jdbc:mysql://localhost/datos"; WebRowSet receiver; public void init(ServletConfig config) throws ServletException {

try { 95

Class.forName(DriverBaseDeDatos); Connection con = DriverManager.getConnection(urlBd, UsuarioBaseDeDatos, PasswordBaseDeDatos); // Create a WebRowSet and set properties. WebRowSet sender = new WebRowSetImpl(); sender.setUrl(urlBd); sender.setUsername(UsuarioBaseDeDatos); sender.setPassword(PasswordBaseDeDatos); sender.setCommand(OrdenBaseDeDatos); sender.setKeyColumns(keyCols); // Now populate the WebRowSet sender.execute(); fGrabacion = new FileWriter("g:/glXML/clientes.xml"); sender.writeXml(fGrabacion); fGrabacion.flush(); fGrabacion.close(); sender.close(); javax.swing.JOptionPane.showMessageDialog(null, "Fin Grabación XML"); } catch (HeadlessException ex) { } catch (IOException ex) { } catch (SQLException ex) { } catch (ClassNotFoundException ex) { } try { receiver = new WebRowSetImpl(); fLectura = new FileReader("f:/glXML/clientes.xml"); receiver.readXml(fLectura); // receiver.acceptChanges(); } catch (HeadlessException ex) {ex.printStackTrace(); } catch (FileNotFoundException ex) {javax.swing.JOptionPane.showMessageDialog(null, "Fichero XML Sin Datos -- Ejecute la Opción del Menu : Crear XML"); } catch (SQLException ex) {ex.printStackTrace(); }

96

} //Procesar una petición HTTP Get public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Estroy +".."+request.getServletPath()); String dato="";

eb

el

Servlet..Xstream"

+

request.getMethod()

dato=dato+"";

try { receiver.beforeFirst(); while (receiver.next()) { dato=dato+""; dato=dato+""+receiver.getString("Nombre")+""; dato=dato+"<editorial>"+receiver.getString("Direccion")+""; dato=dato+""; } dato=dato+"
"; } catch (SQLException ex) { } System.out.println("DATO: "+dato); dato="<message>"+dato+""; response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); response.getWriter().write(dato);

} //Procesar una petición HTTP Post public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } //Limpiar recursos public void destroy() { } }

97

Propiedades y eventos del objeto Onreadystatechange Es una función de rellamada. La función de esta propiedad se llama siempre que cambia readyState readyState Es un número que puede tomar los siguiente valores: 0 Significa sin inicializar, es decir que aun no se ha ejecutado el método open() 1 Significa cargando, que aún no se ha llamado a send(). 2 Significa cargado, es decir ya se ha llamado al método send(). 3 Significa interactuando y responseText contiene datos parciales. 4 Significacompletado responseText. Es una cadena. Representa la respuesta recibida desde el servidor web. responseXML. Es Objeto document de DOM. Son los datos enviados desde le servidor en formato XML. status Código de estado de la respuesta . 200 significa respuesta recibida correctamente y 404 respuesta de no encontrado el servidor o la página web solicitada. statusText Es una cadena con el mensaje asociado al código de status de la respuesta HTTP. abort() Cancela la petición http. open(metodo POSt o GET,cadena url,true/false) Prepara la petición que se va a enviar al servidor mediante el protocolo de comunicación http. True/false especifica si es una conexión asincrona o no. send(cadena) Envía la petición http.send(null); Ejemplo: var url = http://localhost:8080/alquiler/LeerCliente if (window.XMLHttpRequest) { alert("window.XMLHttpRequest"); req = new XMLHttpRequest();} else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); alert("Microsoft.XMLHTTP");} req.open("POST", url, true); req.onreadystatechange = callback; req.send(null); } function callback() { alert("req.readyState"+req.readyState); if (req.readyState == 4) { if (req.status == 200) { parseMessage();} } function parseMessage() { var message = req.responseXML.getElementsByTagName("message")[0]; alert("Mensaje recibido "+message);}

}

98

JSON

La alternativa a XML busca más información Fichero de datos: datos.jso [({"NOMBRE":"Gabriel Lucia Velazquez","EDAD":6}), ({"NOMBRE":"Angel Lucia Velazquez","EDAD":8}), ({"NOMBRE":"Luis Lucia Velazquez","EDAD":8})]; Fichero html con el código JavaScript que procesa los datos leidos del fichero datos.jso:json.htm <%@ Language=JavaScript %> Untitled Page <xml id="articulosXML" src="datos.jso"> <script language="javascript" type="text/javascript"> myXml=document.all("articulosXML").XMLDocument; function carga() { var part=myXml.getElementsByTagName("datos"); alert(part.length); dato=part.item(0).firstChild.nodeValue; alert(dato); var objeto = eval(dato); var nr = objeto.length ; for(i=0;i
Edad : "+objeto[i].EDAD);

} }

99

Related Documents

Javascript Apuntes
March 2021 0
Javascript
January 2021 2
Javascript
February 2021 1
Javascript
January 2021 2
Javascript
January 2021 2
Javascript
January 2021 2

More Documents from "Nancho David"

Javascript Apuntes
March 2021 0