lunes, 24 de septiembre de 2012

Páginas con ficheros multimedia (audio/video) y otros objetos

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:
    <EMBED SRC="minueto.mid" WIDTH=160 HEIGHT=70 AUTOSTART="FALSE">
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:
<object  data="test.mp3" type="audio/x-mp3" height="50" width="300" >
 <param name="src" value="test.mp3" />
 <param name="autostart" value="0" />
</object>

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:
<object height="80" width="300"type="application/x-mplayer2" data="test.mp3">
 <param name="src" value="test.mp3" />
 <param name="controller" value="false" />
 <param name="autostart" value="0">
</object>

También se puede utilizar para reproducir un video:
<object height="300" width="350"type="application/x-mplayer2" data="colon.avi">
 <param name="src" value="colon.avi" />
 <param name="controller" value="false" />
 <param name="autostart" value="0">
</object>
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:
Fichero lista.asx

<ASX version = "3.0">
<ENTRY><REF HREF="minueto.mid"/></ENTRY>
<ENTRY><REF HREF="adagio.mid"/></ENTRY>
</ASX>
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:
<object height="300" width="350"type="application/x-mplayer2" data="lista.asx">
 <param name="src" value="lista.asx" />
 <param name="controller" value="false" />
 <param name="autostart" value="0">
</object>

Qué son los frames

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.

Un frame de 3 áreas verticales (COLS)

Se vería así:
A B C
Y se escribiría; así:
<FRAMESET COLS=30%,20%,50%>
   <FRAME SRC="a.htm">
   <FRAME SRC="b.htm">
   <FRAME SRC="c.htm">
</FRAMESET>

Ejemplo real

Un frame de 3 áreas horizontales (ROWS)

Se vería así:
A
B
C
Y se escribiría así:
<FRAMESET ROWS=25%,25%,50%>
   <FRAME SRC="a.htm">
   <FRAME SRC="b.htm">
   <FRAME SRC="c.htm">
</FRAMESET>

Ejemplo real

Un frame combinado de un área vertical y dos horizontales

Se vería así:
A B
C
Y se escribiría así:
<FRAMESET COLS=20%,*>
   <FRAME SRC="a.htm">
        <FRAMESET ROWS=40%,*>
           <FRAME SRC="b.htm">
           <FRAME SRC="c.htm">
        </FRAMESET>
</FRAMESET>

Ejemplo real

Un frame combinado de dos áreas horizontales, la de abajo dividida en dos verticales

Se vería así:
A
B C
Y se escribiría así:
<FRAMESET ROWS=50%,*>
   <FRAME SRC="a.htm">
      <FRAMESET COLS=50%,*>
         <FRAME SRC="b.htm">
         <FRAME SRC="c.htm">  
      </FRAMESET>
</FRAMESET>

Ejemplo real

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)

Se vería así:
AAAA AA
AA
Y se escribiría así:
<FRAMESET COLS=50%,50%>
   <FRAME SRC="a.htm">
   <FRAME SRC="a.htm" 
       MARGINWIDTH=50 
       MARGINHEIGHT=50>
</FRAMESET>

Ejemplo real

Un frame con referencias cruzadas (NAME TARGET)

Se vería así:
A B
Y se escribiría así:
<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.
FicheroContenidoAcció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:
<FRAMESET FRAMEBORDER=NO COLS=30%,30%,30%>
   <FRAME SRC="a.htm">
   <FRAME SRC="b.htm">
   <FRAME SRC="c.htm">
</FRAMESET>
Se obtiene un frame de tres columnas sin barras de separación entre ellas.
Ejemplo real BORDERCOLOR 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:
<FRAMESET  COLS=30%,30%,30%>
   <FRAME BORDERCOLOR="red" SRC="a.htm">
   <FRAME BORDERCOLOR="blue"SRC="b.htm">
   <FRAME SRC="c.htm">
