Pueden utilizarse indistintamente ficheros muultimedia con las
extensiones .wav, .aiff, .au, .mid, .mp3, .mpg, .mpeg, .avi, .wmv, .rm,
etc., etc. Los navegadores no admiten directamente ningún tipo de
formato multimedia por defecto, y es necesario cargar un plugin, que el
cliente tendrá que buscar e instalar.
Un plugin es un pequeño programa que hará las veces de conector entre el
navegador y el fichero multimedia, es decir, que dotará al navegador de
una cierta capacidad que de serie no tiene. Los plugins no solamente
son necesarios para reproducir los ficheros multimedia, sino también
para poder cargar cualquier otro tipo de fichero que no sea HTML, que es
el único formato que realmente entienden los navegadores.
Casi todos los navegadores precisarán de un plugin para reproducir
cualquier tipo de formato (multimedia o no), excepto el Internet
Explorer que echa mano de los ActiveX propios de los sistemas operativos
Windows.
El primer elemento disponible en HTML para los ficheros multimedia fue <EMBED>.
Este elemento, que en realidad nunca llegó a estar incluido
oficialmente en el lenguaje por la w3c, todavía funciona en todos los
navegadores modernos, pero presenta algunos problemas, que al no estar
sujeto a estandarización alguna, ha provocado que cada navegador
interprete a su manera las cosas. No está en la especificación del nuevo
XHTML, que recomienda el uso del elemento <OBJECT> para estos menesteres.
<EMBED> cuenta con un buen número de atributos: SRC, AUTOSTART, LOOP, STARTTIME, ENDTIME, VOLUME, WIDTH, HEIGHT, ALIGN, CONTROLS y HIDDEN.
SRC Indica dónde está el fichero a reproducir, pero no puede
utilizarse solo, necesita la compañía de otros atributos del elemento,
concretamente los que definen el tamaño de la consola (que es un icono
parecido al teclado que tiene un casette pequeño): WIDTH (largo) y HEIGHT (alto)
Otro atributo de EMBED es AUTOSTART con dos posibles valores: FALSE (por defecto) y TRUE,
y como ya habrás deducido, TRUE hace que comience la reproducción
inmediatamente después de cargar la página, y sin necesidad de pulsar el
botón "start" de la consola.
El siguiente atributo a analizar es HIDDEN que sólo tiene un valor: TRUE,
y hace invisible la consola, pero evidentemente, si es invisible no
puedes activar el sonido, y por tanto lo hace él mismo, siempre que no
hayas puesto AUTOSTART=FALSE, claro.
Un atributo de repetición no podía faltar, y lo tenemos en LOOP y sus tres posibles valores: FALSE (por defecto), TRUE que fuerza a la repetición sin fin de la audición, e INTEGER donde INTEGER es el número de veces que deseas que se repita la audición.
No es obligado comenzar una audición por el principio del fichero.
Imagínate que tienes una serie de instrucciones habladas, y quieres dar
la oportuna en cada momento, no todas de golpe. Para esto tenemos los
atributos STARTTIME=mm:ss y ENDTIME=mm:ss donde mm son los minutos y ss los segundos del punto de comienzo o fin de la audición. Cuidado: los valores hay que darlos con dos dígitos:
Por último tenemos el atributo ALIGN y sus valores TOP, BOTTOM, CENTER, LEFT, RIGHT, MIDDLE y TEXTTOP que funcionan igual que sus respectivos del elemento IMG,
es decir, que no tiene efectos sobre el sonido o el vídeo, sino sobre
la imagen de la consola y su alineación con el texto de la página.
He aquí un breve ejemplo con los atributos básicos:
Funciona bien con todos los navegadores, excepto con Opera.
El elemento <OBJECT> </OBJECT>
Este nuevo elemento pretende evitar la necesidad de continuar creando
elementos fijos cada vez que aparece un nuevo formato de ficheros, como
ocurrió, por ejemplo, con los multimedia y EMBED. En efecto, puesto que
EMBED no ha resuelto las diferencias entre navegadores a la hora de
cargar los distintos formatos, el XHTML ha implementado un elemento que
puede incluir todos los parámetros que el formato a cargar precise, pero
no con parámetros fijos como hasta ahora, sino "a la medida" de cada
uno y tratándolos como objetos independientes. Como "objeto" se
entenderá cualquier fichero externo, incluso HTML, que deba mostrarse en
la página.
En el nuevo XHTML se ha eliminado el elemento iframe que era utilizado para insertar una ventana con contenido independiente al de la página que la soporta. Por ejemplo:
<IFRAME id="indice" SRC="indice.htm" WIDTH="600" HEIGHT="150"
FRAMEBORDER="1" MARGINWIDTH="5" MARGINHEIGHT="5"
SCROLLING="Auto"></IFRAME>
Y esta es la forma de sustituirlo:
<object id="indice" type="text/html" data="indice.htm" style="width:500; height:200px;">
<p>Texto alternativo, si la página no es encontrada</p>
</object>
Y para un gráfico sustituyendo a <IMG>:
<object data="sugeren.gif" type="image/gif">
<p>Contenido alternativo, si el gráfico no es encontrado</p></object>
Dependiendo del tipo de fichero a tratar, no todos los navegadores
funcionan correctamente con OBJECT. Los más conocidos, como Firefox, IE,
Opera, Chrome o Safari, en general, con los tipos de fichero más
habituales, suelen funcionar bastante bien si se afina la
parametrización (<param name="valor">). Puede no resultar fácil
encontrar plugins para algunos tipos de fichero. Y por supuesto, los
parámetros necesarios pueden no ser los mismos para todos los
navegadores.
En el siguiente ejemplo se muestra el código mínimo necesario para
reproducir un fichero .mp3 y que generalmente, con todos los navegadores
excepto el IE, solicitará al cliente que instale el plugin de QuickTime
si no lo tiene ya:
En la sintaxis de este elemento son clave los dos primeros atributos de la primera línea:
data indica la ruta del fichero a cargar (pueden ser tanto rutas relativas como absolutas). type indica al navegador el tipo de contenido del fichero, o lo que es igual el MIME type del que ya se ha hablado en otra sección de esta guía.
Según el MIME declarado, el navegador cargará los recursos del sistema
que tenga disponibles para reproducir correctamente el fichero. En
general todos los navegadores mostrarán la consola del QuickTime y el IE
la del Media Player.
Es importante la elección del valor de type ya que eso definirá que el navegador tenga que buscar un plugin o no. Por ejemplo, si en lugar de definirlo como está, con audio/x-mp3 (que parece el más natural, dado el tipo de fichero) se define como type="application/x-mplayer2"
todos los navegadores presentarán la consola del Media Player sin
necesidad de buscar nada. Parece la solución ideal, pero si el cliente
no se conecta desde una máquina Windows, no funcionará, ya que el Media
Player es exclusivo de este sistema operativo.
veamos un ejemplo para reproducir un fichero mp3:
Este último no funciona bien con Opera.
Hasta aquí hemos visto cómo presentar un fichero multimedia con el Media
Player de Windows, pero solo uno. En efecto, ¿qué hacer si tenemos un
fichero de gran tamaño troceado en varias partes? O simplemente, varios
ficheros relacionados aunque no formen parte de uno solo. Si el número
de partes es relativamente elevado, puede ser muy cargante presentarlos
todos de la forma que ya conocemos, y lo que es peor, puede suceder que
el navegador se cuelgue.
Existe una forma de acceder a una lista de ficheros multimedia
utilizando el Media Player. Es decir, que escribiendo solamente una
definición de consola se puede ver o escuchar una serie de ficheros;
hablamos de los ficheros .asx
La particularidad reside en la extensión del fichero multimedia. No, no
es un nuevo tipo de video super comprimido, es simplemente un fichero
de texto, editado con cualquier editor, como el bloc de notas, que
contiene la referencia a los ficheros que se desea encadenar. Por
ejemplo, para encadenar dos pequeños ficheros multimedia de formato .mid
se escribe:
ATENCION: Todas las líneas de los ficheros .asx deben comenzar justo junto al margen izquierdo, sin ningun espacio en blanco.
El código para mostrar la consola es el ya conocido, solamente cambia el
fichero a reproducir, que puede incluir ficheros de distintos tipos:
Los frames (en inglés frame = cuadro, bastidor o marco) es un
elemento implementado por Netscape, que permite dividir la pantalla en
varias áreas independientes unas de otras, y por tanto con contenidos
distintos, aunque puedan estar relacionados. No hay límites para el
contenido de cada una de estas áreas: tienen las mismas propiedades que
la pantalla completa normal, tal y como la conocemos. No hay que
confundir los frames con las tablas.
Su apariencia, a veces, puede ser similar, pero mientras el contenido de
la celda de una tabla es fijo, en un área de pantalla creado por el
elemento FRAME se dispone de todos los recursos del HTML. Es una zona viva.
Las páginas que contienen una definición de FRAME no pueden contener el elemento BODY ni ninguno de los elementos que habitualmente aparecen en el BODY antes del elemento FRAMESET que es el que define la creación del FRAME. Si esto no se cumple, el FRAME será ignorado.
Algunos visualizadores no soportan los frames. Para que nuestra página
con frames no resulte opaca a ellos, se utilizará el elemento NOFRAMES que permite ofrecer un texto alternativo en entorno normal.
Los frames permiten una flexibilidad de presentación extraordinaria, y
para contenidos muy complejos, de difícil estructura por los medios
convencionales del HTML, son casi insustituibles. De nuevo se presenta
la duda de para qué visualizador es preferible programar nuestro WWW.
Por supuesto, los frames son parametrizables en cuanto a tamaño y número
de áreas, si éstas se pueden redimensionar por el usuario o son fijas,
si tienen o no barras de scrolling, se pueden anidar, relacionar sus
contenidos, etc. Veamos algunos ejemplos prácticos y su sintaxis:
Un frame básico. Sintaxis general
En general, todas las páginas que contengan definiciones de frames, se
comportan como si fuesen llamadores o "lanzaderas", y deberán ser más o
menos así:
<HTML>
<HEAD><TITLE> Mi titulo ></TITLE></HEAD>
<FRAMESET><NOFRAMES>
<BODY>
Su visualizador no soporta frames. Pulse
<A HREF="indice.htm">aqui </A> para volver.
</BODY>
</NOFRAMES>
<FRAME SRC="pagina1.htm" >
<FRAME SRC="pagina2.htm" >
</FRAMESET>
</HTML>
Fíjate en que no aparece el elemento <BODY> en su posición
habitual, sino dentro de un elemento especial que se activa sólo cuando
el visualizador no soporta los frames: NOFRAMES. Si no declaras
el área NOFRAMES y el visualizador no soporta este efecto, no se verá
nada. Obviamente, los visualizadores que sí soportan frames ignorarán el
contenido del área NOFRAMES.
Hasta aquí ya podemos hacernos una idea de cómo funcionan los frames: Lo
primero es crear una minipágina con la definición del frame, viene a
ser algo así como una "lanzadera" y sólo contiene la definición del
frame. Y por último, crear las páginas que constituirán el contenido de
cada una de las áreas definidas en la "lanzadera". En el ejemplo
anterior son pagina1.htm y pagina2.htm, y aquí es donde
escribirás tus cosas; es decir que son páginas completamente normales, y
que también pueden ser utilizadas de la forma habitual. A su vez, la
"lanzadera" puede ser invocada con un link desde cualquier página
normal. Como puedes ver, no es obligado crear todo tu documento con
frames: puedes utilizarlos solamente allí donde sea necesario, si
quieres.
Es posible definir cualquier combinación de áreas verticales y
horizontales. La clave está en combinar adecuadamente los anidamientos
del elemento <FRAMESET> con sus atributos COLS o ROWS
según interese. Como puedes ver, el más importante es el primer
<FRAMESET>, ya que es el que define cómo va a ser "troceada" la
página inicialmente, si en porciones verticales u horizontales, y sobre
esta base se deberán definir todos los demás anidamientos.
Habrás podido comprobar que los parámetros que dimensionan los frames
actuan al presentar la página inicialmente. Después, si el usuario lo
desea, puede redimensionarlos como quiera. Esta es la opción por
defecto. Si no se quiere permitir el redimensionado, se aplica el
atributo NORESIZE al elemento FRAME. Así:
<FRAME NORESIZE SRC.....>
Algo parecido ocurre con las barras de scrolling. Están regidas por el atributo SCROLLING, que puede valer YES NO o AUTO. Por defecto es AUTO. Con esta opción el visualizador decide, en función del contenido, si son necesarias las barras o no. Con YES las pondrá siempre, aunque no sean necesarias, y con NO no las pondrá nunca, aunque sean necesarias.
<FRAME SCROLLING=YES ....>
Un frame con dos áreas verticales. Una normal, la otra con márgenes forzados para el texto (MARGINWIDTH MARGINHEIGHT)
<FRAMESET COLS=50%,50%>
<FRAME SRC="aa.htm">
<FRAME SRC="bb.htm" NAME="VENTANA">
</FRAMESET>
Ejemplo real
Esto de los cruces es un poco complicado... fíjate en el contenido de cada página que entra en juego. Cuando actives Ejemplo real el fichero llamado es cruzado.htm. Pruébalo.
Fichero
Contenido
Acción
aa.htm
<A HREF="cc.htm"
TARGET="VENTANA">
Pone CC en el frame derecho
<A HREF="cc.htm">
Trae CC
bb.htm
Esto es "VENTANA"
No hace nada
cc.htm
<A HREF="bb.htm"
TARGET="VENTANA">
Pone BB en el frame derecho porque se llama
"VENTANA"
<A HREF="aa.htm">
Trae AA
cruzado.htm
<FRAMESET>
-
<FRAME SRC="aa.htm">
Pone AA en el frame izqdo.
<FRAME SRC="bb.htm"
NAME="VENTANA">
Pone BB en el frame derecho y le
da como nombre "VENTANA"
</FRAMESET>
-
Hasta aqui se ha utilizado el nombre de "VENTANA" como destino del
atributo TARGET. Este nombre, como ya sabes, es el que hemos definido en
el código de este ejemplo. Si en lugar de poner el nombre de destino
que se ha definido en el FRAMESET, pones otro cualquiera, el
visualizador lo que hace es abrir otra ventana y colocar alli el
contenido de la pagina. Evidentemente, cuantas mas ejecuciones del
navegador haya en marcha, mas memoria del ordenador se necesita, y abrir
una nueva ventana, implica ejecutar otra vez el navegador. Recuerda
cuando hagas esto, que algunos no andan muy sobrados de memoria....
La versión 3.0 de Netscape, implementa dos nuevas posibilidades de los
frames: la de darle color a la barra de separación de los distintos
frames o la de que no se vea dicha barra.
Para ello se utilizan los nuevos atributos de FRAMESET y FRAME:
FRAMEBORDER se utiliza como atributo de FRAMESET y establece si serán visibles los bordes del frame o no. Puede tener dos valores: YES (por defecto) y NO.
Si escribes:
Se obtiene un frame de tres columnas sin barras de separación entre ellas. Ejemplo realBORDERCOLOR se utiliza como atributo de FRAME y establece el
color de los bordes visibles. Evidentemente, para que funcione, se
tendrá que haber establecido FRAMEBORDER=yes
Si escribes:
Se obtiene un frame de tres columnas con la primera barra de separación roja y la segunda azul. Ejemplo realSalir de una pantalla con frames
Para salir de una pantalla compuesta de frames es necesario definir
algun link. En efecto, si estamos en una pantalla con, por ejemplo, dos
frames, cualquier link invocado desde cualquiera de ellos, hace que la
página llamada aparezca en ese mismo frame. Para volver a una pantalla
"normal" sin frames, se puede escribir un link con la sintaxis
siguiente:
<A HREF="indice.htm" TARGET="_parent">Ver índice sin marcos </A>
El destino "_parent" indica que presente la página llamada por
el link en el navegador que se esta ejecutando, sin marcos y sin abrir
nuevas ocurrencias del navegador.
Existen otros valores predeterminados para el atributo TARGET: _blank que abre una nueva ventana del navegador, _self que llama el destino del enlace a la misma ventana en que se está (valor por defecto), y _top que funciona igual que _parent.
Controlar el contenido de los frames con formularios
Hasta aquí hemos visto cómo hacer que los frames reciban sus contenidos
siempre mediante links. No es la única forma; también pueden utilizarse
formularios para esta tarea. Los formularios, además, nos pueden
permitir definir ciertas selecciones previas para que el contenido
invocado reuna determinados requisitos, así como elegir el frame de
destino. Lo malo de esta técnica es que requiere escribir algo de
JavaScript, lo que complica bastante la cosa. Veamos un ejemplo de
página con cuatro frames. Por ejemplo, como este:
Puesto que se va a poder elegir el frame de destino, es importante que todos ellos tengan nombre. Este es el código del frame arriba, que reside en la página que carga: fraarriba.htm
<HTML>
<HEAD><TITLE>Frames y formularios</TITLE></HEAD>
<BODY>
<CENTER><H2>FRAMES Y FORMULARIOS</H2></CENTER>
<TABLE BORDER=0 WIDTH="100%"><TR>
<TD ALIGN=CENTER>
<FORM>
<SELECT NAME="list">
<OPTION VALUE="a.htm" >Contenido A
<OPTION VALUE="b.htm" >Contenido B
<OPTION VALUE="c.htm" >Contenido C
</SELECT>
<BR>
<INPUT TYPE=button VALUE="Frame izquierdo" onClick=
"parent.izquierda.location.href=
this.form.list.options[this.form.list.selectedIndex].value">
</FORM>
</TD>
<TD ALIGN=CENTER>
<FORM>
<SELECT NAME="list">
<OPTION VALUE="a.htm" >Contenido A
<OPTION VALUE="b.htm" >Contenido B
<OPTION VALUE="c.htm" >Contenido C
</SELECT>
<BR>
<INPUT TYPE=button VALUE="Frame central" onClick=
"parent.centro.location.href=
this.form.list.options[this.form.list.selectedIndex].value">
</FORM>
</TD>
<TD ALIGN=CENTER>
<FORM>
<SELECT NAME="list">
<OPTION VALUE="a.htm" >Contenido A
<OPTION VALUE="b.htm" >Contenido B
<OPTION VALUE="c.htm" >Contenido C
</SELECT>
<BR>
<INPUT TYPE=button VALUE="Frame derecho" onClick=
"parent.derecha.location.href=
this.form.list.options[this.form.list.selectedIndex].value">
</FORM>
</TD></TR>
</TABLE>
</BODY>
</HTML>
Como puedes ver, todo reside en el código JavaScript que se ejecuta al
pulsar el botón de cualquiera de los tres formularios definidos en el
frame arriba. Mediante este código se captura un evento: onClick que se produce al pulsar con el puntero del ratón en el botón del formulario. La primera parte de la instrucción ejecutada: parent.derecha.location.href= es la que establece en qué frame se va a cargar la página seleccionada en la lista desplegable, en este caso el llamado derecha. La segunda parte de la instrucción: this.form.list.options[this.form.list.selectedIndex].value
es la que indica qué página hay que cargar en el frame definido en la
primera parte de la instrucción. Si... esto suena a muy complicado. No
es fácil entender la compleja estructura de objetos del navegador. Para
más detalle, puedes ver la sección sobre JavaScript, en particular, y
toda la sección de programación en general, de esta guia.
Otra cosa que hay que tener en cuenta cuando se escribe JavaScript, es
que distingue entre mayúsculas y minúsculas. En el ejemplo anterior, si
los ficheros llamados por el formulario: a.htm b.htm c.htm se han
guardado con el nombre en mayúsculas, como A.htm o B.htm, no funcionará
si no se invocan escritos de la misma forma. Esto es especialmente
importante cuando tengas tus páginas en servidores con sistemas
operativos UNIX o LINUX, que son la mayoría de ellos.
Frames incrustados
Se puede insertar un frame en cualquier punto de una página, ya sea
ésta, a su vez, un frame o una página normal. Su apariencia recuerda a
los gráficos y a los formularios, pero su contenido es el de una página
independiente. Por ejemplo, si se escribe:
<IFRAME NAME="indice" SRC="indice.htm" WIDTH="300" HEIGHT="100"
FRAMEBORDER="1" MARGINWIDTH="5" MARGINHEIGHT="5"
SCROLLING="Auto"></IFRAME>
Y este sería el resultado:
Analicemos sus atributos:
NAME Como ya habrás supuesto, es el nombre del frame incrustado. Puede omitirse si no es necesario.
SRC Nombre de la página que se mostrará en el frame.
WIDTH Número de pixels
que tendrá el frame de ancho. También puede indicarse en tanto por
ciento respecto al ancho total de la ventana, como se hace en los frames
convencionales.
HEIGHT Número de pixels que tendrá el frame de alto. También puede indicarse en tanto por ciento respecto al alto total de la ventana.
FRAMEBORDER Indica si se debe mostrar el borde del frame. 1 = si (por defecto) 0 = no.
MARGINWIDTH Indica el
número de pixels que tendrá el ancho de los márgenes interiores
izquierdo y derecho del frame respecto a su contenido.
MARGINHEIGHT Indica el
número de pixels que tendrá el ancho de los márgenes interiores superior
e inferior del frame respecto a su contenido.
SCROLLING Indica si hay que mostrar barras de scroll dentro del frame incrustado. Sus valores pueden ser: Yes, No y Auto (por defecto).
Conversión de caracteres que realiza el visualizador Netscape para Windows en los formularios.
El espacio en blanco es traducido como +
Los visualizadores que trabajan en Windows envían al final del registro los códigos 0D (decimal 13) y 0A (decimal 10) que son el retorno de carro y salto de línea respectivamente y por ese orden.
Juego de botones direccionados a páginas REMOTAS.
Puede funcionar abriendo la página como servicio http:// o como file:///. pero deberá utilizarse METHOD=GET en lugar de METHOD=POST.
La base del formulario es el elemento <FORM>, y es el que
define una zona de la página como formulario. En una página puede haber
varias zonas definidas como formulario, en cuyo caso es conveniente
darles distintos nombres a cada uno. Dentro de este elemento, que es un
objeto, se insertan otros elementos, que a su vez son sub-objetos del
objeto FORM, que son los que realmente dibujan en pantalla los
componentes del formulario. Se verá con detalle el concepto de objeto en
las secciones de programación de esta guia, ya que ahora no lo
necesitamos. Hay tres clases de estos sub-objetos:
<INPUT>
Campos de entrada por teclado.
Botones de selección.
Casillas de marca.
Botones de proceso.
Botones de inicialización (reset).
Imágenes sensibles al ratón.
<SELECT>
Listas desplegables de valores.
Listas fijas de valores.
<TEXTAREA>
Ventanas de escritura libre.
Este sería el más elemental de los formularios, con sólo un campo y un botón de envío:
Analicemos cómo se escribe:
En la primera línea vemos el elemento de definición de formulario: <FORM>. Va acompañado de tres atributos: NAME, METHOD y ACTION.
NAME, evidentemente, se refiere al nombre que se le asigne al
formulario. No es obligatorio, pero si el formulario va a ser utilizado
en páginas ASP, PHP, o simplemente en VBScript o JavaScript, se
necesitará un nombre, ya que el formulario será considerado como un objeto.
METHOD se refiere al método que emplearemos para enviar los datos al servidor, y pueden ser dos: POST y GET.
El optar por uno u otro obedece a complejas cuestiones de programación
basadas en la máxima longitud de registro que puede enviarse; cada uno
usa un canal de salida distinto. El que soporta más longitud es POST, y
será el que utilicemos en casi todos los ejemplos. Si el formulario
solamente se utiliza para llamar a otras páginas, se utiliza el método
GET, y si se trata de envio de datos POST.
Echale un vistazo a la respuesta del programa test2-cgi de la página anterior. Fíjate en las variables QUERY_STRING e INPUT. Por la primera llegarán los datos cuando se utilice METHOD=GET y por la segunda cuando es POST el método elegido.
ACTION se refiere a la acción que queremos que ejecute el formulario en un servidor http o en local. Con el valor del ejemplo ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi" se le está indicando que ejecute un programa llamado test2-cgi que está en el directorio /cgi-bin del servidor http miserver.midominio.mipais cuya respuesta será similar a la que hemos visto en la página de introducción a los formularios.
Además de enviar datos a un servidor, ACTION también puede realizar una acción en local, por ejemplo traer una página:
Se escribe:
En este caso el formulario funcionaría igual que un link.
Otra cosa que puede hacer ACTION, y que además tiene la ventaja
de que no sería preciso diseñar un CGI, es enviar un e-mail (correo
electrónico) a un usuario o a una lista de usuarios. Los datos enviados
por el formulario, tendrán la forma que ya conocemos, pero una vez
recibidos por esta vía, pueden ser tratados con programas de edición de
texto, y convertidos al formato que se quiera.
Se escribe:
Si no quieres complicarte la vida con descodificaciones (depende de lo
que se vaya a hacer con los datos recibidos), el navegador puede
remitirlos con un formato más sencillo y ya descodificado. Para ello
sólo hay que añadir el parámetro ENCTYPE con el valor TEXT/PLAIN. Se escribe así:
Resumiendo: sin poner ningun parámetro al elemento ACTION los datos te llegarán así:
CAMPO1=Esto+es+una&CAMPO2=demostracion+de+formularios
y poniendo ENCTYPE="TEXT/PLAIN" así:
CAMPO1=Esto es una
CAMPO2=demostracion de formularios
Al igual que con el elemento <A> es posible hacer que el asunto
(subject) del e-mail se reciba con el texto que quieras, pero omitiendo
la parte correspondiente al cuerpo (body) del mismo, ya que en este caso
el contenido del e-mail son los campos del formulario:
<FORM METHOD="POST" ACTION=
"mailto:mi-usuario@miservidor-e-mail?&subject=asunto de prueba"
ENCTYPE="TEXT/PLAIN">
......
</FORM>
Esto funcionará siempre que en la máquina del cliente haya instalado
algun programa que permita enviar correo electrónico, si no es así hay
que recurrir a un programa CGI o de otro tipo en el servidor que se
encargue de hacerlo. No es buena idea presuponer que todo el mundo tiene
un cliente de correo instalado en su máquina.
El elemento INPUT
INPUT sin ningún atributo define por defecto una ventana de escritura de 20 caracteres de longitud por una línea de ancho:
Se escribe:
<FORM> <INPUT> </FORM>
<INPUT> admite varios atributos:
SIZE define la longitud de la ventana de texto.
MAXLENGTH define la máxima longitud de la cadena que se puede escribir dentro de la ventana.
NAME define el nombre de la ventana (que en realidad es un campo
dentro del registro, que en conjunto, es el formulario). Si escribes:
Como puedes comprobar, sólo se pueden escribir 10 caracteres dentro de
la ventana, que también es de longitud 10. No es obligatorio que
concidan ambos valores, puedes definir la ventana al valor que quieras y
la longitud de la cadena puede ser mayor o menor.
VALUE sirve para que la ventana aparezca con un valor predeterminado, y no vacía como hace por defecto:
Se escribe:
<FORM> <INPUT VALUE="HOLA"> </FORM>
El valor puede ser modificado o barrado por el usuario.
READONLY Sirve para que el valor de la ventana, que contiene un valor predeterminado, no pueda ser modificado por el usuario.
Se escribe:
<FORM> <INPUT VALUE="HOLA" READONLY> </FORM>
No funciona en versiones antiguas de los navegadores.
TYPE=TEXT Es el valor por defecto de TYPE. Puede omitirse.
TYPE=PASSWORD para que el valor predeterminado de la ventana esté en formato oculto:
Se escribe:
TYPE=HIDDEN define que el valor predeterminado de la ventana y la ventana misma estén en formato oculto:
Se escribe:
<FORM> <INPUT TYPE="HIDDEN" VALUE="HOLA"> </FORM>
Esta opción se utiliza cuando es necesario enviar un valor fijo al
servidor, pero no se desea que el usuario intervenga o que lo vea.
CUIDADO, esto no es un formato encriptado, viendo el documento fuente se
puede saber el valor de la ventana.
TYPE=SUBMIT para generar un botón que al ser pulsado cierra la
captura de datos del formulario y procede a ejecutar lo definido en el
atributo ACTION que ya conocemos.
Se escribe:
VALUE puede acompañar a SUBMIT , y en este caso sirve para
definir el texto que queremos que tenga el botón en su interior. Si se
omite, por defecto el visualizador le da el valor "Submit Query".
Existe otro tipo llamado TYPE=BUTTON que genera un botón igual al
generado por el tipo submit, pero que no realiza ninguna acción; es
simplemente un botón "muerto" en cuanto a acciones directas. Suele
utilizarse para asociarle instrucciones en JavaScript o VBScript
mediante el evento onClick.
Se escribe:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
<INPUT NAME="campo1">
<INPUT TYPE="BUTTON" VALUE="No hace nada"></FORM>
TYPE=RESET para generar un botón que al ser pulsado inicializa todos los componentes del formulario.
Se escribe:
VALUE puede acompañar a RESET , y en este caso sirve para
definir el texto que queremos que tenga el botón en su interior. Si se
omite, por defecto el visualizador le da el valor "Reset".
TYPE=FILE
Este es un nuevo tipo que sólo funciona con Netscape 3.0 o superior, y
sirve para enviar un fichero a una máquina remota (hacer FTP), pero no
funciona solo, necesita de ciertos acompañantes que hacen su uso un poco
más complicado:
Aquí hay que echar mano de un atributo parametrizado de <FORM>: ENCTYPE="multipart/form-data"
para generar un botón que permitirá buscar un fichero en nuestra
máquina, ponerlo en una ventanita de entrada como las ya conocidas (por
tanto tanbién se puede escribir directamente el nombre del fichero en
lugar de buscarlo) y junto con un botón tipo submit enviar el fichero.
Se escribe:
el botón generado aparece con el texto "Browse.." y no sirve de nada
añadirle el parámetro VALUE para darle otro nombre, como se puede hacer
con el botón de tipo submit.
En este ejemplo se haría una conexión al servicio FTP general de la
máquina remota, pero se puede hacer a un directorio en particular de un
usuario concreto. Sólo habría que cambiar la línea
Otra forma más directa de hacer un FTP en las dos direcciones, es desde
la ventana "Location" del visualizador. La sintaxis de los parámetros de
ACTION son válidos en esa ventana.
Por supuesto, todo esto si no tienes cuenta y permiso de escritura en la máquina remota, no sirve para nada...
Como ya se ha dicho antes, el atributo ACTION es capaz de enviar
el contenido del formulario por correo electrónico, pero no sólo es
capaz de enviar el formulario: también puede adjuntar al e-mail un
fichero cualquiera. Lo único que hay que hacer es añadirle un
instrucción como la que acabamos de ver para el FTP. Así:
TYPE=IMAGE hace que el visualizador presente una imagen que es
sensible al ratón. Lo que el formulario envía al servidor es un registro
cuyos campos son el nombre definido para la imagen seguido de los
parámetros .x=n .y=n donde n son los números de las coordenas x y del punto en el que estaba el ratón en el momento del envío. Para presentar la imagen se utiliza el atributo SRC del elemento IMG. Este sería un ejemplo de respuesta:
imagen.x=99&imagen.y=15
Prueba a pulsar en cualquier parte de esta imagen:
Se escribe:
Los formularios que utilicen este tipo de recursos pueden prescindir del
tipo SUBMIT, ya que el formulario se cierra con la imagen.
TYPE=RADIO genera botones circulares que permiten seleccionar un valor predeterminado o activar una opción
Se escribe:
En este ejemplo, los botones permiten seleccionar la clase A, la clase B
o ninguna de las dos. Si se desea que por defecto un valor esté
seleccionado, por ejemplo clase B, hay que añadir el parámetro CHECKED después del valor:
... VALUE="B" CHECKED></form>
TYPE=CHECKBOX genera casillas de marca que permiten seleccionar un valor predeterminado o activar una opción
Se escribe:
En este ejemplo, las casillas de marca permiten seleccionar la clase A,
la clase B, ninguna, o las dos. Si se desea que por defecto un valor
esté seleccionado, por ejemplo clase B, hay que añadir el parámetro CHECKED después del valor:
... VALUE="B" CHECKED></form>
El elemento SELECT
SELECT sin ningún atributo define por defecto una lista desplegable de toda la pantalla de alto y una columna de ancho:
Se escribe:
<FORM> <SELECT> </SELECT> </FORM>
Como evidentemente esto no es muy práctico, hay que parametrizar el
elemento. En primer lugar se le da nombre, ya que éste es un campo más
del formulario, la diferencia es que no hay que escribir en él sino
escoger un valor de los que nos muestre al desplegarlo, se usará el
atributo NAME, y para entrar valores en la lista se usa el atributo OPTION.
Se escribe:
Se deben tener en cuenta varias cosas respecto a SELECT:
La longitud de la ventana de selección se autoajusta al valor más largo de la lista.
La ventana de selección, por defecto, muestra una línea, si se quieren mostrar más se utilizará el atributo SIZE.
Se debe procurar que los contenidos de los campos sean lo más cortos
posibles; una excesiva longitud implica mayor tráfico por la red, pero
se deben construir las listas de forma clara, y que resulten de fácil
lectura al usuario, lo que puede aumentar la longitud de los valores.
Para enviar un valor diferente del que aparece en la lista, se utiliza
el parámetro VALUE asociado al atributo OPTION. Prueba con el valor 5 de la siguiente lista:
Se escribe:
Esto siginifica que cuando selecciones "Este es el valor 5" en realidad lo que se envía al servidor es "Valor 5".
Con las listas desplegables es obligatorio seleccionar siempre un valor,
y si no hay ninguno seleccionado, por defecto el visualizador enviará
el primer valor de la lista.
Se puede hacer que haya un valor preseleccionado añadiendo el parámetro SELECTED al atributo OPTION, y si se quiere permitir más de una selección, se pondrá el atributo MULTIPLE al elemento SELECT. Para seleccionar y deseleccionar hay que atenerse a las normas de Windows.
Se escribe:
Puede ocurrir que interese agrupar los valores de la lista desplegable, a
fin de que resulte más fácil encontrar la opción adecuada, sobre todo
si la lista es larga. Para ello se puede utilizar el parámetro optgroup. Por ejemplo:
Y se escribe:
Este elemento, como su nombre indica, permite definir un área de texto
en la pantalla en la que podemos escribir cualquier cosa. Se debe
escribir ya parametrizada en cuanto a dimensiones, con los atributos ROWS (líneas) y COLS
(COLUMNAS). No tiene otros atributos o posibles variantes. Por
supuesto, para que sea operativo, deberá ir acompañado de los
componentes necesarios para enviar e inicializar.
Se escribe:
Aunque no es habitual, dentro de un área de texto puede haber un
contenido por defecto (que puede ser borrado o modificado por el
usuario). Para ello simplemente se escribirá el texto entre <TEXTAREA> y </TEXTAREA>. Así:
<TEXTAREA NAME="texto1" ROWS=5 COLS=40>
Contenido del area de texto
</TEXTAREA>
El tratamiento de los datos recibidos en el servidor desde los
formularios requiere conocer la tabla de conversión hexadecimal que
utilizan la mayoría de visualizadores. Recuerda que las palabras en
destino aparecen separadas por el signo +, y las letras acentuadas y
otros caracteres, por valores hexadecimales precedidos del símbolo %
Se puede proceder a la descodificación en el programa CGI que recibe los
datos, o bien definir macros en programas auxiliares que serán
ejecutados después.
En el índice encontrarás la tabla de conversiones utilizada con el visualizador Netscape desde Windows.
Estilos en los formularios
En las últimas versiones de los dos navegadores más utilizados, pueden
aplicarse cambios de estilo a los formularios, lo que permite una
presentación más sofisticada.
ATENCION: Hay que tener en cuenta que los estilos no estan
estandarizados, y hay cosas que se ven bien en unos navegadores y no se
ven en otros, y hay solo unos pocos efectos que se vean en todos ellos.
En los elementos de formulario pueden redefinirse casi todos los
parámetros: colores de fondo, tipo y anchura de bordes, color y tipo de
letra del texto, altura y anchura del elemento, alineación del texto
dentro del elemento, etc. Por ejemplo:
En las últimas versiones del navegador Internet Explorer de Microsoft,
ha aparecido una nueva prestación consistente en memorizar los datos
introducidos en cualquier formulario de uso habitual. En efecto, muchas
veces se utilizan formularios para tareas repetitivas, en las que casi
siempre hay que introducir los mismos datos. Esto nos puede ahorrar
tener que escribir cada vez lo mismo, y Microsoft pensó que sería buena
idea facilitar la labor del usuario haciendo que el navegador guarde en
una lista desplegable todos los datos que se van escribiendo en cada
transacción, de manera que cuando se accede a la página, cada campo de
texto (<INPUT TYPE="text">) queda convertido en una lista
desplegable (<SELECT>) cuyo contenido son los datos que se han
introducido en ese mismo campo en ocasiones anteriores.
Visto así suena incluso interesante.... a condición de que el usuario
sea siempre el mismo, claro. Porque, ¿qué ocurre si el formulario está
incluido en una página que es utilizada por numerosas personas en una
sala común con máquinas públicas, como una sala de usuarios o un
cibercafé? Pues que si el siguiente usuario se conecta a la misma
página, puede ver los datos que escribió su antecesor en esa máquina.
Para evitarlo, existe un parámetro, poco conocido en general, que debe
incluirse en la definición del formulario, y que no tiene ningún efecto
en los navegadores que no tienen la costumbre de ser tan indiscretos.
Así:
<FORM NAME="MI_FORMULARIO" METHOD="POST" AUTOMPLETE="OFF">
...
...
</FORM>
Orden de tabulación en los formularios
De forma predeterminada, el orden de tabulación es el mismo que el orden
en que los elementos se han escrito. Puede darse el caso de que
necesites que el orden de tabulación de los elementos de un formulario
no sea el mismo en el que estan escritos. Para ello se puede incluir en
todos los elementos el parámetro TABINDEX=n donde n es el
número de orden deseado de cada uno. Si se va a alterar el orden natural
de tabulación, conviene hacerlo con todos los elementos del formulario.
En cualquier caso, el navegador hace dos grupos de tabulación, los que
tienen el parámetro TABINDEX y los que no. Seguirá el orden de
los valores y a continuación pasará a los que no tengan numeración,
siguiendo el orden de escritura. He aquí un ejemplo de la sintaxis:
<FORM NAME="MI_FORMULARIO" METHOD="POST">
</FORM>
En este caso, "Campo2" sería el primero en recibir el cursor. Todo esto sólo funciona con navegadores de versiones recientes.
Desactivar elementos en los formularios
Con casi todos los navegadores modernos se pueden bloquear los elementos
que forman un formulario, todos o algunos de ellos. Y puede que te
preguntes qué interés tiene bloquear un formulario. Puede ser necesario
en aplicaciones dinámicas en las que interese bloquear partes del
formulario según el usuario cumplimente unos opciones u otras. Para ello
se utiliza el parámetro DISABLED. Este parámetro es accesible desde JavaScript y VBScript. Se escribe:
<FORM NAME="MI_FORMULARIO" METHOD="POST">
</FORM>
Se puede aplicar a cualquier objeto contenido en el formulario. Este sería el resultado:
Como puedes ver, el efecto es parecido al que se consigue con la opción de estilo readonly,
pero con DISABLED se impide incluso el que se pueda seleccionar el
contenido del control (no se produce el evento onFocus) y con readonly
no.
Esta es una de las partes más técnicas y complejas del HTML. Los formularios o forms
en inglés, son unas páginas especiales que se utilizan para realizar
transacciones. En una página que contenga un formulario pueden además
existir todos los elementos hasta ahora conocidos, incluso el propio
formulario puede estar integrado dentro de otros elementos, como por
ejemplo una tabla. Los formularios, en algunas impresoras, pueden dar
problemas al imprimir las páginas que los contienen.
¿Cómo funcionan los formularios?
El formulario no es más que una página escrita en HTML como cualquier
otra. Lo que la hace diferente es que permite capturar datos de varias
maneras: directamente desde el teclado, escogiendo un valor de una lista
desplegable o seleccionando una opción desde botones fijos o de todas
ellas combinadas.
Una vez terminada la captura de datos, estos forman un registro que es
enviado a un servidor http (web) que lo procesará y devolverá una
respuesta (o no). Pueden utilizarse también para enviar su contenido a
una dirección de correo electrónico, o que simplemente abran otra
página.
Si el formulario se diseña para abrir una página o para ser enviado por
e-mail, todo se reduce a escribir HTML, pero la cosa se complica cuando
se trata de transacciones de datos que hay que guardar en un servidor
(comercio electrónico). En este caso, en el servidor tiene que haber un
programa especial, creado específicamente para ese formulario, que
reciba los datos y sepa qué hacer con ellos, procesarlos y confeccionar
la respuesta que remitirá al navegadorr. A esa respuesta se le denomina documento virtual ya que esa página no está escrita en ninguna parte; es generada, enviada y destruida.
A los programas que hacen de puente entre el formulario y el servidor, se les llama programas CGI (Common Gateway Interface) y no hay que confundirlos con las páginas dinámicas escritas en ASP o PHP, aunque se parecen mucho.
Los programas CGI pueden estar escritos en cualquier lenguaje de
programación que sea soportado por el sistema operativo del servidor, y
pueden estar diseñados para cualquier función: desde una simple captura
de datos que serán guardados en un fichero, hasta la más sofisticada
consulta a una base de datos.
¿Cómo es un CGI?
Aunque el propósito de esta guía no es tratar temas de programación,
como breve orientación se muestra un sencillo programa hecho con
comandos shell de UNIX. Muestra los valores de las variables de
servidor más usuales, así como el nombre de los campos definidos en el
formulario y contenido de cada uno de ellos.
Ejemplo de programa CGI (shell UNIX)
#!/bin/sh
echo Content-type: text/plain
echo
echo Test CGI. Se visualiza el contenido de las variables mas usuales
echo
echo numero de argumentos: $#. valor argumentos: "$*".
echo
echo SERVER_SOFTWARE = $SERVER_SOFTWARE
echo SERVER_NAME = $SERVER_NAME
echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE
echo SERVER_PROTOCOL = $SERVER_PROTOCOL
echo SERVER_PORT = $SERVER_PORT
echo REQUEST_METHOD = $REQUEST_METHOD
echo HTTP_ACCEPT = $HTTP_ACCEPT
echo PATH_INFO = $PATH_INFO
echo PATH_TRANSLATED = $PATH_TRANSLATED
echo SCRIPT_NAME = $SCRIPT_NAME
echo QUERY_STRING = $QUERY_STRING
echo REMOTE_HOST = $REMOTE_HOST
echo REMOTE_ADDR = $REMOTE_ADDR
echo REMOTE_USER = $REMOTE_USER
echo REMOTE_IDENT = $REMOTE_IDENT
echo AUTH_TYPE = $AUTH_TYPE
echo CONTENT_TYPE = $CONTENT_TYPE
echo CONTENT_LENGTH = $CONTENT_LENGTH
echo HTTP_USER_AGENT = $HTTP_USER_AGENT
echo HOME = $HOME
echo HTTP_FROM = $HTTP_FROM
echo HTTP_REFERER = $HTTP_REFERER
echo REFERER_URL = $REFERER_URL
if [ "$CONTENT_TYPE" = "application/x-www-form-urlencoded" ]; then
read lo_que_viene
echo
echo ESTO VIENE POR LA INPUT:
echo
echo $lo_que_viene
exit 0
else
echo NO VIENE NADA POR LA INPUT
exit 0
fi
Esta sería la respuesta del CGI test2-cgi a un imaginario formulario llamado prueba.htm con dos campos de captura por teclado llamados CAMPO1 y CAMPO2 en los que hemos introducido: "Esto es una" y "demostracion de formularios" respectivamente.
Ejemplo de respuesta del programa test2-cgi al formulario prueba.htm
Test CGI. Se visualiza el contenido de las variables mas usuales
numero de argumentos: 0. valor argumentos: .
SERVER_SOFTWARE = NCSA/1.3
SERVER_NAME = miserver.midominio.mipais
GATEWAY_INTERFACE = CGI/1.1
SERVER_PROTOCOL = HTTP/1.0
SERVER_PORT = 80
REQUEST_METHOD = POST
HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
PATH_INFO =
PATH_TRANSLATED =
SCRIPT_NAME = /cgi-bin/test2-cgiQUERY_STRING =
REMOTE_HOST = mimaquina.misubdominio.midominio.mipais
REMOTE_ADDR = 255.255.255.255
REMOTE_USER =
REMOTE_IDENT = unknown
AUTH_TYPE =
CONTENT_TYPE = application/x-www-form-urlencoded
CONTENT_LENGTH = 52
HTTP_USER_AGENT = Mozilla/2.02 (Win95; I)
HOME =
HTTP_FROM =
HTTP_REFERER = http://sestud.uv.es/manual.esp/prueba.htm
REFERER_URL =
ESTO VIENE POR LA INPUT:
CAMPO1=Esto+es+una&CAMPO2=demostracion+de+formularios
Fíjate que las palabras aparecen separadas por el signo + y no por
espacios como hemos escrito. Si además hubiéramos escrito algún carácter
especial, no se vería como tal, sino su valor en hexadecimal precedido
del carácter %. Por ejemplo, el cáracter & es transferido como %26.
Esta conversión se hace para no confundirlo con el separador de campos,
que como puedes ver es el mismo símbolo. El signo = después del nombre
del campo, también lo pone el visualizador.
Todo esto y algunas cosas más (que habrá que ver en la documentación de
referencia) han de tenerse presentes a la hora de realizar programas
CGI. Para terminarlo de complicar, no todos los visualizadores utilizan
la misma forma de enviar los datos recibidos, por lo que se plantea a
menudo la necesidad de decidir para qué visualizador queremos programar
nuestro WEB.
Los programas de test, como el del ejemplo, son muy útiles cuando se
están diseñando formularios, ya que permiten comprobar de forma real su
funcionamiento y analizar el registro que envían, cosa imprescindible
para poder programar el correspondiente CGI. Intenta hacer uno a tu
medida, o simplemente copia éste, instálalo en tu servidor http, (si no
tienes acceso, pide a tu administrador de sistema que lo haga), empieza a
probar... y buena suerte.
Una nueva propiedad de algunos visualizadores es la posibilidad de
presentar gráficos con animación. No hay que confundir los gráficos
animados en formato GIF con los "movies" o vídeos en formato MPG que no
son tratados directamente por el visualizador, sino por una herramienta
auxiliar que hay que definirle.
Los visualizadores suelen presentar correctamente los formatos GIF y
JPG. Netscape ha implementado la posibilidad de mostrar un tipo de
gráfico tipo GIF que incluye en su interior una secuencia, que junto con
instrucciones de repetición (loop), espera (wait) y controles de
cabecera permiten reproducir una animación. La diferencia de tamaño
entre un GIF animado y un MPG es considerable. Evidentemente, las
animaciones GIF tienen peor resolución que las MPG, y sólo están
pensadas para fines sencillos.
La forma de incluir una imagen animada en el documento es la misma que
una imagen fija. No se requiere ningun tipo de programa ni script, todo
está definido en la propia imagen. Existen en la red en forma de
shareware programas para hacer ficheros de imágenes animadas. Su
construcción es muy sencilla: sólo necesitas tener la serie de imágenes
que quieres animar e ir ensamblándolas con algún programa al efecto,
definir el tiempo entre imagen, el ciclo de repetición... y listo.
Los visualizadores que no soportan este efecto, lo que hacen es
presentar solamente la primera o la última de las imágenes de la
secuencia. Hay que tener esto presente, y no comenzar o terminar las
secuencias con, por ejemplo, una imagen vacía.
Aquí tienes dos ejemplos sencillos de GIF animado:
Una bola que corre.
Una carta que se mete en un sobre.
Para representarlos en la página se utiliza el mismo elemento HTML de los gráficos normales: <IMG SRC="migrafico.gif">
Insertar imágenes en un documento permite crear páginas mucho más
atractivas. Según el tipo de gráficos utilizado se pueden conseguir
efectos realmente sorprendentes.
Para insertar una imagen en un documento HTML se utiliza el elemento <IMG>. Este elemento puede ir acompañado de los atributos SRC ALT ISMAP ALIGN WIDTH HEIGHT BORDER VSPACE HSPACE. Con las nuevas implementaciones que Netscape hace del elemento, se consiguen efectos de imagen flotante y por tanto se ha hecho necesario dotar al elemento <BR> del atributo CLEAR.
Las imágenes utilizadas pueden estar en formato GIF o JPG. Estos
formatos son interpretados directamente por el navegador. La diferencia
entre estos dos formatos es su nivel de compresión. En efecto, el JPG
tiene una compresión mucho mayor que el GIF, por lo que suele ser el
formato más utilizado en el mundo web, donde siempre se debe perseguir
que las páginas sean lo más ligeras posible. Por contra, cuanta mayor
compresión tenga un gráfico menor calidad se consigue, pero para usos
generales el JPG es perfectamente válido.
Se puede usar cualquier otro formato como el MPG o el AVI (ambos de
vídeo), pero entonces el visualizador llamará a un programa auxiliar,
que previamente le habrás definido, para que sea éste el que visualice
el fichero. La desventaja de las imágenes en formatos no tratados por el
propio visualizador es que no verás el texto junto con la imagen, y por
tanto no podrás imprimir la página compuesta. para evitar esto, se
utilizan los llamados "plug-in" que consisten en pequeños programas que
permiten llamar a aplicaciones específicas ejecutándose como ventanas
del navegador. Un ejemplo muy común son los ficheros .pdf.
Algunos navegadores no son capaces de tratar imágenes, o aunque el
navegador sí pueda, tal vez el cliente esté navegando en modo solo
texto, es decir, sin ver las imágenes, lo que permite moverse más
rápido. Para estos casos podemos recurrir al atributo ALT (por
alternativo) para definir un texto que aparecerá en lugar de la imagen.
Esto es importante cuando una imagen, además de ser un elemento
decorativo o informativo, soporta un link. El uso de ALT es recomendado por la W3.
Veamos ejemplos del uso de <IMG>:
Imagen alineada a la izquierda (por defecto)
texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto
Imagen con un texto alternativo
Sirve para que, si no es posible cargar la imagen, aparezca un texto en
su lugar. También se utiliza para que al colocar el puntero del ratón
sobre la imagen, sin pulsar, aparezca el texto. Para verlo tienes de
deshabilitar la opción de cargar imágenes de tu visualizador (sólo es
posible con Netscape).
<IMG SRC="sugeren.gif" ALT="AQUI VA UNA IMAGEN">
Imagen alineada a la izquierda.Texto alineado arriba
texto texto texto texto texto texto texto texto texto texzto texto texto texto texto texto texto texto texto
Imagen alineada a la izquierda.Texto alineado a la derecha de la imagen
texto texto texto texto texto texto texto texto texto texzto texto texto
texto texto texto texto texto texto texto texto texto texto texto texto
texto texto texto texto texto.
Aquí la imagen es la misma de los ejemplos anteriores, pero ha sido
redimensionada por el visualizador. Su tamaño original es de 136x46
puntos. Este es su aspecto al doble: 272x92.
Imagen redimensionada a menos.Texto alineado a la derecha de la imagen
texto texto texto texto texto texto texto texto texto texzto texto texto
texto texto texto texto texto texto texto texto texto texto texto texto
texto texto texto texto texto.
Aquí la imagen es la misma de los ejemplos anteriores, pero ha sido
redimensionada por el visualizador. Su tamaño original es de 136x46
puntos. Este es su aspecto a la mitad: 75x23
Consideraciones sobre WIDTH y HEIGHT
Estos dos atributos, además de para variar el tamaño de un gráfico,
también pueden (casi deben) utilizarse con los valores naturales del
mismo. Es decir, que no se pretende alterar las dimensiones del gráfico.
Y te preguntarás que finalidad tiene esto. La razón estriba en cómo
funcionan los navegadores. Cuando el navegador solicita una página y
comienza a recibirla, lo primero que hace es leer la cabecera, a
continuación lee el código del BODY y por último carga las imágenes que
contenga la página haciendo nuevas conexiones al servidor para cada una
de ellas.
Esta forma de trabajar tiene como consecuencia, que si en el código del
BODY no hay instrucciones sobre el espacio que hay que reservar en
pantalla para cada imagen, cuando éstas lleguen en el último paso de la
carga de la página, el texto ya estará compuesto, pero al no saber el
tamaño de las imágenes, no se habrá reservado el espacio adecuado para
insertarlas, por lo que todo el texto será desplazado hacia abajo, con
la consiguiente pérdida del formato original de la página, ya que el
navegador no va a recomponer el texto que ya estaba escrito.
Imagen alineada a la izquierda con marco.Texto alineado a la derecha de la imagen
Como puedes ver, la imagen aparece rodeada de un marco de color como es
habitual en los puntos de link (en el texto es el subrayado). Si quieres
eliminar el marco, escribe:
.... IMG SRC="sugeren.gif" BORDER=0 >
Ahora que ya sabes cómo manejar las imágenes, veamos algunos efectos especiales algo más complicados.
Mapeado de una imagen para usarla como direccionador
Si mueves el ratón por encima de la imagen, verás que en la ventanita de
estado del navegador (en la parte inferior izquierda de la ventana)
aparecen junto a un interrogante unos números que cambian según muevas
el ratón. Con cuidado intenta poner el puntero en la esquina superior
izquierda y en la inferior derecha. Verás las cifras 1,1 y 136,46,
respectivamente, que son las medidas en puntos que tiene el gráfico.
Como ya habrás supuesto, esto es un sistema de coordenadas, y para que
nuestra imagen funcione como un menú direccionador, lo que necesitamos
es que algún elemento convierta esas coordenadas en una dirección del
estilo ya conocido: "http://miservidor.es/mifichero.htm". Esto
siginifica que con un solo link podemos obtener un enorme número de
direcciones, teóricamente tantas como pares de coordenadas tiene la
imagen. En la práctica serán menos, ya que andar intentando atinar en el
punto 11,32, por ejemplo, es un poco engorroso.
Existen multitud de programas llamados mapeadores que parten la imagen
en imaginarios trozos, y cada uno de ellos indica un link con alguna
parte. Estos programas generan un fichero con todas las direcciones.
Algo así:
rect http://miservidor.es/mifichero1.htm 12,35
rect http://miservidor.es/mifichero2.htm 90,42
rect http://miservidor.es/mifichero3.htm 112,46
Este podría ser el aspecto del fichero del ejemplo, el llamado mimapa. El parámetro rect
significa rectángulo, y nos indica que la imagen ha sido troceada en
rectángulos y las coordenadas indican la esquina superior izquierda y la
inferior derecha. También podría ser en círculos (circ) o polígonos (poly).
Ahora veamos el resto de instrucciones del ejemplo:
La primera parte A HREF ya la conocemos, es un link. Después viene un directorio: cgi-bin.
Este es un directorio especial que tienen los servidores http, donde se
ejecutan los programas auxiliares del servidor, y al que normalmente
sólo puede acceder el administrador del sistema. En ese directorio hay
un fichero llamado imagemap (según el sistema puede ser otro) que es un programa que se encarga de leer tu fichero mimapa,
capturar las coordenas que señale el puntero del ratón y servir la
dirección que tiene asociada, con lo que acabamos obteniendo un link
normal. Ya por último, aparece ISMAP que es el que convierte una simple imagen en una potente herramienta.
Sólo queda por decir que el fichero mimapa tiene que estar en
otro directorio especial que tiene el servidor a estos efectos, y al que
por supuesto, solo puede acceder el administrador del sitema.
Todo esto es suponiendo que el servidor está en una máquina UNIX. Si
reside en tu propio PC con Windows o en un MAC (que los hay),
tendrás que ver las instrucciones concretas del programa servidor. La
forma de montar el mapa puede variar de un programa servidor a otro,
pero la base de funcionamiento es siempre la misma.
Otra forma alternativa de conseguir que una imagen responda con ciertas acciones, es operar con los elementos de formularios.
En el índice encontrarás información sobre un tipo de formulario que
devuelve un par de coordenadas, que una vez evaluadas permite ejecutar
una acción.
Pero, una vez más, Netscape ha propuesto una solución mucho más simple:
que sea el propio visualizador quien haga las veces de programa
conversor. En efecto, un recurso tan bueno como los mapas, no debe
depender de tener tu máquina en red y de que haya un servidor http que
te atienda. Además, eso resta portabilidad a los documentos locales y a
los trabajos personales en disquete. Para ello ha implementado el
elemento MAP que acompañará a IMG.
Por ejemplo, en la siguiente imagen, la mitad izquierda nos envía a
indice.htm y la mitad derecha a intro.htm. Mueve el puntero del ratón
horizontalmente sobre la imagen y observa la ventanita de estado que hay
en la parte inferior izquierda de la pantalla, verás como cambia el
nombre del link.
Se escribe así:
Aunque se comprende a simple vista, analicémoslo:
En primer lugar tenemos el elemento MAP, que lo que está haciendo es definir un mapa de coordenadas. Va acompañado del atributo NAME
que da nombre al mapa. Es necesario nombrarlo porque podría haber más
de uno en la misma página, y evidentemente, sus nombres no deberán
repetirse.
A continuación tenemos el atributo AREA que define las áreas de la imagen. El parámetro SHAPE="rect" indica la figura geométrica que estamos utilizando para ello. Al igual que con los otros mapas, puede ser rect circ y poly.
El parámetro COORDS fácilmente se adivina que indica las
coordenadas del área, en este caso vértice superior izquierdo e inferior
derecho, respectivamente.
HREF ya sabemos lo que hace: indica un link con una página, pero
esta vez no va acompañando al elemento <A>, digamos que es un
atributo prestado. Hay un área por cada link definido. Si un área no
queremos que tenga link se definirá con NOHREF.
IMG SRC también son conocidos: hacen que se visualice la imagen.
Y por fin, USEMAP nos dice qué mapa de coordenadas hay que
aplicar a la imagen. A una misma imagen se le pueden aplicar distintos
mapas si se desea. Fíjate en que nombre1, (el nombre del mapa) va precedido del símbolo #.
Esto se debe a que, en este caso, el mapa al que se hace referencia
está en la misma página que la instrucción IMG. Podría estar en otra, y
en ese caso el símbolo tendría que estar después del nombre de la página. Por ejemplo: otrapagina.htm#nombre1
Como ya se ha dicho más arriba, hay tres figuras geométricas definibles para las áreas: rect, circle y poly.
El rectángulo ya lo conocemos; consiste en parejas de coordenadas que
indican los vértices superior izquierdo e inferior derecho
respectivamente del área. Para el cículo (circ) son necesarios tres valores: x,y r donde x,y es el par de coordenas que indican el punto donde está el centro del cículo, y r es el radio del círculo medido en puntos. Para los polígonos (poly)
se necesitan tantas parejas de coordenadas como vértices tenga el
polígono, procurando que la última pareja quede unida a la primera, ya
que la figura debe estar cerrada. No es obligatorio que sean figuras
regulares. En el caso de que se quiera emplear todo el gráfico como área
de enlace, es decir, un solo link, se puede emplear default, y no es necesario indicar ninguna coordenada.