</FRAMESET>
Se obtiene un frame de tres columnas con la primera barra de separación roja y la segunda azul. Ejemplo real
Salir 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:
Arriba
A B C
Y se escribiría así:
<FRAMESET ROWS=30%,*>
   <FRAME SRC="fraarriba.htm" NAME="arriba">
      <FRAMESET COLS=33%,33%,*>
         <FRAME SRC="a.htm" NAME="izquierda">
         <FRAME SRC="b.htm" NAME="centro">  
         <FRAME SRC="c.htm" NAME="derecha">  
      </FRAMESET>
</FRAMESET>

Ejemplo real
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).

Tabla de códigos decimal-hexadecimal

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.

CaracterCod. DecimalDescripciónCod. hexadecimal
Invisible&#9;Tabulador horizontal (TAB) %09
Invisible&#10;Salto de línea (LF) %0A
Invisible&#13;Retorno de carro (CR) %0D
!&#33;Cerrar exclamación%21
"&#34;Dobles comillas%22
#&#35;Signo de número%23
$&#36;Dólar %24
%&#37;Tanto por ciento %25
&&#38;Ampersand %26
'&#39;Apóstrofe %27
(&#40;Cerrar paréntesis %28
)&#41;Abrir paréntesis %29
*&#42;Asterisco %2A
+&#43;Signo más %2B
,&#44;Coma %2C
-&#45;Guión %2D
.&#46;Punto %2E
/&#47;Barra de división %2F
:&#58;Dos puntos %3A
;&#59;Punto y coma %3B
<&#60;Menor %3C
=&#61;Igual %3D
>&#62;Mayor %3E
?&#63;Cerrar interrogación %3F
@&#64;Arroba %40
[&#91;Cerrar corchete (izquierdo) %5B
\&#92;Barra de división inversa %5C
]&#93;Abrir corchete %5D
^&#94;Circunflejo %5E
_&#95;Subrayado %5F
`&#96;Acento agudo %60
{&#123;Abrir llave %7B
|&#124;Barra vertical %7C
}&#125;Cerrar llave %7D
~&#126;Tilde %7E
 &#160;Espacio sin separación%A0
¡&#161;Abrir exclamación%A1
¢&#162;Centavo%A2
£&#163;Libra Esterlina%A3
¤&#164;Signo de divisa general%A4
¥&#165;Yen%A5
¦&#166;Barra vertical partida (pipe)%A6
§&#167;Sección%A7
¨&#168;Diéresis%A8
©&#169;Copyright%A9
ª&#170;Doña %AA
«&#171;Abrir comillas francesas%AB
¬&#172;No (símbolo lógico)%AC
­&#173;Guión débil %AD
®&#174;Registrado%AE
¯&#175;Macrón%AF
°&#176;Grados%B0
±&#177;Más-menos%B1
²&#178;Dos superíndice%B2
³&#179;Tres superíndice%B3
´&#180;Acento agudo%B4
µ&#181;Micro%B5
&#182;Fin de párrafo%B6
·&#183;Punto medio%B7
¸&#184;Cedilla %B8
¹&#185;Uno superíndice%B9
º&#186;Género masculino%BA
»&#187;Cerrar comillas francesas %BB
¼&#188;Un cuarto %BC
½&#189;Un medio%BD
¾&#190;Tres cuartos%BE
¿&#191;Abrir interrogación%BF
À&#192;A mayúscula, acento grave%C0
Á&#193;A mayúscula, acento agudo%C1
Â&#194;A mayúscula, acento circunflejo%C2
Ã&#195;A mayúscula, tilde%C3
Ä&#196;A mayúscula, diéresis%C4
Å&#197;A mayúscula, anillo%C5
Æ&#198; AE mayúscula %C6
Ç&#199;C cedilla mayúscula%C7
È&#200;E mayúscula, acento grave%C8
É&#201;E mayúscula, acento agudo%C9
Ê&#202;E mayúscula, acento circunflejo%CA
Ë&#203;E mayúscula, diéresis%CB
Ì&#204;I mayúscula, acento grave%CC
Í&#205;I mayúscula, acento agudo%CD
Î&#206;I mayúscula, acento circunflejo%CE
Ï&#207;I mayúscula, diéresis%CF
Ð&#208;Eth mayúscula%D0
Ñ&#209;Eñe mayúscula%D1
Ò&#210;O mayúscula, acento grave%D2
Ó&#211;O mayúscula, acento agudo%D3
Ô&#212;O mayúscula, acento circunflejo%D4
Õ&#213;O mayúscula, tilde %D5
Ö&#214;O mayúscula, diéresis%D6
×&#215;Signo de multiplicación%D7
Ø&#216;O barrada mayúscula%D8
Ù&#217;U mayúscula, acento grave%D9
Ú&#218;U mayúscula, acento agudo%DA
Û&#219;U mayúscula, acento circunflejo%DB
Ü&#220;U mayúscula, diéresis%DC
Ý&#221;Y mayúscula, acento agudo%DD
Þ&#222;THORN mayúscula%DE
ß&#223;Beta minúscula%EF
à&#224;a minúscula, acento grave%E0
á&#225;a minúscula, acento agudo%E1
â&#226;a minúscula, acento circunflejo%E2
ã&#227;a minúscula, tilde %E3
ä&#228;a minúscula, diéresis%E4
å&#229;a minúscula, anillo%E5
æ&#230; ae mínuscula %E6
ç&#231;c cedilla minúscula%E7
è&#232;e minúscula, acento grave%E8
é&#233;e minúscula, acento agudo%E9
ê&#234;e minúscula, acento circunflejo%EA
ë&#235;e minúscula, diéresis%EB
ì&#236;i minúscula, acento grave%EC
í&#237;i minúscula, acento agudo%ED
î&#238;i minúscula, acento circunflejo%EE
ï&#239;i minúscula, diéresis%EF
ð&#240;eth minúscula%F0
ñ&#241;eñe minúscula%F1
ò&#242;o minúscula, acento grave%F2
ó&#243;o minúscula, acento agudo%F3
ô&#244;o minúscula, acento circunflejo%F4
õ&#245;o minúscula, tilde %F5
ö&#246;o minúscula, diéresis%F6
÷&#247;Signo de división%F7
ø&#248;o barrada minúscula%F8
ù&#249;u minúscula, acento grave%F9
ú&#250;u minúscula, acento agudo%FA
û&#251;u minúscula, acento circunflejo%FB
ü&#252;u minúscula, diéresis%FC
ý&#253;y minúscula, acento agudo%FD
þ&#254;thorn minúscula%FE
ÿ&#255;y minúscula, diéresis%FF

Ejemplos de formularios

Juego de botones direccionados a páginas LOCALES. Esto sólo funciona abriendo la página como file:/// no como servicio http://.
<TABLE>
<TR>
   <TD>
      <FORM METHOD="GET" ACTION="indice.htm">
      <INPUT TYPE="SUBMIT" VALUE="Indice">
      </FORM>
   </TD>

   <TD>
      <FORM METHOD="GET" ACTION="notas.htm">
      <INPUT TYPE="SUBMIT" VALUE="Notas">
      </FORM>
   </TD>

   <TD>
      <FORM METHOD="GET" ACTION="como.htm">
      <INPUT TYPE="SUBMIT" VALUE="Cómo funciona?">
      </FORM>
   </TD>
</TR>
</TABLE>

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.
<TABLE>
<TR>
 <TD>
  <FORM METHOD="GET" ACTION="http://sestud.uv.es/manual.esp/indice.htm">
  <INPUT TYPE="SUBMIT" VALUE="Indice">
  </FORM>
 </TD>

 <TD>
  <FORM METHOD="GET" ACTION="http://sestud.uv.es/manual.esp/notas.htm">
  <INPUT TYPE="SUBMIT" VALUE="Notas">
  </FORM>
 </TD>

 <TD>
  <FORM METHOD="GET" ACTION="http://sestud.uv.es/manual.esp/como.htm">
  <INPUT TYPE="SUBMIT" VALUE="Cómo funciona?">
  </FORM>
 </TD>
</TR>
</TABLE>

1 campo vacío. Longitud no limitada.
1 campo vacío. Longitud limitada a 10

<FORM METHOD="POST" ACTION="http://miservidor/cgi-bin/test2-cgi">
 <INPUT NAME="campo1">
 <INPUT NAME="campo2" SIZE=10 MAXLENGTH=10>
<P>
 <INPUT TYPE="submit" VALUE="Procesar">
 <INPUT TYPE="reset" VALUE="Inicializar"></FORM>

1 campo vacío. Longitud no limitada.
1 campo con contenido visible.
1 campo con contenido oculto
<form method="POST" action="http://miservidor/cgi-bin/test2-cgi">
 <input name="campo1">
 <input name="campo2" VALUE="TEXTO VISIBLE">
 <input type="password" name="campo3" VALUE="TEXTO OCULTO">
<P>
 <input type="submit" value="Procesar">
 <input type="reset" value="Inicializar"></form>

1 campo vacío. Longitud sin limitar.
1 campo vacío. Longitud limitada a 10.
2 botones de selección.
Clase A Clase B
<FORM METHOD="POST" ACTION="http://miservidor/cgi-bin/test2-cgi">
 <INPUT NAME="campo1">
 <INPUT NAME="campo2" SIZE=10 MAXLENGTH=10>
<P>
Clase A <INPUT TYPE="RADIO" NAME="clase" VALUE="A">
Clase B <INPUT TYPE="RADIO" NAME="clase" VALUE="B">
<P>
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">

</form>

1 campo vacío. Longitud sin limitar.
1 campo vacio. Longitud limitada a 10.
2 botones selección
2 casillas selección
Clase A Clase B
Tipo 1 Tipo 2
<FORM METHOD="POST" ACTION="http://miservidor/cgi-bin/test2-cgi">
 <INPUT NAME="campo1">
 <INPUT NAME="campo2" SIZE=10 MAXLENGTH=10>
<P>
Clase A <INPUT TYPE="RADIO" NAME="clase" VALUE="A">
Clase B <INPUT TYPE="RADIO" NAME="clase" VALUE="B">
<P>
Tipo 1 <INPUT TYPE="CHECKBOX" NAME="tipo" VALUE="1">
Tipo 2 <INPUT TYPE="CHECKBOX" NAME="tipo" VALUE="2">
<P>
<INPUT TYPE="SUBMIT" VALUE="Procesar">
<INPUT TYPE="RESET" VALUE="Inicializar">

</form>

1 lista desplegable de 3 valores. 1 visible
<FORM METHOD="POST" ACTION="http://miservidor/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">

 <SELECT NAME="lista1">
  <OPTION>Valor 1
  <OPTION>Valor 2
  <OPTION>Valor 3
</SELECT>
</FORM>

1 lista desplegable de 5 valores. 3 visibles.
<FORM METHOD="POST" ACTION="http://miservidor/cgi-bin/test2-cgi">

 <SELECT NAME="lista1" SIZE=3>
  <OPTION>Valor 1
  <OPTION>Valor 2
  <OPTION>Valor 3
  <OPTION>Valor 4
  <OPTION>Valor 5
</SELECT>
<P>
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">
</FORM>

1 Ventana de texto de 5x40
<FORM METHOD="POST" ACTION="http://miservidor/cgi-bin/test2-cgi">
<TEXTAREA NAME="texto1" ROWS=5 COLS=40 ></TEXTAREA>
<P>
<INPUT TYPE="SUBMIT" VALUE="Procesar">
<INPUT TYPE="RESET" VALUE="Inicializar">
</FORM>

Un típico y complejo formulario
Nombre: F.Nac.: DNI:
Apellidos:
Calle y número:
Código Postal: Ciudad:
Provincia: Teléfono:
Opción: Escoja una opción
Comentarios
personales:
Pulse aquí:
<FORM ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi" METHOD=POST>

<CENTER>
<TABLE BORDER>

<TR>
   <TD>Nombre:</TD>
   <TD> <INPUT TYPE="text" NAME="nombre" SIZE=18 MAXLENGTH=18> F.Nac.:
        <INPUT TYPE="text" NAME="edad" SIZE=8 MAXLENGTH=8> DNI: 
        <INPUT TYPE="text" NAME="dni" SIZE=8 MAXLENGTH=8></TD>

<TR>
   <TD>Apellidos:</TD>
   <TD> <INPUT TYPE="text" NAME="apellidos" SIZE=48 MAXLENGTH=48></TD>

<TR>
   <TD>Calle y número:</TD>
   <TD> <INPUT TYPE="text" NAME="domicilio" SIZE=48 MAXLENGTH=48></TD>

<TR>
  <TD>Código Postal:</TD>
  <TD> <INPUT TYPE="text" NAME="postal" SIZE=5 MAXLENGTH=5>Ciudad:
       <INPUT TYPE="text" NAME="localidad" SIZE=36 MAXLENGTH=36></TD>

<TR>
   <TD>Provincia: </TD>
   <TD> <INPUT TYPE="text" NAME="provincia" SIZE=20 MAXLENGTH=20>                Teléfono: 
         <INPUT TYPE="text" NAME="telefono" SIZE=19 MAXLENGTH=19></TD>

<TR>
   <TD>Opción:</TD>
   <TD> <SELECT NAME="OPCION">
            <OPTION>OPCION 1
            <OPTION>OPCION 2
            <OPTION>OPCION 3
            <OPTION>OPCION 4
            <OPTION>OPCION 5

        </SELECT>Escoja una opción</TD>

<TR>
   <TD>Comentarios<BR> personales:</TD>
   <TD> <TEXTAREA NAME="coment" ROWS=2 COLS=48></TEXTAREA></TD>

<TR>
   <TD><B>Pulse aquí:</B></TD>
   <TD ALIGN=CENTER>
       <INPUT TYPE="submit" VALUE="Enviar datos ">
       <INPUT TYPE="reset" VALUE="Borrar los datos"></TD>

</TABLE>
</CENTER>
</FORM>

¿Cómo se escriben los formularios ?

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:
<FORM NAME="MI_FORMULARIO" METHOD="POST"
ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT NAME="campo1">
 <INPUT TYPE="submit" VALUE="Procesar"></FORM>
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:
<FORM METHOD="POST" ACTION="indice.htm">
  ......
</FORM>
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:
<FORM METHOD="POST" ACTION="mailto:mi-usuario@miservidor-e-mail">
  ......
</FORM>
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í:
<FORM METHOD="POST" ACTION="mailto:mi-usuario@miservidor-e-mail"
 ENCTYPE="TEXT/PLAIN">
  ......
</FORM>
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:
<FORM> <INPUT SIZE=10 MAXLENGTH=10 NAME="campo1"></FORM>
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:
<FORM> <INPUT TYPE="PASSWORD" VALUE="HOLA"> </FORM>

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:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT NAME="campo1">
 <INPUT TYPE="SUBMIT" VALUE="Procesar"></FORM>
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:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT NAME="campo1">
 <INPUT TYPE="RESET" VALUE="Inicializar"></FORM>
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.
Enviar el fichero:
Se escribe:
  <FORM enctype="multipart/form-data"
  ACTION="ftp://miservidor/" METHOD="POST">
Enviar el fichero: 
<INPUT NAME="mifichero" TYPE="FILE">
<INPUT TYPE="SUBMIT" VALUE="Enviar fichero"></FORM>
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
    ACTION="ftp://miservidor/" METHOD="POST">
y escribir:
    ACTION="ftp://miusuario@miservidor/" METHOD="POST">
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í:

  <FORM enctype="multipart/form-data"
  ACTION="mailto:mi-usuario@miservidor-e-mail/" METHOD="POST">
Adjuntar el fichero: 
<INPUT NAME="mifichero" TYPE="FILE">
<INPUT TYPE="SUBMIT" VALUE="Adjuntar fichero"></FORM>

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:

<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
<INPUT TYPE=IMAGE NAME="imagen" SRC="sugeren.gif">
</FORM>
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
Clase A Clase B
Se escribe:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">
Clase A
 <INPUT TYPE="RADIO" NAME="clase" VALUE="A">
Clase B
 <INPUT TYPE="RADIO" NAME="clase" VALUE="B"></form>
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
Clase A Clase B
Se escribe:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">
Clase A
 <INPUT TYPE="CHECKBOX" NAME="clase" VALUE="A">
Clase B
 <INPUT TYPE="CHECKBOX" NAME="clase" VALUE="B"></form>
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:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">

 <SELECT NAME="lista1">
  <OPTION>Valor 1
  <OPTION>Valor 2
  <OPTION>Valor 3
</SELECT>
</FORM>
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:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">

 <SELECT NAME="lista1" SIZE=3>
  <OPTION>Valor 1
  <OPTION>Valor 2
  <OPTION>Valor 3
  <OPTION>Valor 4
  <OPTION VALUE="Valor 5">Este es el Valor 5
  <OPTION>Valor 6
  <OPTION>Valor 7
</SELECT>
</FORM>
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:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">

 <SELECT NAME="lista1" MULTIPLE SIZE=3>
  <OPTION>Valor 1
  <OPTION SELECTED>Valor 2
  <OPTION>Valor 3
  <OPTION>Valor 4
  <OPTION>Valor 5
  <OPTION>Valor 6
  <OPTION>Valor 7
</SELECT>
</FORM>
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:
<select name="coches">
   <option selected value="0">Ninguno
   <optgroup label="Coches de lujo">
      <option value="1">Rolls Royce
      <option value="2">Ferrari
      <option value="3">Mercedes
   </optgroup>
   <optgroup label="Coches normales">
      <option value="4">Renault
      <option value="5">Peugeot
      <option value="6">Seat
   </optgroup>
</select>

El elemento TEXTAREA

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:
<FORM METHOD="POST" ACTION="http://miserver.midominio.mipais/cgi-bin/test2-cgi">
 <INPUT TYPE="SUBMIT" VALUE="Procesar">
 <INPUT TYPE="RESET" VALUE="Inicializar">

 <TEXTAREA NAME="texto1" ROWS=5 COLS=40 ></TEXTAREA>
</FORM>
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:

Se escribe así:
<FORM METHOD="GET" ACTION="">

   <INPUT TYPE="text" STYLE="background:yellow;color:red" NAME="campo1">

   <INPUT TYPE="text" STYLE="border:1;background:yellow;color:blue" readonly
       NAME="campo2" VALUE="Solo lectura">

   <INPUT TYPE="button" STYLE="background:transparent;color:red" VALUE="Procesar">

</FORM>

Problemas de privacidad en los formularios

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">

<INPUT TYPE="text" NAME="Campo1" TABINDEX=2>
<INPUT TYPE="text" NAME="Campo2" TABINDEX=1>

</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">

<INPUT TYPE="text" NAME="Campo1" VALUE="Control desactivado" DISABLED>
<INPUT TYPE="text" NAME="Campo2">

</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.

Introducción a los formularios

Generalidades

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-cgi
QUERY_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.

Gráficos animados

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">

Algunos ejemplos de imágenes en listas

Se escriben todas igual, sólo hay que cambiar el nombre de los gráficos:

<DL>
    <DT><IMG SRC="bolaroja.gif">Linea de texto 
    <DT><IMG SRC="bolaroja.gif">Linea de texto 
    <DT><IMG SRC="bolaroja.gif">Linea de texto 
</DL>

Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto

Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto


Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto
Linea de texto

Imágenes de fondo

El fondo (background) de este documento es una imagen en formato GIF. Es un atributo del elemento <BODY>
Se escribe así:
<BODY BACKGROUND="yellow_r.gif">
Y es compatible con todos los demás atributos de este elemento.

Insertar imágenes

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)
<IMG SRC="sugeren.gif">texto texto texto texto 
texto texto texto texto 
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">
AQUI VA UNA IMAGEN
Imagen alineada a la izquierda.Texto alineado arriba
<IMG SRC="sugeren.gif" ALIGN=TOP> texto texto texto texto texto 
texto exto texto texto texto texto texto 
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 abajo
<IMG SRC="sugeren.gif" ALIGN=BOTTOM> texto texto texto texto texto 
texto exto texto texto texto texto texto 
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 al centro
<IMG SRC="sugeren.gif" ALIGN=MIDDLE> texto texto texto texto texto 
texto exto texto texto texto texto texto 
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
<IMG SRC="sugeren.gif" ALIGN=LEFT> texto texto texto texto texto 
texto texto texto texto texto texto texto 
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
Imagen alineada a la izquierda.Texto envolviendo la imagen
<IMG SRC="sugeren.gif" ALIGN=LEFT> texto texto texto texto texto <BR CLEAR>
texto texto texto texto texto texto texto 
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
Imagen alineada a la derecha.Texto alineado a la izquierda de la imagen
<IMG SRC="sugeren.gif" ALIGN=RIGHT> texto texto texto texto texto 
texto texto texto texto texto texto texto 
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 Si tu visualizador no soporta esto, hay un truco para conseguir algo parecido:
<TABLE> <TR><TD>texto texto texto texto texto texto texto texto texto texto texto texto</TD><TD align=center><IMG SRC="sugeren.gif"></TD></TR> </TABLE>
texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto

Imagen redimensionada a más.Texto alineado a la derecha de la imagen
<IMG SRC="sugeren.gif" ALIGN=LEFT WIDTH=272 HEIGHT=92 > texto texto texto 
texto texto texto texto texto texto texto texto texto 
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
<IMG SRC="sugeren.gif" ALIGN=LEFT WIDTH=75 HEIGHT=20 > texto texto texto 
texto texto texto texto texto texto texto texto texto 
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
<IMG SRC="sugeren.gif" ALIGN=LEFT BORDER=5> texto texto texto texto texto 
texto texto texto texto texto texto texto 
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

Imagen alineada a la izquierda.Texto alineado a la derecha de la imagen. Espacios verticales y horizontales vacíos forzados.
texto texto texto texto texto texto texzto texto texto texto texto texto 
<IMG SRC="sugeren.gif"> ALIGN=LEFT HSPACE=100 VSPACE=30> texto texto texto 
texto texto texto texto texto texto texto texto texto texto texto texto
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 texto texto texto texto texto texto texto texto texto texzto texto texto texto texto texto texto texto texto texto texto texto texzto texto texto 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

Usar una imagen como punto de montaje de un link
texto texto <A HREF="indice.htm"><IMG SRC="sugeren.gif" ></A>texto texto.
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
<A HREF="/cgi-bin/imagemap/mimapa"><IMG SRC="sugeren.gif" ISMAP></A>
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:
<A HREF="/cgi-bin/imagemap/mimapa"><IMG SRC="sugeren.gif" ISMAP></A>
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í:
<MAP NAME="nombre1">
   <AREA SHAPE="rect" COORDS="1,1,75,46" HREF="indice.htm">
   <AREA SHAPE="rect" COORDS="76,1,136,46" HREF="intro.htm">
</MAP>

<IMG SRC="sugeren.gif" USEMAP="#nombre1">
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.