<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1531275133681113837</id><updated>2012-06-04T13:37:53.809+02:00</updated><category term='presentaciones'/><category term='accesibilidad legislación'/><category term='enlaces'/><category term='accesibilidad televisión'/><category term='WCAG 2.0'/><category term='plantillas'/><category term='sabías que ...'/><category term='usabilidad textos'/><category term='navegadores trucos'/><category term='reseñas'/><category term='AJAX'/><category term='accesibilidad certificación'/><category term='accesibilidad software'/><category term='frases ...'/><category term='redes sociales'/><category term='accesibilidad general'/><category term='accesibilidad Flash'/><category term='HTML 5'/><category term='Norma UNE 139803'/><category term='documentación'/><category term='iphone'/><category term='DNIe'/><category term='usabilidad metodología'/><category term='recursos'/><category term='accesibilidad Blogger'/><category term='accesibilidad sordos'/><category term='accesibilidad ePub'/><category term='usabilidad color'/><category term='general blog'/><category term='navegadores general'/><category term='Técnicas WCAG 2.0'/><category term='WAI-ARIA'/><category term='off topic'/><category term='XHTML'/><category term='usabilidad software'/><category term='accesibilidad Word'/><category term='usabilidad general'/><category term='usabilidad internacionalización'/><category term='agenda'/><category term='accesibilidad denuncias'/><category term='CSS'/><category term='usabilidad formularios'/><category term='accesibilidad iPad'/><category term='imprescindibles'/><category term='accesibilidad PDF'/><category term='glosario'/><category term='usabilidad iPad'/><category term='navegadores extensiones'/><category term='accesibilidad móvil'/><category term='firma electrónica'/><category term='accesibilidad metodología'/><category term='tecnología asistiva'/><category term='SEO'/><category term='descargas'/><category term='estándares'/><category term='noticias'/><category term='evaluación heurística'/><category term='arquitectura de información'/><category term='accesibilidad multimedia'/><category term='cheatsheet'/><category term='accesibilidad javascript'/><category term='seminarios'/><category term='accesibilidad PowerPoint'/><category term='WCAG 1.0'/><title type='text'>Usable y accesible</title><subtitle type='html'>Consultoría de accesibilidad, usabilidad, arquitectura de información y experiencia de usuario.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/-/accesibilidad+javascript'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/search/label/accesibilidad%20javascript'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-6149716898529363247</id><published>2012-03-28T00:21:00.008+02:00</published><updated>2012-03-30T07:28:15.641+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad general'/><category scheme='http://www.blogger.com/atom/ns#' term='XHTML'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Descripción extensa de una imagen: accesible con lector de pantalla y visible sin imágenes activas</title><content type='html'>&lt;p&gt;El objetivo de este artículo es explicar cómo podemos tener una descripción extensa de una imagen en la propia página, de tal manera que:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;sea accesible para los lectores de pantalla&lt;/li&gt;&lt;li&gt;se visualice cuando la imagen no esté cargada (bien porque tenemos las imágenes desactivadas, bien porque ya no se encuentra disponible, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Todo ello sin depender del atributo &lt;code&gt;longdesc&lt;/code&gt;, que no siempre es soportado, ni de los típicos enlaces [D] junto a la imagen (conocidos como &lt;em&gt;D-Link&lt;/em&gt;); y asegurando que no dé problemas cuando se deshabilita el javascript o las CSS.&lt;/p&gt;&lt;p&gt;Este artículo se me ocurrió después de leer el artículo de Steve Faulkner &lt;a  href="http://www.paciellogroup.com/blog/2011/10/detecting-if-images-are-disabled-in-browsers/" lang="en" target="_blank" title="Se abre en otra ventana"&gt;Detecting if images are disabled in browsers&lt;/a&gt;, en el cual explicaba cómo podemos detectar por javascript si las imágenes están deshabilitadas o no se han cargado.&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;p&gt;&lt;a  href="http://www.usableyaccesible.com/ejemplo_descripcion_accesible/descripcion_imagenes_accesibles.html" target="_blank" title="Se abre en ventana nueva"&gt;Ver la página de ejemplo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;a  href="http://www.usableyaccesible.com/ejemplo_descripcion_accesible/ejemplo_descripcion_accesible.rar"&gt;Descargar el ejemplo&lt;/a&gt; (RAR, 13Kb)&lt;/p&gt;&lt;p&gt;La descarga y uso del ejemplo es completamente libre, pero os agradecería mucho que compartierais mejoras que se os ocurran o problemas que detectéis.&lt;/p&gt;&lt;p&gt;He probado su funcionamiento con NVDA, Explorer 7, Explorer 8, Explorer 9, Firefox 1.5, Firefox 2, Firefox 3, Firefox 11, Chrome 17, Opera 11, Safari 5 (para Windows) y desde una BlackBerry y una iPad. En Explorer 6 no hay problema para visualizar la descripción, pero se ve siempre presente como si el javascript estuviera deshabilitado.&lt;/p&gt;&lt;/div&gt;&lt;h2&gt;HTML&lt;/h2&gt;&lt;p&gt;El código HTML es &lt;strong&gt;XHTML 1.0 Strict válido&lt;/strong&gt; y es el siguiente. En primer lugar tenemos la cabecera:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"  &amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Ejemplo descripción extensa accesible de imágenes&amp;lt; /title &amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /&amp;gt;&lt;br /&gt;&amp;lt;meta name="author" content="Olga Carreras" /&amp;gt;&lt;br /&gt;&amp;lt;meta name="description" content="Descripciones extensas de imágenes accesibles con lectores de pantalla y sin imágenes activas" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;link href="estilos.css" type="text/css" rel="stylesheet" media="all" /&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="utils.js"&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Como se ve, estoy llamando a una CSS y a un JS que explico más adelante.&lt;/p&gt;&lt;p&gt;A continuación tenemos el cuerpo de la página:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Ejemplo de descripción extensa de una imagen: accesible con lector de pantalla y sin imágenes activas&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Olga Carreras. Ejemplo del artículo &amp;lt;a href="http://olgacarreras.blogspot.com"&gt;"Descripción extensa de una imagen: accesible con lector de pantalla y sin imágenes activas"&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Después de lo que es el título de la página y el enlace al artículo tenemos ya la imagen:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;img src="razones_uso_tecnologia_accesible.gif" alt="Razones de uso de la tecnología accesible" id="image1" class="images" /&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;a href="#descripcion" title="Mostrar la descripción de la imagen Razones de uso de la tecnología accesible" id="linkDescripcion" class="oculto"&amp;gt;Ver descripción de la imagen&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;La imagen es un gráfico, por tanto el atributo ALT no es suficiente, necesitamos una descripción detallada la imagen.&lt;/p&gt;&lt;p&gt;&lt;img border="0" height="386" width="400" src="http://3.bp.blogspot.com/-1GjO9TcyNME/T3IwFUkxdHI/AAAAAAAABg8/aOSkg3RKILw/s400/grafico_descripcion.jpg" alt="Imagen compleja de un gráfico con un enlace bajo la misma Mostrar descripción de la imagen" /&gt;&lt;/p&gt;&lt;p&gt;Os preguntaréis &lt;strong&gt;la razón por la cuál he incluido a continuación de la imagen un enlace "Ver descripción de la imagen".&lt;/strong&gt;&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;p&gt;Ese enlace no es necesario puesto que si la imagen no está cargada se verá la descripción detallada y los lectores de pantalla no van a tener problemas para acceder a dicha descripción.&lt;/p&gt;&lt;p&gt;Sin embargo, puede darse el caso de &lt;strong&gt;usuarios con vista cansada o que accedan desde un dispositivo móvil y el tamaño de letra de la imagen les resulte pequeño&lt;/strong&gt; (y no sepan o no puedan hacer zoom de la imagen)&lt;/p&gt;&lt;p&gt;En ese caso les puede ser de utilidad pulsar el enlace para ver la descripción.&lt;/p&gt;&lt;p&gt;El enlace es un ancla al comienzo de la descripción, después veremos que mediante javascript no intrusivo se le ha asignado una función que permite mostrar/ocultar la descripción detallada y personalizar el texto y el TITLE del enlace en función de si se visualiza o no la descripción.&lt;/p&gt;&lt;/div&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div id="descripcion" class="visible"&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;&amp;lt; &amp;lt; Descripción de la imagen: Razones de uso de la tecnología accesible&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;h3&amp;gt;Por entorno laboral&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Con discapacidad severa: 4%&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;lt;Con discapacidad moderada: 3%&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;lt;Sin discapacidad: 6%&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;[el resto de la descripción larga, no la pongo aquí toda]&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Como vemos, a continuación se incluye la descripción detallada correctamente maquetada. &lt;strong&gt;Esta descripción se oculta una vez cargada la página mediante javascript no intrusivo, por tanto estará disponible tanto sin javascript activo como sin CSS activas&lt;/strong&gt;, debajo de la imagen.&lt;/p&gt;&lt;p&gt;Con CSS activas, tanto si pulsas el enlace como si no se carga la imagen, la descripción se posiciona a la derecha de la imagen.&lt;/p&gt;&lt;p&gt;&lt;img border="0" width="570" height="235" src="http://4.bp.blogspot.com/-R9PlrS433bs/T3IyoRhmp_I/AAAAAAAABhU/uyJec1K33nk/s1600/grafico_descripcion_visible.jpg" alt="Imagen compleja de un gráfico, con un enlace bajo la misma Ocultar descripción de la imagen y la descripción detallada de la imagen al lado de la misma"/&gt;&lt;/p&gt;&lt;p&gt;Por otro lado veremos que la descripción extensa se está ocultando de forma accesible, así que los usuarios que usan un lector de pantalla (podéis probarlo con NVDA) escuchan la descripción a continuación de la imagen y el enlace.&lt;/p&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div class="pie"&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Probad a deshabilitar javascript, css o imágenes. Para ver sin imágenes cargadas o sin javascript activo acordaros de recargar la página una vez que los desactivéis.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Para facilitaros verla sin la imagen cargada os dejo una copia de la misma página pero donde se ha escrito mal el nombre de la imagen y por tanto no la encuentra: &amp;lt;a href="descripcion_imagenes_accesibles_sinimg.html"&amp;gt;Probar esta página cuando no se encuentra la imagen.&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;En el pie de la página os recuerdo que si deshabilitáis el javascript, las CSS o las imágenes mientras visualizáis la página deberéis recargarla. Para facilitaros comprobar que, efectivamente, cuando no se carga la imagen se muestra por defecto la descripción a su lado, os pongo un enlace a una copia de la página donde he escrito mal el nombre de la imagen para comprobar &lt;strong&gt;cómo se ve la página sin la imagen cargada&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img border="0" height="246" width="570" src="http://3.bp.blogspot.com/-JUcidYuvQhw/T3IzudqFg7I/AAAAAAAABhg/yWf-A2katCs/s1600/imagen_no_cargada.jpg" alt="Hueco donde debería estar la imagen con un texto en su interior. A su derecha la descripción detalla de la imagen" /&gt;&lt;/p&gt;&lt;p&gt;Como se observa, &lt;strong&gt;cuando la imagen no se ha podido mostrar, se ve en el hueco que ocuparía la imagen su ALT, y junto a la imagen aparece por defecto la descripción detallada.&lt;/strong&gt; Ya no se muestra el enlace "Ver descripción de la imagen" porque no es necesario.&lt;/p&gt;&lt;div class="destacado"&gt;&lt;p&gt;Me parece importante destacar que se ha separado:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;el contenido: eso es únicamente lo que vemos en la página HTML&lt;/li&gt;&lt;li&gt;la presentación: no se especifica ningún estilo en la página, todos están recogidos en la CSS&lt;/li&gt;&lt;li&gt;el código javascript: no hay ningún evento, ninguna función, nada que haga sospechar que esta página incluye javascript (salvo la llamada al JS en el HEAD). &lt;strong&gt;Todo el javascript, incluso las funciones que se llaman en el onLoad de la página, están definidas de forma no intrusiva&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2&gt;CSS&lt;/h2&gt;&lt;p&gt;La CSS es &lt;strong&gt;CSS 2.1 válida&lt;/strong&gt;. No pongo toda la CSS, sólo aquello que es relevante para el ejemplo.&lt;/p&gt;&lt;code&gt;&lt;br /&gt;.oculto{&lt;br /&gt;position:absolute;&lt;br /&gt;left:-999em;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Con esta clase general "oculto" oculto aquellos elementos que me interesa:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;al cargarse la página compruebo si la imagen se ha cargado, en cuyo caso oculto por javascript la descripción. Sin javascript activo, por tanto, la descripción se verá.&lt;/li&gt;&lt;li&gt;el enlace "Ver descripción de la imagen" tiene esta clase "oculto" por defecto y una vez cargada la página lo hago visible. De esta manera, sin javascript activo, el enlace no se muestra puesto que ya no es necesario.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;La forma de ocultar&lt;/strong&gt; (mediante posicionamiento fuera de pantalla) &lt;strong&gt;permite que los lectores de pantalla sí puedan acceder al contenido oculto, algo que no ocurre con &lt;code&gt;display:none&lt;/code&gt;&lt;/strong&gt;. Más detalles en &lt;a href="http://olgacarreras.blogspot.com.es/2011/11/ocultar-contenido-sin-comprometer-la.html"&gt;"Ocultar contenido sin comprometer la accesibilidad ni el posicionamiento de la página"&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Otros estilos que me interesa comentar son los de la imagen:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;.images{&lt;br /&gt;width:auto;&lt;br /&gt;height:auto;&lt;br /&gt;}&lt;br /&gt;.widthImage1{&lt;br /&gt;width:393px;&lt;br /&gt;height:363px;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Por defecto indico que el ancho de las imágenes sea "auto". &lt;strong&gt;No puedo poner por defecto el tamaño real de la imagen porque el script se basa en comprobar si el ancho de la imagen es diferente del ancho que debería tener&lt;/strong&gt;, en cuyo caso es que la imagen no está cargada.&lt;/p&gt;&lt;p&gt;Sin embargo tengo una clase con el tamaño real de la imagen porque en Safari y Chrome, si la imagen no tiene especificado su ancho y alto real, no se muestra su atributo ALT. Así que veremos que en el script, &lt;strong&gt;tras comprobar el ancho de la imagen para saber si la imagen está cargada, le aplico la clase "widthImage1", y de este modo en Safari y Chrome vemos su ALT&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;JS&lt;/h2&gt;&lt;code&gt;&lt;br /&gt;function addLoadEvent(func) {&lt;br /&gt;var oldonload = window.onload;&lt;br /&gt;if (typeof window.onload != 'function') {&lt;br /&gt;window.onload = func;&lt;br /&gt;} else {&lt;br /&gt;window.onload = function() {&lt;br /&gt;if (oldonload) {&lt;br /&gt;oldonload();&lt;br /&gt;}&lt;br /&gt;func();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;La función "addLoadEvent" es la que nos permite llamar a funciones en el onLoad de la página de forma no intrusiva.&lt;/p&gt;&lt;p&gt;¿Qué funciones estamos llamando? Primero a &lt;code&gt;addLoadEvent(noimage)&lt;/code&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;var Image1Width=393;&lt;br /&gt;function noimage(){&lt;br /&gt;var objImagen = document.getElementById('image1');&lt;br /&gt;var objDescripcion = document.getElementById('descripcion');&lt;br /&gt;var linkDescripcion = document.getElementById( 'linkDescripcion' );&lt;br /&gt;objDescripcion.className = 'oculto';&lt;br /&gt;linkDescripcion.className = 'visible';&lt;br /&gt;if (objImagen.offsetWidth != Image1Width)&lt;br /&gt;{&lt;br /&gt;objDescripcion.className = 'visible';&lt;br /&gt;objImagen.className = 'widthImage1';&lt;br /&gt;linkDescripcion.className = 'oculto';&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Lo primero que hago, como ya he comentado, es ocultar la descripción larga de la imagen y mostrar el enlace "Ver descripción de la imagen".&lt;/p&gt;&lt;p&gt;A continuación &lt;strong&gt;compruebo si el ancho de la imagen es diferente del ancho que debería tener, en cuyo caso es que la imagen no se ha cargado.&lt;/strong&gt;&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;p&gt;En la propuesta de S.Faulkner se comparaba si era igual a 1, pero esto no me funcionaba en todos los navegadores. &lt;strong&gt;Por eso lo comparo con el ancho real "393"&lt;/strong&gt;. Es más "sucio" porque no me sirve para todas las imágenes como el compararlo con 1, sino que he de personalizarlo para cada una, pero &lt;strong&gt;funciona en todos los navegadores.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Nota: Faulkner lo comparaba con 1 porque no le ponía ALT a las imágenes. Entonces el hueco de la imagen no se adaptaba al ALT y por eso su ancho era 1 cuando no estaba cargada. Como se debe poner ALT tenemos que hacerlo comparándolo con su ancho real. Por otro lado, indicar el ancho y alto de la imagen ayuda a las personas que ven la página sin la imagen cargada a hacerse una idea del tamaño que esta tenía.&lt;/p&gt;&lt;p&gt;En el caso de que la imagen no se haya cargado muestro la descripción, cambio la clase de la CSS aplicada a la imagen (ya he explicado en la CSS que es para que en Chrome y Safari se vea el atributo ALT dentro de la zona de la imagen) y oculto el enlace "Ver descripción de la imagen" porque el enlace ya no es necesario.&lt;/p&gt;&lt;p&gt;La otra función que llamo en el onLoad de la página es la siguiente:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;addLoadEvent (function(){&lt;br /&gt;var linkDescripcion = document.getElementById( 'linkDescripcion' );&lt;br /&gt;var objDescripcion = document.getElementById('descripcion');&lt;br /&gt;linkDescripcion.onclick = function(){&lt;br /&gt;if (objDescripcion.className == 'oculto')&lt;br /&gt;{&lt;br /&gt;objDescripcion.className = 'visible';&lt;br /&gt;linkDescripcion.innerHTML="Ocultar descripción de la imagen";&lt;br /&gt;linkDescripcion.title="Ocultar la descripción de la imagen Razones de uso de la tecnología accesible"&lt;br /&gt;}else{&lt;br /&gt;objDescripcion.className = 'oculto';&lt;br /&gt;linkDescripcion.innerHTML="Ver descripción de la imagen";&lt;br /&gt;linkDescripcion.title="Mostrar la descripción de la imagen Razones de uso de la tecnología accesible"&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Esta función &lt;strong&gt;añade al evento "onClick" del enlace "Ver descripción de la imagen" una función que&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Si la descripción de la imagen está oculta&lt;/strong&gt;, al pulsar el enlace la mostraremos. Y a continuación cambiaremos el texto del enlace por su nueva acción "Ocultar descripción de la imagen" y cambiaremos también el TITLE de la imagen para que esté acorde con su nueva función de ocultar la descripción.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Si la descripción de la imagen está visible&lt;/strong&gt;, al pulsar el enlace la ocultaremos. Y a continuación cambiaremos en texto del enlace por su nueva acción "Ver descripción de la imagen" y cambiaremos también el TITLE de la imagen para que esté acorde con su nueva función de mostrar la descripción.&lt;/li&gt;&lt;/ul&gt;&lt;div class="entradilla"&gt;&lt;p&gt;Algo que no he hecho para que se viera más claro lo que hacían las funciones y que se debería hacer para &lt;strong&gt;separar el código javascript del texto concreto que queremos personalizar&lt;/strong&gt;, sería &lt;strong&gt;definir esos literales en un fichero diferente de variables&lt;/strong&gt; para que nos sean más sencillos de modificar. Así en el código sólo incluiriamos variables y no texto concreto.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Os animo ha que dejéis en los comentarios cualquier sugerencia de mejora o problema que detectéis.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Artículos relacionados:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2010/12/asociacion-compleja-de-radios-y-labels.html"&gt;Asociación compleja de radios y labels de forma accesible&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2012/03/que-teclas-de-acceso-rapido-accesskey.html"&gt;Qué teclas de acceso rápido (accesskey) utilizar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es//2007/02/formulario-con-varios-botones.html"&gt;Formulario con varios botones. Implementación usable y accesible&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2007/02/ajax-accesible.html"&gt;AJAX accesible&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2007/02/enlaces-que-actan-como-botones.html"&gt;Enlaces que actúan como botones. Implementación accesible.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-6149716898529363247?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/6149716898529363247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2012/03/descripcion-extensa-de-una-imagen.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/6149716898529363247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/6149716898529363247'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2012/03/descripcion-extensa-de-una-imagen.html' title='Descripción extensa de una imagen: accesible con lector de pantalla y visible sin imágenes activas'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-1GjO9TcyNME/T3IwFUkxdHI/AAAAAAAABg8/aOSkg3RKILw/s72-c/grafico_descripcion.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-8508479034626904098</id><published>2009-05-05T21:30:00.022+02:00</published><updated>2012-04-16T14:19:11.856+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Técnicas WCAG 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='WCAG 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad Flash'/><title type='text'>Técnicas WCAG 2.0 para 10 dudas habituales sobre accesibilidad</title><content type='html'>&lt;p&gt;El contenido de este artículo se ha movido a la recopilación &lt;a href="http://olgacarreras.blogspot.com.es/2011/01/respuesta-25-dudas-habituales-sobre.html"&gt;Respuesta a 25 dudas habituales sobre accesibilidad web &lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-8508479034626904098?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/8508479034626904098/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2009/05/tecnicas-wcag-20-para-10-dudas.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/8508479034626904098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/8508479034626904098'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2009/05/tecnicas-wcag-20-para-10-dudas.html' title='Técnicas WCAG 2.0 para 10 dudas habituales sobre accesibilidad'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-8365798972405820504</id><published>2007-10-22T14:20:00.001+02:00</published><updated>2009-03-27T23:25:58.138+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><title type='text'>HIJAX</title><content type='html'>&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;&lt;br /&gt;[26-05-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html"&gt;AJAX accesible I&lt;/a&gt;&lt;br /&gt;[07-09-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html"&gt;AJAX accesible II: WAI-ARIA&lt;/a&gt;&lt;br /&gt;[27-03-09] &lt;a href="http://olgacarreras.blogspot.com/2009/03/ajax-accesible-iv-tecnicas-aria-de-las.html"&gt;AJAX accesible IV: Técnicas ARIA de las WCAG 2.0&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;El otro día me preguntaban qué era &lt;strong&gt;Hijax&lt;/strong&gt;, si era la evolución de AJAX, o algo nuevo, o ¡qué era!, muy preocupado por si se estaba perdiendo algo referente a AJAX. No me voy a extender mucho, ya habló de Hijax Fran Tarifa el otro día en &lt;a href="http://accesibilidadweb.blogspot.com/2007/10/hijax-ajax-accesible.html" target="_blank"&gt;Hijax: ¿Ajax accesible?&lt;/a&gt; (aunque no estoy de acuerdo con sus conclusiones)&lt;br /&gt;&lt;br /&gt;Hijax &lt;strong&gt;es una metodología&lt;/strong&gt; a seguir a la hora de realizar aplicaciones AJAX, que consiste en aplicar a estos desarrollos la estrategia que se conoce como &lt;a href="http://es.wikipedia.org/wiki/Progressive_Enhancement" target="_blank"&gt;"mejora progresiva"&lt;/a&gt;, propia del diseño web, para que dichos desarrollos AJAX sean accesibles.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Jeremy Keith&lt;/strong&gt; ya hablaba de aplicar la "mejora progresiva" a AJAX en marzo de 2005, antes de que se le ocurriera bautizar a esta metodología como Hijax, en su artículo &lt;a href="http://adactio.com/journal/959" target="_blank"&gt;Progressive enhancement with Ajax&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Parece que esto de Hijax es nuevo, pero Jeremy no se inventó el término ayer, sino el 1 de enero de 2006 a las 7:40, en el artículo &lt;a href="http://domscripting.com/blog/display/41" target="_blank"&gt;Hijax&lt;/a&gt;. Supongo que esa Nochevieja fue sonada para sentarse a primera hora a hablar de Hijax [bromilla].&lt;br /&gt;&lt;br /&gt;El caso es que últimamente se oye hablar mucho de Hijax, como algo nuevo, lo cual se debe en parte a sus ponencias como "&lt;a href="http://adactio.com/extras/slides/bulletproof.pdf"&gt;Bulletproof AJAX (Ajax a pruebas de balas)&lt;/a&gt;" y en parte a ese curioso boca a boca exponencial (&lt;em&gt;buzz&lt;/em&gt;) propio de Internet.&lt;br /&gt;&lt;br /&gt;Esto de bautizar a todo con un nombre gancho es muy habitual (AJAX, Web 2.0, etc.) y muy eficaz para estar en boca de todos (o en blog de todos, como tendríamos que decir hoy en día), pero bueno, no está mal si eso ayuda a difundir buenas prácticas. Hay que reconocerle a Jeremy Keith que lleva ya años abogando por hacer las cosas bien, es simplemente que me hace gracia como de repente todo el mundo habla de algo cotidiano y habitual como si fuera muy novedoso por tener un nombre vistoso. Él mismo ironizaba:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="esp"&gt;&lt;cite&gt;I’ve even got a nice shiny buzzword for this technique: Hijax. (&lt;a href="http://domscripting.com/blog/display/41"&gt;Hijax&lt;/a&gt;,  Jeremy Keith) &lt;strong&gt;[1]&lt;/strong&gt;&lt;/cite&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;Pero dime, &lt;strong&gt;¿en qué consiste eso de Hijax?&lt;/strong&gt; Pues me temo que te va a decepcionar un poco, porque no es más que aplicar aquello que venimos recomendando una y otra vez: JavaScript no intrusivo a la hora de plantear alternativas accesibles.&lt;br /&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;El resumen es el siguiente:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1. Haz que la aplicación funcione sin AJAX mediante peticiones normales al servidor que recarguen la página.&lt;br /&gt;&lt;br /&gt;2. Ahora añade JavaScript no intrusivo para incluir el código AJAX, de este modo, si el &lt;em&gt;user-agent&lt;/em&gt; no admite JavaScript o está desactivado, la aplicación seguirá funcionando correctamente, puesto que el código es invisible y no afecta al funcionamiento de la página.&lt;br /&gt;&lt;br /&gt;Según dice Jeremy, la clave es: &lt;em&gt; Plan for Ajax from the start. Implement Ajax at the end.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nada nuevo, pero si llamarle Hijax ayuda a difundir las buenas prácticas de la programación AJAX, pues nada: viva Hijax! todos a aplicar Hijax! es decir, a seguir haciendo las cosas bien.&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[1]&lt;/strong&gt; &lt;br /&gt;&lt;blockquote class="esp"&gt;&lt;cite&gt;&lt;br /&gt;&lt;em&gt;There seems to be an inherent paradox in saying that you need to think about your server-side architecture but you should just be building old-fashioned page by page submissions before &lt;strong&gt;hijacking&lt;/strong&gt; them with Ajax&lt;/em&gt; (&lt;a href="http://domscripting.com/blog/display/41"&gt;Hijax&lt;/a&gt;,  Jeremy Keith) &lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Hijax, vendría del término "hijack", secuestrar.&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;&lt;br /&gt;[26-05-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html"&gt;AJAX accesible I&lt;/a&gt;&lt;br /&gt;[07-09-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html"&gt;AJAX accesible II: WAI-ARIA&lt;/a&gt;&lt;br /&gt;[27-03-09] &lt;a href="http://olgacarreras.blogspot.com/2009/03/ajax-accesible-iv-tecnicas-aria-de-las.html"&gt;AJAX accesible IV: Técnicas ARIA de las WCAG 2.0&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-8365798972405820504?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/8365798972405820504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/hijax.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/8365798972405820504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/8365798972405820504'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/hijax.html' title='HIJAX'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-1741074917753920902</id><published>2007-09-24T16:36:00.004+02:00</published><updated>2012-03-28T22:45:27.879+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><title type='text'>Enlaces que actúan como botones. Implementación accesible.</title><content type='html'>&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/Strong&gt;&lt;br /&gt;[19-07-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/formulario-con-varios-botones.html"&gt;Formulario con varios botones. Implementación usable y accesible.&lt;/a&gt;&lt;br /&gt;[28-02-08] &lt;a href="http://olgacarreras.blogspot.com/2007/02/formularios-usables-60-directrices-de.html"&gt;Formularios usables: 60 Directrices de Usabilidad&lt;/a&gt;&lt;br /&gt;[28-03-12] &lt;a href="http://olgacarreras.blogspot.com.es/2012/03/descripcion-extensa-de-una-imagen.html"&gt;Detectar si una imagen se ha cargado. Descripción extensa de una imagen: accesible con lector de pantalla y visible sin imágenes activas &lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;A menudo nos encontramos con enlaces que actúan como botones, es decir, no enlazan con una nueva página u operativa en el "href", sino que este se deshabilita con "#", "void(0)" o "javascript:;" y se le asigna por ejemplo un "onclick" que realice una acción.&lt;br /&gt;&lt;br /&gt;Encontramos este tipo de enlaces sustituyendo a los botones de un formulario, o aparecen en la última columna de una tabla para realizar alguna acción asociada a esa fila ("Editar", "Detalle", etc.), o en otros muchos contextos.&lt;br /&gt;&lt;br /&gt;¿Necesitas por exigencias contra las que ya no puedes luchar que sean enlaces?... bueno, no pasa nada, pero hagámoslo bien.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Quiero hacer esto&lt;/h2&gt;&lt;br /&gt;Vamos a imaginar el siguiente ejemplo: tenemos un formulario muy simple, con un único campo "Nombre" que queremos enviar mediante un enlace "Enviar".&lt;br /&gt;&lt;br /&gt;Su aspecto sería el siguiente:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YbxPdQNXKz4/ThDoPVNOdGI/AAAAAAAABH4/rY1tT2NjDV0/s1600/boton_como_enlace.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="36" width="243" src="http://2.bp.blogspot.com/-YbxPdQNXKz4/ThDoPVNOdGI/AAAAAAAABH4/rY1tT2NjDV0/s400/boton_como_enlace.jpg" alt="Ejemplo visual del formulario descrito" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;¿Qué nos podemos encontrar?&lt;/h2&gt;&lt;br /&gt;Veamos varias variantes. &lt;strong&gt;NINGUNA&lt;/strong&gt; de ellas es accesible:&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;a href="javascript:enviar()"&gt;Enviar&amp;lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;a href="#" onclick="enviar()"&gt;Enviar&amp;lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;a href="javascript:void(0)" onclick="enviar()"&gt;Enviar&amp;lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4.&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;a href="javascript:;" onclick="enviar()"&gt;Enviar&amp;lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5.&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;a href="javascript:;" onclick="enviar()" onkeypress="enviar()"&gt;Enviar&amp;lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6.&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;a href="javascript:;" id="enlaceEnviar"&gt;Enviar&amp;lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Todas ellas llaman a la función &lt;code&gt;enviar()&lt;/code&gt; que somete el formulario:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;function enviar(){document.miform.submit()}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Salvo la versión 6, que se han molestado en implementar javascript no-intrusivo.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;document.getElementById("enlaceEnviar").onclick=function (){document.miform.submit()}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;¿Por qué ninguna de estas opciones es accesible?&lt;/h2&gt;&lt;br /&gt;Porque todas dependen de que el navegador del usuario admita javascript o lo tenga activo. En caso contrario no funcionará.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;¿Cuál es entonces la solución?&lt;/h2&gt;&lt;br /&gt;Pues si Mahoma no va a la montaña...&lt;br /&gt;&lt;div class="entradilla"&gt;¿Por qué empeñarnos en hacer enlaces que actúen como botones? ¿Por qué no hacemos botones que parezcan enlaces?&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;input type="submit" name="enviar" id="enviar" value="Enviar" class="enlace" /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Este botón tendrá el mismo aspecto que nuestro enlace tan sólo con que definamos su clase "enlace" (en la CSS) de esta manera:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;input.enlace{border:0; background-color:#fff; text-decoration:underline; color:#000; cursor:pointer;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¿Por qué algo tan sencillo y limpio no se encuentra nunca? &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Nota:&lt;/strong&gt; si necesitas tener varios botones que actúen de esta manera, quizás deberías leer &lt;a href="http://olgacarreras.blogspot.com/2007/02/formulario-con-varios-botones.html"&gt;Formulario con varios botones. Implementación accesible.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/Strong&gt;&lt;br /&gt;[19-07-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/formulario-con-varios-botones.html"&gt;Formulario con varios botones. Implementación usable...&lt;/a&gt;&lt;br /&gt;[28-02-08] &lt;a href="http://olgacarreras.blogspot.com/2007/02/formularios-usables-60-directrices-de.html"&gt;Formularios usables: 60 Directrices de Usabilidad&lt;/a&gt;&lt;br /&gt;[28-03-12] &lt;a href="http://olgacarreras.blogspot.com.es/2012/03/descripcion-extensa-de-una-imagen.html"&gt;Detectar si una imagen se ha cargado. Descripción extensa de una imagen: accesible con lector de pantalla y visible sin imágenes activas &lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-1741074917753920902?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/1741074917753920902/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/enlaces-que-actan-como-botones.html#comment-form' title='21 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/1741074917753920902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/1741074917753920902'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/enlaces-que-actan-como-botones.html' title='Enlaces que actúan como botones. Implementación accesible.'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-YbxPdQNXKz4/ThDoPVNOdGI/AAAAAAAABH4/rY1tT2NjDV0/s72-c/boton_como_enlace.jpg' height='72' width='72'/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-4840904833501589998</id><published>2007-09-07T13:07:00.017+02:00</published><updated>2012-02-28T13:08:31.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='WAI-ARIA'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><title type='text'>AJAX Accesible (II): WAI-ARIA</title><content type='html'>&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;&lt;br /&gt;[26-05-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html"&gt;AJAX accesible I&lt;/a&gt;&lt;br /&gt;[22-10-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/hijax.html"&gt;AJAX accesible III: HIJAX&lt;/a&gt;&lt;br /&gt;[27-03-09] &lt;a href="http://olgacarreras.blogspot.com/2009/03/ajax-accesible-iv-tecnicas-aria-de-las.html"&gt;AJAX accesible IV: Técnicas ARIA de las WCAG 2.0&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Nota 2012&lt;/strong&gt;: cuando en el artículo se ponen ejemplos como &lt;code&gt;x2:role="role:checkbox" aaa:checked="true"&lt;/code&gt; actualmente se marcan como &lt;code&gt;role=”checkbox” aria-checked="true"&lt;/code&gt;. Sobre la simplificación actual en la especificación de roles y atributos: &lt;a href="http://simplyaccessible.com/article/break-the-rules/" lang="en" hreflang="en"&gt;Knowing when to break the rules&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Por otra parte, en el artículo &lt;a href="http://olgacarreras.blogspot.com/2012/02/html-5-y-accesibilidad.html"&gt;HTML5 y accesibilidad&lt;/a&gt; hablo sobre el soporte de Aria Roles por los diferentes lectores de pantalla y sobre cómo usarlos con las nuevas etiquetas semánticas de HTML5.&lt;/p&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;&lt;br /&gt;&lt;p&gt;Cuando abordé hace unos meses el tema de &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html" target="_blank"&gt;AJAX Accesible&lt;/a&gt; nombré de pasada WAI-ARIA, sin profundizar más en el tema, puesto que me parecía suficientemente importante para abordarlo en un futuro en otro artículo diferente.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A raíz de un correo en el que se me preguntaba sobre el tema, influenciada por el hecho de que en el último mes he estado dedicada en exclusiva a desarrollos AJAX, y consciente de que hay muy poca documentación o artículos sobre el tema (y menos aún en español), me ha parecido que era un buen momento para escribir algo al respecto. Espero que le sea de utilidad al lector que me preguntaba por este tema y a cualquiera que se dejé caer por aquí. Y ya de paso, me gustaría saber si alguien está aplicándolo en la práctica.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="problema" id="problema"&gt;&lt;/a&gt;Cuál es el problema&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Pongamos un ejemplo. Nos serviría cualquiera en el cual se modificara dinámicamente una página web. Imaginemos el siguiente: &lt;/p&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;&lt;br /&gt;&lt;p&gt;Tenemos un enlace o botón ("Ver última noticia") en nuestra página. Al pulsarlo se escribe una noticia mediante la modificación del &lt;em&gt;innerHTML&lt;/em&gt; del &lt;em&gt;div&lt;/em&gt; que la contiene.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Me da igual que se utilice o no AJAX, puesto que el problema es el mismo en ambos casos, pero imaginemos que recuperamos el texto de la noticia mediante AJAX. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Es sólo un ejemplo, no entraremos en si es o no usable.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Con un navegador que admita javascript, que lo tenga activo y soporte AJAX&lt;/strong&gt;, no tendremos ningún problema: el texto de la noticia se escribirá dinámicamente.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Además hemos hecho los deberes (ver &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html" target="_blank"&gt;AJAX Accesible&lt;/a&gt;) y si el usuario trabaja con un &lt;em&gt;user-agent&lt;/em&gt; &lt;strong&gt; que no admita javascript, no lo tenga activo o no soporte AJAX&lt;/strong&gt;, no tendrá problemas, puesto que la página se recargará para mostrarle de nuevo la página con la noticia (o cualquier otra alternativa que se decida).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Podríamos pensar que nuestra página ya no presenta problemas pues hemos tenido en cuenta su accesibilidad, hemos proporcionado una alternativa, de modo que todos los usuarios puedan leer la noticia.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Y sin embargo sigue existiendo un problema de accesibilidad, puesto que hay usuarios que &lt;strong&gt;no podrán leer esa noticia&lt;/strong&gt;, ¿quiénes? Haz la prueba. Eres un usuario que tienes por ejemplo Explorer (o cualquier otro navegador que soporte javascript y lo tenga activo). Pero además eres invidente y usas, por ejemplo, JAWS como lector de pantalla. Cuando pulsas "Ver última noticia" esta aparece en la página gracias a AJAX sin ningún problema, pero tú no puedes verla, &lt;strong&gt;¿te lee JAWS el texto de la noticia?&lt;/strong&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;La &lt;strong&gt;respuesta es NO&lt;/strong&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="soluccion" id="soluccion"&gt;&lt;/a&gt;Cuál es la solución: WAI-ARIA&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; (&lt;span lang="en"&gt;Accessible Rich Internet Applications&lt;/span&gt;) Suite incluye los siguientes documentos:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;La hoja de ruta&lt;/strong&gt;: &lt;a href="http://www.w3.org/TR/aria-roadmap/" target="_blank"&gt;Roadmap for Accessible Rich Internet Applications (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt;  Roadmap)&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;WAI-ARIA Roles&lt;/strong&gt; (en español se ha traducido "roles" por "funciones"): &lt;a href="http://www.w3.org/TR/wai-aria/" target="_blank"&gt;Roles for Accessible Rich Internet Applications (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; Roles)&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;WAI- States&lt;/strong&gt; (estados y propiedades): &lt;a target="_blank" href="http://www.w3.org/TR/wai-aria/"&gt;States and Properties Module for Accessible Rich Internet Applications&lt;/a&gt; (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; States and Properties). &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;[nota 2009: &lt;a href="http://www.w3.org/TR/wai-aria/"&gt;se han actualizado estos documentos&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="descripcion" id="descripcion"&gt;&lt;/a&gt;En qué consiste la solución&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;a name="AT" id="AT"&gt;&lt;/a&gt;Cuando hable de AT me referiré a cualquier tecnología asistiva (&lt;span lang="en"&gt;Assistive Technology&lt;/span&gt; (&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;)): lectores de pantalla, software de dictado o teclados de pantalla.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="esp"&gt;&lt;a name="tabindex" id="tabindex"&gt;&lt;/a&gt;Tabindex&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Lo primero que necesita saber la &lt;a href="#AT"&gt;&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;&lt;/a&gt; es &lt;strong&gt;qué objeto tiene el foco&lt;/strong&gt;. &lt;br /&gt;Necesitamos que aquellos objetos que vayan a cambiar dinámicamente puedan coger el foco, para ello utilizamos &lt;code&gt;tabindex="-1"&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite lang="en"&gt;Virtually all adaptive technology solutions, such as screen readers and onscreen keyboards, need to know what object currently has focus. […] HTML 4.01 and XHTML 1.x limit script authors to only being able to provide focus to form and anchor elements yet the Document Object Model Specification allows all elements to receive events including keyboard events. This means that HTML, by design prohibits script authors from making all HTML elements keyboard accessible. This single problem has impacted the usability of Web pages whereas gaining access to all elements means using the tab key on desktop browsers. This slow, unproductive, approach makes it difficult for portal navigation whereas all active elements must be tabbed through to get to an active element in the last portlet in a document. &lt;strong&gt;To solve this problem in XHTML 1.x we are incorporating a feature in Firefox and IE to define the tabindex for -1&lt;/strong&gt;. This allows a script author to give an element focus without placing it in the tab order.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a target="_blank" href="http://www.w3.org/TR/aria-roadmap/"&gt;Roadmap for Accessible Rich Internet Applications (WAI-ARIA Roadmap)&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite lang="en"&gt;An important addition in the States and Properties Module for Accessible Rich Internet Applications is &lt;strong&gt;new extensions of tabindex&lt;/strong&gt;. Now, with the tabindex change, the author is allowed to give any element keyboard focus (and not just form elements or anchors). In this paradigm shift, the user experience should be to use tabbing or keyboard mnemonics to move focus to widgets on the Web page and then use the arrow keys to navigate the object.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-role-20070601/"&gt;Roles for Accessible Rich Internet Applications (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; Roles)&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;XHTML 2 &lt;/strong&gt; permitirá ya que todos los elementos de la página reciban el foco, y por tanto ya no será necesario lo que en este apartado se ha dicho.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="esp"&gt;&lt;a name="roles" id="roles"&gt;&lt;/a&gt;Roles&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Lo segundo que necesita la &lt;a href="#AT"&gt;&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;&lt;/a&gt; es &lt;strong&gt;obtener información sobre la semántica de partes específicas del documento&lt;/strong&gt;, de aquellas que van a cambiar dinámicamente, o que contienen elementos que lo van a hacer. El &lt;em&gt;div&lt;/em&gt; que contiene la noticia no es una etiqueta con significado semántico, y tampoco existe una etiqueta "menú", "pestaña" o "árbol", así que en la etiqueta &lt;em&gt;div&lt;/em&gt; añadiremos el rol, la función.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite lang="en"&gt;The incorporation of Roles for Accessible Rich Internet Applications is a way for an author to provide proper type semantics on custom widgets (elements with repurposed semantics) to make these widgets accessible, usable and interoperable with assistive technologies.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-role-20070601/"&gt;Roles for Accessible Rich Internet Applications (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; Roles)&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Por ejemplo, para definir un menú de tipo árbol, utilizaríamos el rol "tree" y "treeitem":&lt;/p&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div role="wairole:tree" tabindex="-1"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div role="wairole:treeitem" tabindex="-1"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[...]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;a target="_blank" href="http://www.w3.org/TR/aria-role/#a_index_role"&gt;En este enlace puedes ver un listado de todos los roles&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="esp"&gt;&lt;a name="states" id="states"&gt;&lt;/a&gt;Estados y propiedades&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Lo tercero que necesita saber la &lt;a href="#AT"&gt;&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;&lt;/a&gt; es &lt;strong&gt;el estado y propiedades del objeto&lt;/strong&gt;. Siguiendo con el ejemplo del menú de tipo árbol, necesitará saber si está plegado o no. Lo indicaríamos de la siguiente manera:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;div role="wairole:treeitem" tabindex="-1" aaa:expanded="true"&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;"aaa" significa: accessible adaptable applications&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-state-20070601/#supported"&gt;En este enlace puedes ver un listado de estados y propiedades&lt;/a&gt;. &lt;br /&gt;&lt;p&gt;Sin embargo, &lt;strong&gt;no basta con indicar su estado, sino que además, si este cambia, deberá modificarse&lt;/strong&gt; para que la &lt;a href="#AT"&gt;&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;&lt;/a&gt; registre el cambio y pueda informar de ello al usuario. Es decir, cada vez que el árbol se pliegue o despliegue deberá cambiar su estado. Este cambio se realiza por javascript de la siguiente manera.&lt;/p&gt;&lt;br /&gt;&lt;blockquote style="text-align:left"&gt;&lt;cite lang="es"&gt;JavaScript can then manipulate the widget via the DOM. However, because States and Properties are mapped to the accessibility platforms, the assistive technology and user agents can understand the widget behavior and respond appropriately. &lt;/cite&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;java script snippet :&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((event.type == "keyup" &amp;&amp; event.button == 0){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Toggle checkbox&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var checkbox = event.target;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (checkbox.getAttributeNS("http://www.w3.org/2005/07/aaa", "checked") == "true") {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkbox.removeAttributeNS("http://www.w3.org/2005/07/aaa", "checked");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;  // Don't continue propagating event&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;  // Browser can still use event&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;[Ejemplo tomado de: &lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-state-20070601/"&gt;States and Properties Module for Accessible Rich Internet Applications&lt;/a&gt; (WAI-ARIA States and Properties) ]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Así como los estados y propiedades deben modificarse, los roles NO.&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Roles are element types and should not change with time or user actions. […] If the old element type is be replaced by a new one, the corresponding element and its subtree should be removed from the document and a new one inserted containing the new role type.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-role-20070601/"&gt;Roles for Accessible Rich Internet Applications (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; Roles)&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="esp"&gt;&lt;a name="resumen" id="resumen"&gt;&lt;/a&gt;En resumen:&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite lang="en"&gt;&lt;p&gt;An application becomes accessible when:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Each element or widget has full and correct semantics that fully describes it's behavior (using element names or roles).&lt;/li&gt;&lt;li&gt;The relationships between elements and groups are known&lt;/li&gt;&lt;li&gt;States, properties, and relationships are valid for each elements behavior and are accessible via the Document Object Model [DOM].&lt;/li&gt;&lt;li&gt;There is an element having the correct input focus.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;p&gt;Estos son los pasos que WAI-ARIA indica que hay que seguir:&lt;/p&gt;&lt;br /&gt;&lt;cite lang="en"&gt;&lt;ul&gt;&lt;li&gt;Step 1: Use your native mark up as well as you can&lt;/li&gt;&lt;li&gt;Step 2: Find the right roles&lt;/li&gt;&lt;li&gt;Step 3: Look for groups&lt;/li&gt;&lt;li&gt;Step 4: Build relationships&lt;/li&gt;&lt;li&gt;Step 5: Set properties&lt;/li&gt;&lt;li&gt;Step 6: Associate style sheet selectors with accessibility states and properties&lt;/li&gt;&lt;/ul&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-role-20070601/"&gt;Roles for Accessible Rich Internet Applications (&lt;abbr lang="en" title="Accessible Rich Internet Applications"&gt;WAI-ARIA&lt;/abbr&gt; Roles)&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="aplicacion" id="aplicacion"&gt;&lt;/a&gt;¿Puedo aplicar WAI-ARIA a cualquier página HTML o XHTML?&lt;/h2&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;cite lang="en"&gt;At this time, the primary effort in the W3C WAI Protocols and Formats working group is &lt;strong&gt;to focus on an extension to XHTML 1.1.&lt;/strong&gt; It should be noted that &lt;strong&gt;XHTML 1.0 could also be enhance to support this extension&lt;/strong&gt; through the use of a hybrid DTD which incorporates the extensions. &lt;strong&gt;The reason for focusing on XHTML 1.X&lt;/strong&gt; is that XHTML is extensible through the use of namespaces and because it is renderable by today's browses.&lt;br /&gt;[…]&lt;br /&gt;This roadmap is designed to address the accessibility of dynamic, scripted, Web content that may be rendered in today's browser while bridging &lt;strong&gt;to future declarative standards, such as XHTML2&lt;/strong&gt;, in the W3C. The extensions being created for XHTML 1.X are intended to be cross-cutting.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a target="_blank" href="http://www.w3.org/TR/aria-roadmap/"&gt;Roadmap for Accessible Rich Internet Applications (WAI-ARIA Roadmap)&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Como se ve, en espera del estándar XHTML 2, WAI-ARIA se enfoca a XHTML 1.X. &lt;strong&gt;Si te interesa su aplicación a HTML&lt;/strong&gt;:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;There is no normative way to apply roles in HTML, but it is recommended to use the &lt;a target="_blank" href="http://www.w3.org/WAI/PF/adaptable/HTML4/embedding-20061212.html"&gt;HTML implementation technique&lt;/a&gt;.&lt;br /&gt;[...]&lt;br /&gt;HTML documents do not support namespaces, so the required accessibility role and state metadata can not be included directly in these documents. In HTML 4, you can define the accessible role and accessible states as keywords in the class attribute, then use an ECMAScript library to parse the class keywords and copy them into the appropriate role and state namespaces.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;[En &lt;a href="http://www.w3.org/WAI/PF/adaptable/HTML4/embedding-20061212.html" target="_blank"&gt;Embedding Accessibility Role and State Metadata in HTML Documents&lt;/a&gt;]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;El uso de "namespaces" para incorporar información de roles e información de estados y propiedades en XHTML 1.1 sería así&lt;/strong&gt; (los ejemplos que incluyo son tomados literalmente de &lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-role-20070601/"&gt;Roles for Accessible Rich Internet Applications (WAI-ARIA Roles)&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;?xml version="1.1" encoding="us-ascii"?&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "Accessible Adaptive Applications//EN" &lt;br /&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:wairole="http://www.w3.org/2005/01/wai-rdf/GUIRoleTaxonomy#"&lt;br /&gt;xmlns:waistate="http://www.w3.org/2005/07/aaa"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;div role="wairole:menu" waistate:haspopup="true"&gt;&lt;br /&gt;File&lt;br /&gt;&amp;lt;/div&gt;    &lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;El uso de namespaces para incorporar información de roles e información de estados y propiedades en &lt;strong&gt;XHTML 1.0&lt;/strong&gt; sería así:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:xhtml10="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:wairole="http://www.w3.org/2005/01/wai-rdf/GUIRoleTaxonomy#"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;table id="table1" xhtml10:role="wairole:grid"&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/table&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;cite lang="en"&gt;&lt;br /&gt;For developers using Firefox 1.5, the role attribute was used from the XHTML 2 namespace. Creation of an XHTML role module for XHTML 1.X only occurred recently. For those doing development on Firefox 1.5,  the role attribute from XHTML 2 must be used. This being corrected in Firefox 2.0 although Firefox 2.0 will support role in both the old XHTML 2 and 1.1 namespaces. For Firefox 1.5 supporters, this is the &lt;br /&gt;equivalent markup.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Example: Use of namespaces to incorporate role information information into XHTML 1.x for Firefox 1.5&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;?xml version="1.1" encoding="us-ascii"?&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "Accessible Adaptive Applications//EN" &lt;br /&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:wairole="http://www.w3.org/2005/01/wai-rdf/GUIRoleTaxonomy#"&lt;br /&gt;xmlns:x2="http://www.w3.org/2002/06/xhtml2"&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;div x2:role="wairole:menu"&gt;&lt;br /&gt;File&lt;br /&gt;&amp;lt;/div&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="soporte" id="soporte"&gt;&lt;/a&gt;¿Los navegadores y  &lt;a href="#AT"&gt;&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;&lt;/a&gt; ya soportan WAI-ARIA?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a target="_blank" href="http://avelino.gabiot.com/blog/index.php?entry=entry070427-184154"&gt;Avelino Herrera&lt;/a&gt; comentaba que había hecho pruebas con &lt;a target="_blank" href="http://firevox.clcworld.net/"&gt;&lt;strong&gt;FireVox&lt;/strong&gt;&lt;/a&gt; (lector de pantalla para Firefox) y que era compatible con WAI-ARIA, &lt;em&gt;siendo capaz de dictar perfectamente todo el contenido que se añadía dinámicamente a la página mediante Javascript.&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Yo también lo he comprobado y es cierto. En el último apartado citaré varios ejemplos para que podáis comprobarlo vosotros mismos.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://firefox.cita.uiuc.edu/index.php#beta" target="_blank"&gt;Firefox Accessibility Extension Beta version 1.1&lt;/a&gt;&lt;/strong&gt; es otra extensión de Firefox que añade una nueva barra de herramientas al navegador. Uno de sus menús se llama "Scripting" y contiene todo lo relacionado con WAI-ARIA como puedes ver en esta imagen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rk2CU6ec6BQ/ThDpLHv13TI/AAAAAAAABIA/cnD_eaHn84o/s1600/menu_firefox_ajax.gif" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="272" width="229" src="http://4.bp.blogspot.com/-rk2CU6ec6BQ/ThDpLHv13TI/AAAAAAAABIA/cnD_eaHn84o/s400/menu_firefox_ajax.gif" alt="Menú Scripting de Firefox Accessibility Extension" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Por ejemplo, la &lt;span lang="en"&gt;"List of DHTML Widgets"&lt;/span&gt; mostraría el siguiente aspecto&lt;/p&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vtIF35lW7Vk/ThDpbnJymBI/AAAAAAAABII/UH27Sc3-r8c/s1600/firefox-DHTML_Widgets.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="327" width="400" src="http://3.bp.blogspot.com/-vtIF35lW7Vk/ThDpbnJymBI/AAAAAAAABII/UH27Sc3-r8c/s400/firefox-DHTML_Widgets.png" alt="Menú List of DHTML Widgets de Firefox Accessibility Extension"  /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como ves, se muestra un listado de los roles, su &lt;em&gt;tabindex&lt;/em&gt;, si ha cambiado su estado, etc.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A continuación incluyo &lt;strong&gt;la lista de implementaciones de WAI-ARIA en navegadores y tecnologías asitivas&lt;/strong&gt; que se recoge en su Hoja de ruta:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firefox 1.5 (including MSAA support) &lt;/li&gt;&lt;li&gt;GW Micro Window-Eyes 5.5 - with Firefox support &lt;/li&gt;&lt;li&gt;JAWS 7.0 with Firefox support(partial) &lt;/li&gt;&lt;li&gt;Windows Magnifier (with IE or Firefox 1.5) &lt;/li&gt;&lt;li&gt;Internet Explorer from DOM API&lt;/li&gt;&lt;li&gt;Mozilla Firefox Test samples &lt;/li&gt;&lt;li&gt;Dojo JavaScript Toolkit&lt;/li&gt;&lt;li&gt;Mozilla Firefox Accessibility Extensions Test Tool and test suite&lt;/li&gt;&lt;li&gt;Mozilla Firefox ARIA to Accessibility API mapping&lt;/li&gt;&lt;li&gt;Bindows Object Oriented Platform for AJAX Development&lt;/li&gt;&lt;li&gt;WAI Role Taxonomy Extension Tool&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;NOTA 2009&lt;/strong&gt;: &lt;a href="http://accesoalan.blogspot.com/2008/03/soporte-para-wai-aria-en-internet.html"&gt;Soporte para WAI-ARIA en Internet Explorer 8&lt;/a&gt;, &lt;cite&gt;"Internet Explorer 8 emplea información de rol, estado y propiedades a través de ARIA para communicar con las ayudas técnicas."&lt;/cite&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;NOTA 2009&lt;/strong&gt;: &lt;/p&gt;&lt;br /&gt;[09-06-09] &lt;a href="http://programaraciegas.weblog.discapnet.es/articulo.aspx?idA=1069"&gt;"Safari 4 ya está aquí"&lt;/a&gt; de Programar a ciegas&lt;br /&gt;&lt;cite&gt;Lo más importante es que &lt;strong&gt;Safari implementa HTML5 y WAI ARIA y voiceOver es compatible con las páginas que incorporen estas tecnologías&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Con Safari 4 el acceso a la nueva Web resultará posible para aquellos que utilicen ordenadores con el sistema operativo de Apple. &lt;strong&gt;La versión para Ms Windows de Safari resulta incompatible con los lectores de pantallas más conocidos, como NVDA, JAWS y Window eyes&lt;/strong&gt;.&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como se ve, el único framework de AJAX que lo implementa en Dojo... algo a tener en cuenta.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a target="_blank" href="http://developer.mozilla.org/en/docs/Accessible_DHTML#Supported_roles"&gt;&lt;br /&gt;Muy interesante también la lista de roles que soporta Firefox&lt;/a&gt; en combinación con distintas &lt;a href="#AT"&gt;&lt;abbr lang="en" title="Assistive Technology"&gt;AT&lt;/abbr&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="ejemplos" id="ejemplos"&gt;&lt;/a&gt;Ejemplos&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Incluyo a continuación una lista de &lt;strong&gt;ejemplos de aplicación de WAI-ARIA&lt;/strong&gt; para que podáis probar vosostros mismos instalándoos alguna extensión/aplicación del apartado anterior:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.mozilla.org/en/docs/Accessible_DHTML#Sample_widgets" target="_blank"&gt;Diversos ejemplos clasificados en simples y complejos&lt;/a&gt;. &lt;br /&gt;Por ejemplo esta &lt;a href="http://www.mozilla.org/access/dhtml/spreadsheet" target="_blank"&gt;"Grid" compleja&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://test.cita.uiuc.edu/aria/states.php" target="_blank"&gt;Cantidad y variedad de ejemplos&lt;/a&gt; del iCITA (Illinois Center for Information Technology Accessibility)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Si os interesan ejemplos sobre "AJAX live regions", es recomendable el artículo del 30 de enero de 2007 &lt;a href="http://juicystudio.com/article/wai-aria-live-regions.php" target="_blank"&gt;&lt;em&gt;WAI-ARIA Live Regions&lt;/em&gt;&lt;/a&gt;  de Juicy Studio, que &lt;a href="http://accessibleajax.clcworld.net/" target="_blank"&gt;puedes verlo aplicado en los ejemplos de &lt;em&gt;Accessible AJAX&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a name="ejemplos" id="ejemplos"&gt;&lt;/a&gt;Enlaces de interés&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Ejemplos&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.weba11y.com/AjaxDemo/sample.html"&gt;Simple AJAX Application&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Utilidades&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/9108"&gt;extensión de accesibilidad de JuicyStudio&lt;/a&gt; soporta ARIA, por lo que será de ayuda a la hora de avaluar las webs que se vayan aplicando la especificación.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Generales&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.w3.org/WAI/intro/aria" target="_blank"&gt;Accessible Rich Internet Applications (WAI-ARIA) Suite Overview&lt;/a&gt; en WAI&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/WAI/PF/aria-practices/"&gt;WAI-ARIA Best Practices&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/TR/aria-roadmap/" target="_blank"&gt;Roadmap for Accessible Rich Internet Applications (WAI-ARIA Roadmap)&lt;/a&gt;. 20 diciembre 2006&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://www.w3.org/TR/2007/WD-aria-role-20070601/"&gt;Roles for Accessible Rich Internet Applications (WAI-ARIA Roles)&lt;/a&gt;. 1 junio 2007&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/TR/2007/WD-aria-state-20070601/" target="_blank"&gt;States and Properties Module for Accessible Rich Internet Applications (WAI-ARIA States and Properties)&lt;/a&gt;. 1 junio 2007&lt;/li&gt;&lt;li&gt;Nota de prensa del 26 de septiembre de 2006: &lt;em&gt;&lt;a target="_blank" href="http://www.w3c.es/Prensa/2006/nota060926_aria-pressrelease"&gt;El W3C publica una 'Hoja de ruta' para las aplicaciones de Internet enriquecidas accesibles (WAI-ARIA)&lt;/a&gt;&lt;/em&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/TR/xhtml-role/" target="_blank"&gt;XHTML Role Attribute Module&lt;/a&gt; del W3C (13 noviembre de 2006)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/TR/xml-events/" target="_blank"&gt;XML Events 2&lt;/a&gt; del W3C (16 febrero 2007)&lt;/li&gt;&lt;li&gt;&lt;a href="http://firefox.cita.uiuc.edu/index.php#beta" target="_blank"&gt;Firefox Accessibility Extension Beta version 1.1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Artículos&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dev.opera.com/articles/view/introduction-to-wai-aria/"&gt;"Introduction to WAI ARIA"&lt;/a&gt;, de Dev.Opera&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.areia.info/introduccion-a-wai-aria/"&gt;Introducción a WAI-ARIA (octubre 2008)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nosolousabilidad.com/articulos/wai_aria.htm"&gt;WAI-ARIA, una aproximación (febrero 2009)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.paciellogroup.com/blog/?p=107" lang="en" hreflang="en"&gt;How Can I Validate (X)HTML + ARIA?&lt;/a&gt;, de Paciello Group&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.paciellogroup.com/blog/?p=106"&gt;Using WAI ARIA Landmark Roles&lt;/a&gt;, de Paciello Group&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/waiaria" target="_blank"&gt;&lt;em&gt;Accessible Web 2.0 Applications with WAI-ARIA&lt;/em&gt;&lt;/a&gt; de Martin Kliehm (9 de abril de 2007)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.brucelawson.co.uk/2009/redesigning-with-html-5-wai-aria/" lang="en" hreflang="en"&gt;Redesigning with HTML 5 and WAI-ARIA&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://accesibilidadweb.blogspot.com/2007/06/wai-aria-contenido-web-enriquecido.html" target="_blank"&gt;&lt;em&gt;WAI-ARIA: Contenido Web Enriquecido Accesible&lt;/em&gt; &lt;/a&gt; de Accesibilidad, Usabilidad y Estándares Web (4 junio 2007)&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html" target="_blank"&gt;&lt;em&gt;AJAX Accesible&lt;/em&gt;&lt;/a&gt; de Olga Carreras (febrero de 2007)&lt;/li&gt;&lt;li&gt;&lt;a href="http://accessibleajax.clcworld.net/" target="_blank"&gt;Accessible AJAX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://juicystudio.com/article/wai-aria-live-regions.php" target="_blank"&gt;&lt;em&gt;WAI-ARIA Live Regions&lt;/em&gt;&lt;/a&gt; de Juicy Studio (30 enero 2007)&lt;/li&gt;&lt;li&gt;&lt;a href="http://avelino.gabiot.com/blog/index.php?entry=entry070427-184154"target="_blank"&gt;&lt;em&gt;WAI-ARIA: Aplicaciones web AJAX accesibles&lt;/em&gt;&lt;/a&gt; de Avelino Herrera (27 de abril de 2007) &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;&lt;br /&gt;[26-05-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html"&gt;AJAX accesible I&lt;/a&gt;&lt;br /&gt;[22-10-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/hijax.html"&gt;AJAX accesible III: HIJAX&lt;/a&gt;&lt;br /&gt;[27-03-09] &lt;a href="http://olgacarreras.blogspot.com/2009/03/ajax-accesible-iv-tecnicas-aria-de-las.html"&gt;AJAX accesible IV: Técnicas ARIA de las WCAG 2.0&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-4840904833501589998?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/4840904833501589998/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/4840904833501589998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/4840904833501589998'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html' title='AJAX Accesible (II): WAI-ARIA'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-rk2CU6ec6BQ/ThDpLHv13TI/AAAAAAAABIA/cnD_eaHn84o/s72-c/menu_firefox_ajax.gif' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-5764115586771223404</id><published>2007-07-19T14:59:00.006+02:00</published><updated>2012-03-28T22:44:43.323+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><title type='text'>Formulario con varios botones. Implementación usable y accesible</title><content type='html'>&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;     &lt;br /&gt;[24-07-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/enlaces-que-actan-como-botones.html"&gt;Enlaces que actúan como botones. Implementación accesible.&lt;/a&gt;     &lt;br /&gt;[28-02-08] &lt;a href="http://olgacarreras.blogspot.com/2007/02/formularios-usables-60-directrices-de.html"&gt;Formularios usables: 60 Directrices de Usabilidad&lt;/a&gt;     &lt;br /&gt;[28-03-12] &lt;a href="http://olgacarreras.blogspot.com.es/2012/03/descripcion-extensa-de-una-imagen.html"&gt;Detectar si una imagen se ha cargado. Descripción extensa de una imagen: accesible con lector de pantalla y visible sin imágenes activas &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;p&gt;Imagina que tenemos que realizar un formulario muy sencillo:&lt;/p&gt;&lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;a style="margin-left: 1em; margin-right: 1em" href="http://4.bp.blogspot.com/-KYivUpVwSFQ/ThDAW_OONeI/AAAAAAAABC0/IlauKwW_gK0/s1600/formulario_varios_botones_accesible.jpg" imageanchor="1"&gt;&lt;img border="0" alt="Ejemplo visual del formulario que a continuación se explica" src="http://4.bp.blogspot.com/-KYivUpVwSFQ/ThDAW_OONeI/AAAAAAAABC0/IlauKwW_gK0/s400/formulario_varios_botones_accesible.jpg" width="400" height="152" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;El formulario consta de un campo NIF de tipo texto y tres botones que realizan tres operativas diferentes: &amp;quot;Crear usuario&amp;quot;, &amp;quot;Eliminar usuario&amp;quot; y &amp;quot;Cancelar&amp;quot;.&lt;/p&gt;&lt;p&gt;No parece muy complicado ¿verdad? De hecho existen muchas formas de implementarlo; el problema es que la mayoría de ellas son inaccesibles.&lt;/p&gt;&lt;p&gt;El objetivo de este artículo es explicar qué implementaciones son posibles y clasificarlas en:&lt;/p&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="NO accesible/NO nos sirve" src="http://4.bp.blogspot.com/-CeiyhB72oiw/ThDA15b6LzI/AAAAAAAABC8/1JTNKbEpkOI/s400/no_accesible.gif" /&gt;NO accesible/NO nos sirve&lt;/p&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="Accesible/Nos sirve pero NO es recomendable" src="http://4.bp.blogspot.com/-tn5m3y3V2kc/ThDCspH3oZI/AAAAAAAABDc/PcJBiHONvuk/s400/no_recomendado.gif" /&gt;Accesible/Nos sirve pero NO es recomendable&lt;/p&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="Accesible y recomendable " src="http://2.bp.blogspot.com/-C6rvFEH5zEk/ThDBsUgypAI/AAAAAAAABDU/2iLpHsd9Utw/s400/si_accesible.gif" /&gt;Accesible y recomendable ¡bingo! ¡usémoslo!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; no entraremos en discusiones acerca de si la operativa de &amp;quot;Crear Usuario&amp;quot; y &amp;quot;Eliminar Usuario&amp;quot; deberían ser dos páginas diferentes, con un único botón &amp;quot;Aceptar&amp;quot;, etc. Es un ejemplo para ilustrar el problema de los formularios con varios botones.&lt;/p&gt;&lt;/div&gt;&lt;h2&gt;Implementar la acción por Javascript&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Clasificación:&lt;/strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" class="sinborde" border="0" alt="NO accesible/NO nos sirve" src="http://4.bp.blogspot.com/-CeiyhB72oiw/ThDA15b6LzI/AAAAAAAABC8/1JTNKbEpkOI/s400/no_accesible.gif" /&gt;NO accesible/NO nos sirve&lt;/p&gt;&lt;p&gt;Un desarrollador novato (llamémosle Hugo) saldrá del paso de la siguiente manera:&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;code&gt;     &lt;pre&gt;&amp;lt;input type=&amp;quot;button&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;nuevo&amp;quot; &lt;br /&gt;onclick= &amp;quot;document.form1.action = 'nuevo.jsp'; &lt;br /&gt;document.form1.submit()&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;eliminar&amp;quot;&lt;br /&gt;onclick= &amp;quot;document.form1.action = 'eliminar.jsp'; &lt;br /&gt;document.form1.submit()&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;cancelar&amp;quot; &lt;br /&gt;onclick= &amp;quot;self.location.href = 'principal.jsp'&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Si tenemos suerte y a Hugo se le ha estropeado el ratón, pulirá su código así:&lt;code&gt;&lt;/code&gt; &lt;/p&gt;&lt;div class="entradilla"&gt;&lt;pre&gt;&amp;lt;input type=&amp;quot;button&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;nuevo&amp;quot; &lt;br /&gt;onclick=&amp;quot;document.form1.action = 'nuevo.jsp';&lt;br /&gt;document.form1.submit()&amp;quot;&lt;br /&gt;onkeypress=&amp;quot;document.form1.action = 'nuevo.jsp'; &lt;br /&gt;document.form1.submit()&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;eliminar&amp;quot;&lt;br /&gt;onclick=&amp;quot;document.form1.action = 'eliminar.jsp'; &lt;br /&gt;document.form1.submit()&amp;quot; &lt;br /&gt;onkeypress=&amp;quot;document.form1.action = 'eliminar.jsp';&lt;br /&gt;document.form1.submit()&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;cancelar&amp;quot; &lt;br /&gt;onclick=&amp;quot;self.location.href = 'principal.jsp'&amp;quot; &lt;br /&gt;onkeypress= &amp;quot;self.location.href = 'principal.jsp'&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Posiblemente Hugo, en un momento de lucidez, comprenda que si el primer botón es de tipo &amp;quot;submit&amp;quot;, se convertirá en el botón por defecto, el que se ejecute al pulsar &amp;quot;intro&amp;quot; y además se ahorra una función.&lt;/p&gt;&lt;p&gt;Gracias a ello, un usuario que tenga desactivado el javascript o su &lt;em&gt;user-agent&lt;/em&gt; no lo admita, al menos podrá crear un usuario:&lt;code&gt;&lt;/code&gt; &lt;/p&gt;&lt;div class="entradilla"&gt;&lt;pre&gt;&amp;lt;form action=&amp;quot;nuevo.jsp&amp;quot;&lt;br /&gt;name=&amp;quot;form1&amp;quot;&lt;br /&gt;id=&amp;quot;form1&amp;quot;&lt;br /&gt;method=&amp;quot;post&amp;quot;&amp;gt;      &lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;nuevo&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;eliminar&amp;quot;&lt;br /&gt;onclick=&amp;quot;document.form1.action = 'eliminar.jsp';&lt;br /&gt;document.form1.submit()&amp;quot; &lt;br /&gt;onkeypress=&amp;quot;document.form1.action = 'eliminar.jsp';&lt;br /&gt;document.form1.submit()&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;cancelar&amp;quot; &lt;br /&gt;onclick=&amp;quot;self.location.href = 'principal.jsp'&amp;quot; &lt;br /&gt;onkeypress=&amp;quot;self.location.href = 'principal.jsp'&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si Hugo tiene muchos formularios, terminará descubriendo las funciones javascript y limpiando su código:&lt;code&gt;&lt;/code&gt; &lt;/p&gt;&lt;div class="entradilla"&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;function someter(id){&lt;br /&gt;document.form1.action=id;&lt;br /&gt;document.form1.submit();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function navegar(id){&lt;br /&gt;self.location.href=id;&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&amp;lt;form action=&amp;quot;nuevo.jsp&amp;quot;&lt;br /&gt;name=&amp;quot;form1&amp;quot;&lt;br /&gt;id=&amp;quot;form1&amp;quot;&lt;br /&gt;method=&amp;quot;post&amp;quot;&amp;gt;      &lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;nuevo&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;eliminar&amp;quot;&lt;br /&gt;onclick=&amp;quot;someter('eliminar.jsp')&amp;quot; &lt;br /&gt;onkeypress=&amp;quot;someter('eliminar.jsp')&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;cancelar&amp;quot; &lt;br /&gt;onclick=&amp;quot;navegar('principal.jsp')&amp;quot; &lt;br /&gt;onkeypress=&amp;quot;navegar('principal.jsp')&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si Hugo asiste a un cursillo básico acerca de las bondades de separar la presentación, del contenido y de la programación, entonces quizás tengamos la suerte de ver javascript no-intrusivo:&lt;code&gt;&lt;/code&gt; &lt;/p&gt;&lt;div class="entradilla"&gt;&lt;pre&gt;&lt;em&gt;[en el fichero funciones.js]&lt;/em&gt;&lt;br /&gt;function init(){&lt;br /&gt;document.getElementById(&amp;quot;eliminar&amp;quot;).onclick =  &lt;br /&gt;function(){&lt;br /&gt;document.form1.action= &amp;quot;eliminar.jsp&amp;quot;;&lt;br /&gt;document.form1.submit();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;document.getElementById(&amp;quot;eliminar&amp;quot;).onkeypress =  &lt;br /&gt;function(){&lt;br /&gt;document.form1.action= &amp;quot;eliminar.jsp&amp;quot;;&lt;br /&gt;document.form1.submit();&lt;br /&gt;}&lt;br /&gt;document.getElementById(&amp;quot;cancelar&amp;quot;).onclick =  &lt;br /&gt;function() {&lt;br /&gt;self.location.href=&amp;quot;navegar.jsp&amp;quot;; &lt;br /&gt;}&lt;br /&gt;document.getElementById(&amp;quot;cancelar&amp;quot;).onkeypress = &lt;br /&gt;function() {&lt;br /&gt;self.location.href=&amp;quot;navegar.jsp&amp;quot;; &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;window.onload=init;      &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;[en la página]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form action=&amp;quot;nuevo.jsp&amp;quot;&lt;br /&gt;name=&amp;quot;form1&amp;quot;&lt;br /&gt;id=&amp;quot;form1&amp;quot;&lt;br /&gt;method=&amp;quot;post&amp;quot;&amp;gt;      &lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;nuevo&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;eliminar&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;cancelar&amp;quot; /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En fin, podríamos seguir mejorando y depurando el código o poner otras alternativas similares que se ven a menudo, por ejemplo ir cambiando dinámicamente por javascript un campo &amp;quot;hidden&amp;quot; donde se guarda el destino final de la página, y mediante el evento &amp;quot;onsubmit&amp;quot; del formulario cambiar el &amp;quot;action&amp;quot; del formulario, etc.&lt;/p&gt;&lt;p&gt;Pero todas ellas nos llevarán a un callejón sin salida, porque &lt;strong&gt;un usuario que no tenga activado el javascript o su &lt;em&gt;user-agent&lt;/em&gt; no admita javascript, en el mejor de los casos podrá ejecutar sólo la acción &amp;quot;Crear Usuario&amp;quot;.&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;Varios formularios&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Clasificación:&lt;/strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" class="sinborde" border="0" alt="NO accesible/NO nos sirve" src="http://4.bp.blogspot.com/-CeiyhB72oiw/ThDA15b6LzI/AAAAAAAABC8/1JTNKbEpkOI/s400/no_accesible.gif" /&gt;NO accesible/NO nos sirve&lt;/p&gt;&lt;p&gt;Hugo le ha pedido ayuda a Pedro, quien después de pensar un rato ha tenido una idea genial: hagamos que todos los botones sean de tipo &amp;quot;submit&amp;quot; y para evitar tener que modificar por javascript el &amp;quot;action&amp;quot; del formulario, ¡hagamos varios formularios!. Dicho y hecho.&lt;/p&gt;&lt;p&gt;Lo primero que se les ocurre es encerrar cada botón en un formulario: &lt;/p&gt;&lt;div class="entradilla"&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;form name=&amp;quot;form1&amp;quot; [...]&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; [...]&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;form name=&amp;quot;form2&amp;quot; [...]&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; [...] &lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;form name=&amp;quot;form3&amp;quot; [...] &lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; [...]&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Pronto se dan cuenta de que esto no lleva a ninguna parte porque el campo de texto NIF no está dentro del formulario y no se enviará su contenido con el &amp;quot;submit&amp;quot;.&lt;/p&gt;&lt;p&gt;Pedro, que no se rinde fácilmente, decide que lo que hay que hacer es anidar los formularios: &lt;/p&gt;&lt;div class="entradilla"&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;form name=&amp;quot;form1&amp;quot; [...] &lt;br /&gt;&amp;lt;form name=&amp;quot;form2&amp;quot; [...]&lt;br /&gt;&amp;lt;form name=&amp;quot;form3&amp;quot; [...]&lt;br /&gt;&lt;br /&gt;[aquí nuestro campo de texto NIF]&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; [...]&lt;br /&gt;&amp;lt;/form&amp;gt; &lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; [...] &lt;br /&gt;&amp;lt;/form&amp;gt; &lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; [...] &lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Pedro y Hugo comprueban que esto no funciona... lástima, &lt;strong&gt;no se pueden anidar formularios&lt;/strong&gt;.&lt;/p&gt;&lt;h2&gt;Alternativa accesible con &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Clasificación:&lt;/strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="Accesible/Nos sirve pero NO es recomendable" src="http://4.bp.blogspot.com/-tn5m3y3V2kc/ThDCspH3oZI/AAAAAAAABDc/PcJBiHONvuk/s400/no_recomendado.gif" /&gt;Accesible/Nos sirve pero NO es recomendable&lt;/p&gt;&lt;p&gt;Hugo y Pedro recuerdan que Lisa hizo un curso de accesibilidad y le piden consejo. Ella lo ve claro: &amp;quot;utilicemos la etiqueta &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;&amp;quot;. Lisa se pone de inmediato a teclear, añadiendo al final del código que vimos en el primer apartado el siguiente &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;:&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;form action=&amp;quot;nuevo.jsp&amp;quot;&lt;br /&gt;name=&amp;quot;form1&amp;quot;&lt;br /&gt;id=&amp;quot;form1&amp;quot;&lt;br /&gt;method=&amp;quot;post&amp;quot;&amp;gt;      &lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;nuevo&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;eliminar&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;cancelar&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;noscript&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Su navegador no admite javascript.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Para crear un nuevo usuario pulse el botón &lt;br /&gt;&amp;quot;Crear usuario&amp;quot; del formulario anterior&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Para cancelar y volver a la página anterior&lt;br /&gt;pulse el siguiente enlace: &lt;br /&gt;&amp;lt;a href=&amp;quot;principal.jsp&amp;quot;&amp;gt;Cancelar&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Para eliminar el usuario, rellene el&lt;br /&gt;formulario que le presentamos a continuación:&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Eliminar usuario&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form action=&amp;quot;eliminar.jsp&amp;quot; method=&amp;quot;post&amp;quot; &lt;br /&gt;name=&amp;quot;form2&amp;quot; id=&amp;quot;name=&amp;quot;form2&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;label for=&amp;quot;nifacc&amp;quot;&amp;gt;NIF*:&lt;br /&gt;&amp;lt;input id=&amp;quot;nifacc&amp;quot; name=&amp;quot;nifacc&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/label&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; &lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot; &lt;br /&gt;id=&amp;quot;eliminaracc&amp;quot;&lt;br /&gt;name=&amp;quot;eliminaracc&amp;quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Lisa les propone mostrar la página a varios compañeros, desactivándoles el javascript, para ver si les queda clara la forma de interactuar con el formulario. Estos compañeros ven la página así:&lt;/p&gt;&lt;div style="text-align: center; clear: both" class="separator"&gt;&lt;img border="0" alt="Ejemplo visual del formulario sin javascript activado" src="http://2.bp.blogspot.com/-nnFnbs8zUFE/ThDDXw_0yZI/AAAAAAAABDk/Iiia-YGpqYM/s400/formulario_sin_javascript.jpg" width="400" height="251" /&gt;&lt;/div&gt;&lt;p&gt;Pronto se dan cuenta de que puede que la página sea accesible, pero &lt;strong&gt;no resulta demasiado usable&lt;/strong&gt;, parece que los usuarios son reacios a leer instrucciones. Después de intentar reiteradamente interactuar con los primeros botones y maldecir porque no funcionan, algunos se deciden a leer el texto explicativo. En el mejor de los casos han perdido mucho tiempo, en el peor se han rendido.&lt;/p&gt;&lt;p&gt;Por otro lado, una vez superada la euforia inicial, Pedro y Hugo empiezan a reflexionar sobre el &lt;strong&gt;sobreesfuerzo de programación y el aumento del peso de la página&lt;/strong&gt;, esta solución empieza a ser poco práctica para implementar y mantener en todos los formularios de la aplicación, bastante más complejos que este.&lt;/p&gt;&lt;p&gt;La última razón para desechar esta opción se la proporciona Lisa: &lt;strong&gt;&lt;a href="http://sigt.net/archivo/xhtml-20-el-futuro-de-la-web-y-que-no-nos-pase-na.xhtml" target="_blank"&gt;ups! se le olvidó comentar que la etiqueta &amp;quot;noscript&amp;quot; ya no es bien vista por el W3C y no estará en el estándar XHTML2.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;¿Y si utilizamos las etiquetas &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; o &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;?&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Clasificación:&lt;/strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="NO accesible/NO nos sirve" src="http://4.bp.blogspot.com/-CeiyhB72oiw/ThDA15b6LzI/AAAAAAAABC8/1JTNKbEpkOI/s400/no_accesible.gif" /&gt;NO accesible/NO nos sirve&lt;/p&gt;&lt;p&gt;A estas alturas se ha extendido el rumor y es la comidilla de la oficina que Hugo, Pedro y Lisa no son capaces de crear un simple formulario compuesto de un campo y tres botones. Así que Gabi, a quien le atraen los marrones más que a una mosca, se deja caer por ahí.&lt;/p&gt;&lt;p&gt;&lt;cite&gt;&amp;quot;Si no podéis usar botones, ¿por qué no usáis etiquetas &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; que con el estilo simulen un botón? Mejor aún, ¿por qué no utilizáis &amp;lt;button&amp;gt;?&amp;quot;&lt;/cite&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; es una de esas etiquetas que apenas se usan, hasta tal punto que llegamos a dudar de que sea estándar. Pero lo es, incluso en la especificación XHTML 1.1.&lt;/p&gt;&lt;p&gt;Un &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; puede contener una etiqueta &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, por tanto &lt;strong&gt;PARECE&lt;/strong&gt; que es una ventaja utilizar &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; en vez de utilizar &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;: ya que tendrá aspecto de botón y se hundirá al pulsarlo sin necesidad de simularlo con estilos, además es un elemento de formulario y por ello PARECE más apropiado.&lt;/p&gt;&lt;p&gt;Y digo PARECE porque &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; en realidad &lt;strong&gt;no se utiliza debido a que &lt;a href="http://radaschuetz.com/archive/2007/04/21/button-hell/" target="_blank"&gt;no funciona correctamente en Explorer.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Pedro y Hugo tienen otras razones para no usar la alternativa de Gabi, bien con enlaces bien con botones &lt;cite&gt;&amp;quot;nos sirve para el botón 'Cancelar' porque sólo navega, pero con el resto de botones queremos someter la página, así que necesitaríamos añadir al enlace, al botón o al enlace dentro del botón un evento javascript que enviara el formulario, y si hacemos el botón de tipo 'submit' estaríamos también igual que antes&amp;quot;.&lt;/cite&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Otro callejón sin salida.&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;XForm&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Clasificación:&lt;/strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="NO accesible/NO nos sirve" src="http://4.bp.blogspot.com/-CeiyhB72oiw/ThDA15b6LzI/AAAAAAAABC8/1JTNKbEpkOI/s400/no_accesible.gif" /&gt;NO accesible/NO nos sirve&lt;/p&gt;&lt;p&gt;A estas alturas, Hugo, Pedro, Lisa y Gabi deciden que necesitan a Feder, el &lt;em&gt;friki&lt;/em&gt; de la empresa, así que se dirigen en procesión a su mesa.&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;quot;XForm, esto se soluciona con XForm&amp;quot;&lt;/em&gt;. Sus compañeros le miran con devoción, no tienen ni idea de lo que les habla, pero por lo visto están salvados.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.w3.org/MarkUp/Forms/" target="_blank"&gt;XForm&lt;/a&gt;,- les explica Feder-, es recomendación oficial del W3C desde marzo de 2006, es la nueva generación de formularios que nos permite separar la presentación del contenido.&lt;code&gt;&lt;/code&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;&lt;br /&gt;&lt;pre&gt;&lt;em&gt;[en el modelo de datos]&lt;/em&gt;&lt;br /&gt;&amp;lt;model&amp;gt;&lt;br /&gt;[...]&lt;br /&gt;&amp;lt;submission action=&amp;quot;nuevo.jsp&amp;quot; method=&amp;quot;post&amp;quot;&lt;br /&gt;id=&amp;quot;crear&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;submission action=&amp;quot;eliminar.jsp&amp;quot; method=&amp;quot;post&amp;quot;&lt;br /&gt;id=&amp;quot;eliminar&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;submission action=&amp;quot;principal.jsp&amp;quot; method=&amp;quot;post&amp;quot; &lt;br /&gt;id=&amp;quot;cancelar&amp;quot;/&amp;gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;[en el body]&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;&amp;lt;submit submission=&amp;quot;crear&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;label&amp;gt;Crear usuario&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;/submit&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;submit submission=&amp;quot;eliminar&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;label&amp;gt;Eliminar usuario&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;/submit&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;submit submission=&amp;quot;cancelar&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;label&amp;gt;Cancelar&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;/submit&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Feder les indica &lt;a href="http://www.aulambra.com/ver2.asp?id=271&amp;amp;tipo=Codigo" target="_blank"&gt;dónde pueden ver un ejemplo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Al cabo de un rato regresan a la mesa de Feder: &lt;em&gt;hemos probado con Firefox, con Explorer... pero no conseguimos que funcione.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Bueno, es que &lt;strong&gt;actualmente ningún navegador soporta XForm nativamente&lt;/strong&gt;,- les explica,- pero existen &lt;a href="http://www.w3.org/MarkUp/Forms/wiki/XForms_Implementations" target="_blank"&gt;&lt;em&gt;plugins&lt;/em&gt; y extensiones para Explorer y Firefox.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Sus compañeros le hacen ver que &lt;strong&gt;no pueden obligar al usuario a utilizar determinado navegador y además instalarse un plugin o extensión.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Bueno,- insiste Feder- &lt;strong&gt;también se pueden convertir en el servidor, en tiempo de ejecución, a formularios de HTML,&lt;/strong&gt; &lt;a href="http://www.w3.org/MarkUp/Forms/wiki/XForms_Implementations" target="_blank"&gt;hay proyectos de código abierto.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;También podéis echar un vistazo a &lt;a href="http://ajaxforms.sourceforge.net/" target="_blank"&gt;AJAXForms&lt;/a&gt;,- añade Feder- que transforma documentos XHTML/XForms en páginas HTML con javascript, cuya comunicación con el servidor se restringe al intercambio de datos utilizando técnicas AJAX.&lt;/p&gt;&lt;p&gt;Sus compañeros se deshinchan... si transformamos los documentos XHTML/XForms en páginas HTML con javascript... ¿qué hemos ganado? Estamos otra vez en el punto de partida.&lt;/p&gt;&lt;h2&gt;MVC&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Clasificación:&lt;/strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="sinborde" border="0" alt="Accesible y recomendable " src="http://2.bp.blogspot.com/-C6rvFEH5zEk/ThDBsUgypAI/AAAAAAAABDU/2iLpHsd9Utw/s400/si_accesible.gif" /&gt;Accesible y recomendable ¡bingo! ¡usémoslo!&lt;/p&gt;&lt;p&gt;Hugo les da las gracias a todos y decide enviar un mensaje a la lista de correo de la empresa pidiendo más ideas. No tarda en llegar la respuesta.&lt;/p&gt;&lt;div class="entradilla"&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;form action=&amp;quot;./UsuariosServlet&amp;quot;&lt;br /&gt;name=&amp;quot;form1&amp;quot;&lt;br /&gt;id=&amp;quot;form1&amp;quot;&lt;br /&gt;method=&amp;quot;post&amp;quot;&amp;gt;      &lt;br /&gt;[...]&lt;br /&gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; &lt;br /&gt;value=&amp;quot;Usuario&amp;quot; &lt;br /&gt;id=&amp;quot;pageOperation&amp;quot;&lt;br /&gt;name=&amp;quot;pageOperation&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; &lt;br /&gt;value=&amp;quot;Crear usuario&amp;quot; &lt;br /&gt;id=&amp;quot;evento_nuevo&amp;quot;&lt;br /&gt;name=&amp;quot;evento_nuevo&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&lt;br /&gt;value=&amp;quot;Eliminar usuario&amp;quot;&lt;br /&gt;id=&amp;quot;evento_eliminar&amp;quot;&lt;br /&gt;name=&amp;quot;evento_eliminar&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&lt;br /&gt;value=&amp;quot;Cancelar&amp;quot;&lt;br /&gt;id=&amp;quot;evento_cancelar&amp;quot; &lt;br /&gt;name=&amp;quot;evento_cancelar&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Limpio, transparente, fácil de mantener, 100% accesible... Dejemos que la aplicación, en el servidor, en función del valor del &lt;code&gt;&amp;quot;pageOperation&amp;quot;&lt;/code&gt; y del botón pulsado (fácil de identificar porque su &lt;code&gt;&amp;quot;name&amp;quot;&lt;/code&gt; comienza con &amp;quot;evento&amp;quot;) decida qué acción realizar.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No utilizar &lt;code&gt;&amp;lt;button type=&amp;quot;submit&amp;quot; ... &lt;/code&gt;en vez de &lt;code&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; ... &lt;/code&gt;puesto que &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; funciona mal en &lt;a title="Artículo &amp;#39;Button Hell&amp;#39; de Roman&amp;#39;s blog" href="http://radaschuetz.com/archive/2007/04/21/button-hell/" target="_blank"&gt;Explorer y enviará todos los botones&lt;/a&gt; y por tanto no podremos saber en el servidor cuál se ha pulsado. &lt;/li&gt;&lt;li&gt;Si la página tienen validaciones javascript en función de las cuales se hace o no el &amp;quot;submit&amp;quot; (por ejemplo mediante un evento asociado al &amp;quot;onsubmit&amp;quot; del &amp;quot;form&amp;quot;) siempre hay que realizar también estas validaciones en el servidor, puesto que al tener botones &amp;quot;submit&amp;quot;, si el usuario no tiene javascript activo o su &amp;quot;user-agent&amp;quot; no lo soporta, el formulario se enviará porque se ignorará la validación javascript. Me parece muy interesante la reflexión que hace &lt;a href="http://blog.make.es/2007/05/19/%c2%bfinput-o-button/" target="_blank"&gt;b-Make&lt;/a&gt; acerca de las páginas que contienen una cláusula legal que hay que aceptar para enviar el formulario. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; Toda la historieta de fondo es inventada con personajes ficticios, así me ha parecido más amena.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Artículos relacionados:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2012/03/descripcion-extensa-de-una-imagen.html"&gt;Detectar si una imagen se ha cargado. Descripción extensa de una imagen: accesible con lector de pantalla y visible sin imágenes activas &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2012/03/que-teclas-de-acceso-rapido-accesskey.html"&gt;Qué teclas de acceso rápido (accesskey) utilizar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2007/02/ajax-accesible.html"&gt;AJAX accesible&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2007/02/enlaces-que-actan-como-botones.html"&gt;Enlaces que actúan como botones. Implementación accesible.&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com.es/2010/12/asociacion-compleja-de-radios-y-labels.html"&gt;Asociación compleja de radios y labels de forma accesible&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olgacarreras.blogspot.com/2007/02/formularios-usables-60-directrices-de.html"&gt;Formularios usables: 60 Directrices de Usabilidad&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-5764115586771223404?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/5764115586771223404/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/formulario-con-varios-botones.html#comment-form' title='19 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/5764115586771223404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/5764115586771223404'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/formulario-con-varios-botones.html' title='Formulario con varios botones. Implementación usable y accesible'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-KYivUpVwSFQ/ThDAW_OONeI/AAAAAAAABC0/IlauKwW_gK0/s72-c/formulario_varios_botones_accesible.jpg' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-2748335435801153352</id><published>2007-05-26T23:24:00.006+02:00</published><updated>2011-09-07T20:44:40.750+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><title type='text'>AJAX accesible</title><content type='html'>&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;&lt;br /&gt;[07-09-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html"&gt;AJAX accesible II: WAI-ARIA&lt;/a&gt;&lt;br /&gt;[22-10-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/hijax.html"&gt;AJAX accesible III: HIJAX&lt;/a&gt;&lt;br /&gt;[27-03-09] &lt;a href="http://olgacarreras.blogspot.com/2009/03/ajax-accesible-iv-tecnicas-aria-de-las.html"&gt;AJAX accesible IV: Técnicas ARIA de las WCAG 2.0&lt;/a&gt;&lt;br /&gt;[13-04-07] &lt;a href="http://olgacarreras.blogspot.com/2007/04/accesibilidad-y-firma-electrnica.html"&gt;Accesibilidad, firma electrónica y DNIe en el ámbito de las Administraciones Públicas&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;El objetivo de este artículo es reflexionar sobre los retos de accesibilidad que supone un desarrollo con &lt;a href="http://olgacarreras.blogspot.com/2007/04/glosario-termiloga-relacionada-con-la.html#ajax" target="_blank"&gt;AJAX&lt;/a&gt;. Me voy a centrar en la accesibilidad, sin entrar en los problemas de usabilidad que plantea (seguro que a todos os suenan &lt;a href="http://swik.net/Ajax/Ajax+Mistakes" target="_blank"&gt;los diez famosos problemas&lt;/a&gt;), tema que abordaré otro día.&lt;br /&gt;&lt;br /&gt;Entiendo que si sigues leyendo es porque sabes lo que es AJAX como técnica de enriquecimiento de aplicaciones web, si no es así te recomiendo que antes de continuar le eches un vistazo a &lt;a href="http://www.uberbin.net/archivos/internet/ajax-un-nuevo-acercamiento-a-aplicaciones-web.php" target="_blank"&gt;“AJAX: un nuevo acercamiento a Aplicaciones Web“&lt;/a&gt; con la traducción del famoso artículo “Ajax: A New Approach to Web Applications” de &lt;a href="http://olgacarreras.blogspot.com/2007/04/glosario-termiloga-relacionada-con-la.html#jesee_james_garret" target="_blank"&gt;Jesse James Garret&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AJAX no es un fin, es un medio&lt;/h2&gt;Mucha gente dará por sentado que si alguien preocupado por temas de usabilidad y accesibilidad hace un artículo sobre AJAX es para concluir: “no uséis AJAX, es el demonio, AJAX no es accesible”.&lt;br /&gt;&lt;br /&gt;Nada más lejos de mis intenciones. Me gusta AJAX, he trabajado con AJAX y recomiendo a menudo AJAX. Y aquí entran las matizaciones.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Recomiendo AJAX para problema concretos y siempre &lt;strong&gt;con sentido común&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;No recomiendo AJAX a toda costa, para todo, sólo porque los demás lo están usando o con el único afán de hacer alarde del dominio de la tecnología de moda. Usar AJAX con cualquier otro objetivo que no sea el de hacer más fácil, satisfactoria y productiva la experiencia del usuario, es simplemente una estupidez, y lo que es peor, un error que se descubre demasiado tarde.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En definitiva: &lt;strong&gt;AJAX no es un fin, es un medio para mejorar la experiencia del usuario&lt;/strong&gt;. Parece evidente, pero un inquietante número de arquitectos y diseñadores software pierden la perspectiva.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AJAX con sentido común&lt;/h2&gt;Creo que &lt;strong&gt;Alex Bosworth&lt;/strong&gt;, en su famoso artículo &lt;a href="http://www.sourcelabs.com/blogs/ajb/2005/12/10_places_you_must_use_ajax.html" target="_blank"&gt;“10 Places You Must Use Ajax”&lt;/a&gt; recomienda muy acertadamente para qué usar o no usar AJAX:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Recomienda usar AJAX para:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Form driven interaction. &lt;/li&gt;&lt;li&gt;Deep hierarchical tree navigation.&lt;/li&gt;&lt;li&gt;Rapid user-to-user communication. &lt;/li&gt;&lt;li&gt;Voting, Yes/No boxes, Ratings submissions.&lt;/li&gt;&lt;li&gt;Filtering and involved data manipulation. &lt;/li&gt;&lt;li&gt;Commonly entered text hints/autocompletion.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;NO recomienda usar AJAX para:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simple forms.&lt;/li&gt;&lt;li&gt;Search.&lt;/li&gt;&lt;li&gt;Basic navigation.&lt;/li&gt;&lt;li&gt;Replacing a large amount of text.&lt;/li&gt;&lt;li&gt;Display manipulation.&lt;/li&gt;&lt;li&gt;Useless widgets.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Dicho esto, es cierto que un desarrollo con técnicas AJAX plantea interesantes retos de accesibilidad, y para afrontarlos deberemos partir de &lt;strong&gt;dos premisas básicas&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La inmensa mayoría de los problemas tienen solución, unas veces será más fácil que otras, unas veces será más costosa que otras, pero &lt;strong&gt;siempre hay una solución&lt;/strong&gt;. Al fin y al cabo en eso consiste nuestro trabajo ¿no? en encontrar soluciones a los problemas.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nada es de por si accesible o no accesible&lt;/strong&gt;, ni una página, ni un script; los que los hacen inaccesibles son siempre los desarrolladores, por falta de conocimientos o por falta de interés.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AJAX y navegadores&lt;/h2&gt;AJAX se basa en el uso del objeto &lt;strong&gt;XMLHTTPRequest&lt;/strong&gt; mediante Javascript ejecutado en el navegador para realizar &lt;strong&gt;peticiones asíncronas al servidor&lt;/strong&gt;, y en la manipulación, también por Javascript, del &lt;strong&gt;Document Object Model (DOM)&lt;/strong&gt; para visualizar e interactuar dinámicamente con la información presentada.&lt;br /&gt;&lt;br /&gt;Por tanto, aunque AJAX no necesita ningún tipo de plugin para el navegador, requiere que el navegador soporte y tenga activo el Javascript, y que además soporte el objeto XMLHTTPRequest. En Internet Explorer 5 y 6, además, es necesario tener la secuencia de comandos ActiveX activada, ya que, en estas versiones, la implementación de Microsoft (denominada XMLHTTP) es un componente ActiveX (mientras que en versiones más recientes de los navegadores está implementado como un objeto nativo).&lt;br /&gt;&lt;br /&gt;En resumen, &lt;strong&gt;los navegadores que soportan AJAX&lt;/strong&gt;, siempre y cuando tengan Javascript activado, y en su caso la secuencia de comandos ActiveX, son:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Microsoft Internet Explorer&lt;/strong&gt; para Windows versión 5.0 y superiores, y los navegadores basados en él (por ejemplo &lt;a href="http://www.maxthon.com/es/" target="_blank"&gt;Maxthon&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Navegadores basados en &lt;strong&gt;Gecko &lt;/strong&gt;como Mozilla, Mozilla Firefox, SeaMonkey, Camino, Flock, Epiphany, Galeon y Netscape versión 7.1 y superiores &lt;/li&gt;&lt;li&gt;Navegadores con el &lt;strong&gt;API KHTML versión 3.2 y superiores&lt;/strong&gt; implementado, incluyendo Konqueror versión 3.2 y superiores, Apple Safari versión 1.2 y superiores. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Opera versión 8.0 y superiores&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dispositivos móviles&lt;/strong&gt;: Opera Mobile Browser 8.0 basado en Safari y API KHTML, que soporta aplicaciones desarrolladas en AJAX gracias a su motor de Javascript y su seguimiento del DOM. El mes pasado Mozilla lanzaba &lt;a href="http://www.mozilla.org/projects/minimo/" target="_blank"&gt;Minimo Mobile Browser 0.2&lt;/a&gt; compatible con Windows Mobile 5.0, y que soporta Javascript y AJAX.&lt;br /&gt;&lt;br /&gt;[Si os interesa el uso de AJAX en entornos móviles, es interesante echar un vistazo a &lt;a href="http://mojax.mfoundry.com/display/mojax/Main+Page" target="_blank"&gt;MOJAX (Mobile AJAX Application Frameworks)&lt;/a&gt;]&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;Los navegadores que NO soportan AJAX son:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Opera 7 y anteriores &lt;/li&gt;&lt;li&gt;Microsoft Internet Explorer para Windows versión 4.0 y anteriores &lt;/li&gt;&lt;li&gt;IE para Macintosh, todas las versiones &lt;/li&gt;&lt;li&gt;Dillo &lt;/li&gt;&lt;li&gt;Navegadores basados en texto como Lynx y Links &lt;/li&gt;&lt;li&gt;Navegadores para incapacitados visuales (braille) &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dispositivos móviles&lt;/strong&gt;: &lt;a href="http://labs.live.com/Deepfish/" target="_blank"&gt;Deepfish&lt;/a&gt; de Microsoft, presentado también hace un par de meses no soporta controles ActiveX, AJAX, cookies, ni JavaScript. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AJAX accesible&lt;/h2&gt;El punto de verificación 6.3 de las &lt;a href="http://olgacarreras.blogspot.com/2007/04/glosario-termiloga-relacionada-con-la.html#WCAG" target="_blank"&gt;Pautas de Accesibilidad de la WAI&lt;/a&gt; dice así:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Asegúrese de que las páginas sigan siendo utilizables cuando se desconecten o no se soporten los scripts, applets u otros objetos programados. Si esto no es posible, proporcione información equivalente en una página alternativa accesible.&lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Dicho punto es de Prioridad 1, es decir, es necesario para alcanzar un nivel de adecuación Simple A. Por tanto, para asegurar la accesibilidad de nuestra aplicación, se debe ofrecer una alternativa para el contenido mostrado dinámicamente por Javascript.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Si se utiliza un framework&lt;/strong&gt; para implementar técnicas AJAX, bien sea open source, comercial o propio de nuestra organización, habrá que asegurarse de que éste ofrece una alternativa accesible adecuada para cada componente AJAX y de que tienen en cuenta las incompatibilidades entre navegadores. &lt;a href="#notaAJAX1"&gt;[1]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y por supuesto, todos aquellos contenidos que se inserten dinámicamente en la página deben cumplir las normas de accesibilidad de ese elemento, tal y como las cumplen los demás elementos de la página. Y por tanto, si se utiliza un framework, asegurarse de que cumpla este requisito. &lt;a href="#notaAJAX2"&gt;[2]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y después de todo lo dicho, llegamos a lo realmente importante, al "meollo" del asunto.&lt;br /&gt;&lt;br /&gt;Cuando indico que es necesario ofrecer una alternativa accesible &lt;strong&gt;NO me refiero a crear dos aplicaciones diferentes, una con AJAX y otra sin AJAX&lt;/strong&gt;. La &lt;a href="http://olgacarreras.blogspot.com/2007/04/glosario-termiloga-relacionada-con-la.html#WAI" target="_blank"&gt;WAI&lt;/a&gt; desaconseja explícitamente los sitios alternativos por no ser una solución integradora, eso sin contar con el elevado coste de realizar dos versiones, las dificultades y el coste de su mantenimiento (como leí en el blog de &lt;a href="http://www.torresburriel.com/weblog/" target="_blank"&gt;Torres Burriel&lt;/a&gt;, Jesús García lo definió muy acertadamente como “casa de dos puertas es difícil de guardar” ).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;El objetivo, por lo tanto, es conseguir hacer accesible una única aplicación.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;¿Cómo podemos pues ofrecer alternativas accesibles para los desarrollos AJAX sin crear dos aplicaciones diferentes?&lt;/h2&gt;Antes de entrar en el tema me gustaría hacer un inciso sobre &lt;strong&gt;la etiqueta "noscript"&lt;/strong&gt;, de la que a menudo se echa mano. Por ejemplo, imaginemos un menú dinámico implementado por AJAX, de tal manera que al pulsar en una de las opciones principales del menú, se consulta al servidor su árbol de submenús para pintarse en la página.&lt;br /&gt;&lt;br /&gt;Puede pensarse que una buena alternativa accesible sería en la etiqueta "noscript" incluir todo el árbol del menú (o si este es muy extenso, un enlace a un página con todas las opciones de menú). Pero hay que advertir que &lt;a href="http://sigt.net/archivo/xhtml-20-el-futuro-de-la-web-y-que-no-nos-pase-na.xhtml" target="_blank"&gt;la etiqueta "noscript" no estará en el estándar XHTML2.0 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De todas formas, como voy a explicar ahora, hay una manera más robusta de hacer las cosas.&lt;br /&gt;&lt;br /&gt;Para empezar, tu aplicación debe utilizar un &lt;strong&gt;patrón MVC (Modelo-Vista-Controlador) &lt;/strong&gt;que separe los datos de la aplicación, la interfaz de usuario y la lógica de negocio en tres componentes distintos… y si no… vamos “apañaos”.&lt;br /&gt;&lt;br /&gt;Por otra parte, es graciosa tanta preocupación por separar el contenido, la presentación y el comportamiento, para luego encontramos las páginas llenas de Javascript. No me refiero a que el código no esté en ficheros JS (faltaría más), sino a tener el código Javascript mezclado con el código HTML, empozoñándolo al estilo de &lt;code&gt;&amp;lt;input onClick=”mifuncion()”&gt;&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Todo &lt;strong&gt;el código javascript debe ser no intrusivo&lt;/strong&gt;, invisible, de tal manera que no afecte su desactivación al funcionamiento de la página, y por supuesto tener cuidado con el tipo de eventos que se manejan (el evento &lt;em&gt;onClick&lt;/em&gt; será inservible, por ejemplo, a un usuario que no disponga de ratón).&lt;br /&gt;&lt;br /&gt;[Si lo de javascript “no intrusivo” te suena a chino, ya te estás yendo a &lt;a href="http://www.onlinetools.org/articles/unobtrusivejavascript/" target="_blank"&gt;Unobtrusive Javascript&lt;/a&gt; y a &lt;a href="http://www.bennolan.com/behaviour/" target="_blank"&gt;Behaviour&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;Bien, tenemos pues una aplicación como dios manda en la que además,&lt;strong&gt; desde la primera petición al servidor de nuestras páginas&lt;/strong&gt;, éste identifica el &lt;a href="http://en.wikipedia.org/wiki/User_agent" target="_blank"&gt;&lt;strong&gt;User-Agent&lt;/strong&gt;&lt;/a&gt; en una cabecera del protocolo http, pudiendo guardar esta información en una variable. Dicha variable será recuperable en toda la aplicación y servirá a los componentes AJAX de nuestro framework para que decidan cómo deben presentarse (en combinación con la identificación en su código generado de si está activado el Javascript en el navegador).&lt;br /&gt;&lt;br /&gt;Cuando hablo de componentes AJAX, en realidad pienso siempre en un framework personal o corporativo de mi organización o de mi cliente. &lt;strong&gt;Desconfío de los grandes frameworks de AJAX por varias razones&lt;/strong&gt;: tienen bugs al estar todavía poco maduros y no siempre hacen todo lo que el cliente/usuario/guía de estilo te exige que hagan. Prefiero un framework personal, al que le puedes echar mano con facilidad, sólo con los componentes que necesitas, a la medida de tus necesidades, y por supuesto basado en &lt;a href="http://www.prototypejs.org/" target="_blank"&gt;prototype&lt;/a&gt;. &lt;a href="#notaAJAX3"&gt;[3]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En este contexto, un componente AJAX sería, por ejemplo, una tabla con ordenamiento de columnas y paginación mediante AJAX, o un menú dinámico que consulte por AJAX las subopciones que ha de desplegar antes de repintarse.&lt;br /&gt;&lt;br /&gt;Nuestro componente “tabla” define internamente dos comportamientos en función del User-Agent: cómo pintarse para el caso de que sí admita javascript y en el de que no lo admita.&lt;br /&gt;&lt;br /&gt;Por otro lado, hay que decir que la &lt;strong&gt;variante accesible dependerá mucho del tipo de componente&lt;/strong&gt;; por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si se trata de un autocompletar en una caja de texto, puede decidirse que no es necesario disponer de una alternativa accesible, puesto que no tenerla no merma en nada la interacción con el formulario.&lt;/li&gt;&lt;li&gt;En el caso de una validación campo a campo de un formulario asíncronamente mediante AJAX, siempre que el formulario tenga un botón submit que valide los campos en servidor, no necesitará mayor alternativa.&lt;/li&gt;&lt;li&gt;En el caso de las capas de detalle (o balones) que aparecen sobre una celda de una tabla a modo de resumen (para no tener que navegar al detalle completo si no se desea), mi punto de vista es que si existe el enlace de detalle en cada fila, tampoco es necesaria otra alternativa accesible. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;Por lo tanto, si cada componente de nuestro framework tiene correctamente implementado internamente su comportamiento en función de las capacidades del navegador y del contexto de ejecución, este framework conseguirá el objetivo de cualquier diseño técnico orientado a componentes: independizar a la aplicación que los utiliza acerca de sus particularidades de implementación, lo que en este caso significa, en un caso ideal, que el desarrollador de la aplicación no deberá preocuparse acerca de las alternativas accesibles para los elementos enriquecimiento utilizados.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;De esta manera, la alternativa accesible es sólo a nivel de capa de presentación y sólo a nivel de componentes, no de aplicación.&lt;/strong&gt; &lt;a href="#notaAJAX4"&gt;[4]&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Es necesario conocer...&lt;/h2&gt;Si os interesa este tema, son imprescindibles los &lt;a href="http://www.maxkiesler.com/2006/06/28/how-to-make-your-ajax-applications-accessible-40-tutorials-and-articles/" target="_blank"&gt;40 tutoriales y artículos de AJAX y accesibilidad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;También por supuesto es imprescindible conocer &lt;a href="http://www.w3c.es/Prensa/2006/nota060926_aria-pressrelease" target="_blank"&gt;&lt;strong&gt;la hoja de ruta WAI-ARIA (Roadmap for Accessible Rich Internet Applications (WAI-ARIA))&lt;/strong&gt;&lt;/a&gt;, presentada por la W3C en septiembre de 2006.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;&lt;br /&gt;[...] ofrece una propuesta global que permita asegurar la interoperabilidad entre las aplicaciones de internet enriquecidas y las tecnologías asistivas utilizadas por personas con discapacidad. La propuesta se apoya en tecnologías ya desarrolladas o que están en desarrollo por el W3C, tales como el Modulo del Atributo Role de XHTML.&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://www.w3c.es/Prensa/2006/nota060926_aria-pressrelease" target="_blank"&gt;En W3C España&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://www.w3.org/TR/2006/WD-aria-roadmap-20060926/" target="_blank"&gt;WAI-ARIA Roadmap&lt;/a&gt;] [&lt;a href="http://www.w3.org/TR/2006/WD-aria-role-20060926/" target="_blank"&gt;WAI-ARIA Roles&lt;/a&gt;] [&lt;a href="http://www.w3.org/TR/2006/WD-aria-state-20060926/" target="_blank"&gt;WAI-ARIA States and Properties&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;/cite&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html" target="_blank"&gt;Ver artículo AJAX accesible II: WAI-ARIA&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Por último comentar el artículo &lt;a href="http://juicystudio.com/article/making-ajax-work-with-screen-readers.php" target="_blank"&gt;"Making Ajax Work with Screen Readers"&lt;/a&gt; de Gez Lemon and Steve Faulkner, que proponen &lt;strong&gt;manejar el búfer virtual del lector de pantalla JAWS&lt;/strong&gt; como vía para hacer accesible una aplicación web.&lt;br /&gt;&lt;br /&gt;Como complemento de nuestra aplicación puede ser buena idea, pero no es un estándar, ni JAWS es el único software para usuarios con deficiencias visuales, ni por supuesto la accesibilidad está pensanda sólo para este colectivo, como a veces parece que mucha gente piensa.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;En resumen, buenas prácticas&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="entradilla"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Respetar las pautas de accesibilidad en todos los elementos de las páginas aunque estén insertados dinámicamente.&lt;/li&gt;&lt;li&gt;Utilizar un patrón MVC que facilite la separación entre las lógicas de control y flujo de navegación (Controlador), de negocio y acceso a datos (Modelo), y de presentación en los distintos clientes, dispositivos y contextos (Vista).&lt;/li&gt;&lt;li&gt;Utilizar Javascript no intrusivo.&lt;/li&gt;&lt;li&gt;Conocer los navegadores para discapacitados visuales y comprobar que pueden interactuar con la aplicación: eventos adecuados, foco accesible, etc.&lt;/li&gt;&lt;li&gt;Detectar el User-Agent del usuario desde la primera petición guardando esta información para que sea recuperable por todas las páginas de la aplicación.&lt;/li&gt;&lt;li&gt;Crear una serie de módulos, de componentes AJAX, que en función del User-Agent y de si está habilitada la ejecución de Javascript sepan como “pintarse”, dando por tanto una opción alternativa accesible dependiendo del componente en cuestión.&lt;/li&gt;&lt;li&gt;Acatar la hoja de ruta de la WAI que permitirá por ejemplo informar mediante roles al usuario del funcionamiento exacto de la aplicación cuando los navegadores las implementen. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Notas&lt;/h3&gt;&lt;p&gt;&lt;br /&gt;&lt;a name="notaAJAX1"&gt;&lt;strong&gt;[1]&lt;/strong&gt;&lt;/a&gt; Por ejemplo, &lt;a href="http://www.tabernadelturco.com/2006/05/08/rails-el-demonio-del-client-side/" target="_blank"&gt;Rails incluye alternativas accesibles para formularios &lt;/a&gt;que se envían por Javascript, incluyendo un argumento que indica a qué URL enviarlo si no está habilitado el Javascript.&lt;br /&gt;&lt;br /&gt;&lt;a name="notaAJAX2"&gt;&lt;strong&gt;[2]&lt;/strong&gt;&lt;/a&gt; Por ejemplo,&lt;a href="http://www.ingeniuz.com/2006/10/25/dojo-04-ya-est-aqu/" target="_blank"&gt; Dojo 0.4 empieza a ofrecer &lt;/a&gt;funcionalidad completa desde teclado e integración con modos de alto contraste así como con lectores de pantalla para las personas discapacitadas. dojo.a11y: la fundación para la accesibilidad (a11y), ha implementado algunos de los widgets de esta versión e implementará algunos más para la siguiente (0.5).&lt;br /&gt;&lt;br /&gt;&lt;a name="notaAJAX3"&gt;&lt;strong&gt;[3]&lt;/strong&gt;&lt;/a&gt; Esta afirmación la considero válida en la actualidad, pero la evolución tecnológica que puede haber en un plazo de 2-3 años en los frameworks y productos disponibles, su integración con los IDEs, etc, seguramente desaconsejará a corto plazo el uso de frameworks propios, cuya principal debilidad es el coste y dificultad del futuro mantenimiento evolutivo/correctivo/adaptativo/perfectivo).&lt;br /&gt;&lt;br /&gt;&lt;a name="notaAJAX4"&gt;&lt;strong&gt;[4]&lt;/strong&gt;&lt;/a&gt; A nivel de lógica de negocio, no sería óptimo trabajar sólo con macropeticiones (peticiones globales de la página como en una aplicación sin AJAX) ni siquiera componer las macropeticiones a través de las micropeticiones (pequeñas peticiones sólo de aquellos contenidos de la página que vamos actualizar con AJAX), por ello, sí que será necesario que junto a las micropeticiones haya macropeticiones para las variantes accesibles.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="rel"&gt;&lt;strong&gt;Artículos relacionados&lt;/strong&gt;&lt;br /&gt;[07-09-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/ajax-accesible-ii-wai-aria.html"&gt;AJAX accesible II: WAI-ARIA&lt;/a&gt;&lt;br /&gt;[22-10-07] &lt;a href="http://olgacarreras.blogspot.com/2007/02/hijax.html"&gt;AJAX accesible III: HIJAX&lt;/a&gt;&lt;br /&gt;[27-03-09] &lt;a href="http://olgacarreras.blogspot.com/2009/03/ajax-accesible-iv-tecnicas-aria-de-las.html"&gt;AJAX accesible IV: Técnicas ARIA de las WCAG 2.0&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-2748335435801153352?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/2748335435801153352/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/2748335435801153352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/2748335435801153352'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2007/02/ajax-accesible.html' title='AJAX accesible'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1531275133681113837.post-3450032720171375532</id><published>2007-04-13T19:43:00.000+02:00</published><updated>2008-09-24T23:13:55.841+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad legislación'/><category scheme='http://www.blogger.com/atom/ns#' term='DNIe'/><category scheme='http://www.blogger.com/atom/ns#' term='firma electrónica'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad javascript'/><title type='text'>Accesibilidad, firma electrónica y DNIe en el ámbito de las Administraciones Públicas</title><content type='html'>Las aplicaciones Web de la &lt;strong&gt;Administración Pública&lt;/strong&gt; española, desde el 1 de enero de 2006, &lt;strong&gt;deben cumplir los requisitos de accesibilidad W3C-WAI&lt;/strong&gt; según la Ley 34/2002 &lt;a href="#FIRMANOTA1"&gt;[1]&lt;/a&gt; (aunque no se especifica el nivel mínimo de adecuación recomendado, el exigido en otros textos a nivel nacional &lt;a href="#FIRMANOTA2"&gt;[2]&lt;/a&gt; y desde la Unión Europea &lt;a href="#NOTA3"&gt;[3]&lt;/a&gt; es explícitamente la Doble A).&lt;br /&gt;&lt;br /&gt;Por otro lado, la&lt;strong&gt; Administración Pública española debe ofrecer servicios de tramitación telemática &lt;/strong&gt;&lt;a href="#FIRMANOTA4"&gt;[4]&lt;/a&gt;, &lt;strong&gt;para los cuales se requiere firma electrónica&lt;/strong&gt;, que permite identificar al firmante, verificar la integridad de su mensaje y asegurar su autoría, en caso de que éste decidiera negarla. &lt;a href="#FIRMANOTA5"&gt;[5]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La Ley distingue dos tipos de firma electrónica. La &lt;strong&gt;firma electrónica avanzada&lt;/strong&gt;, que se define según la Ley 59/2003 &lt;a href="#FIRMANOTA5"&gt;[5]&lt;/a&gt; como:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;"Art. 3.2 La firma electrónica avanzada es la firma electrónica que permite identificar al firmante y detectar cualquier cambio ulterior de los datos firmados, que está vinculada al firmante de manera única y a los datos a que se refiere y que ha sido creada por medios que el firmante puede mantener bajo su exclusivo control."&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;y la &lt;strong&gt;firma electrónica reconocida&lt;/strong&gt;, que se define según la Ley 59/2003 &lt;a href="#NOTA5"&gt;[5]&lt;/a&gt; como:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;"[...] que se define siguiendo las pautas impuestas en la Directiva 1999/93/CE como la firma electrónica avanzada basada en un certificado reconocido y generada mediante un dispositivo seguro de creación de firma. A la firma electrónica reconocida le otorga la Ley la equivalencia funcional con la firma manuscrita respecto de los datos consignados en forma electrónica.&lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;Con ello se aclara que no basta con la firma electrónica avanzada para la equiparación con la firma manuscrita; es preciso que la firma electrónica avanzada esté basada en un certificado reconocido y haya sido creada por un dispositivo seguro de creación."&lt;/cite&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Un dispositivo seguro de creación como el DNIe.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;No pretendo aquí incluir un manual de firma electrónica, pero sí que es necesario decir que, en ambos casos, el funcionamiento de la firma electrónica está basado es una clave pública y una clave privada. La &lt;strong&gt;clave privada sólo está en poder del propietario, que debe conservarla de forma segura, &lt;/strong&gt;y por tanto &lt;strong&gt;jamás debe abandonar la máquina del cliente&lt;/strong&gt; (en realidad, en el caso de la firma reconocida, ésta nunca sale del chip de la &lt;i&gt;smartcard&lt;/i&gt; o dispositivo). Por ello &lt;strong&gt;no podremos realizar nunca la firma electrónica en el servidor&lt;/strong&gt;. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Y entonces llegamos a donde quería ir a parar, que &lt;strong&gt;la firma electrónica requiere lógica en cliente&lt;/strong&gt;, por un lado la utilización de Javascript y por otro la necesidad de un ActiveX o un applet (las opciones más habituales), ya que,  también por motivos de seguridad, mediante Javascript no tendrías nunca permisos para acceder, por ejemplo, al almacén de certificados.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;El punto de verificación 6.3 de las &lt;a href="http://www.discapnet.es/web_accesible/wcag10/WAI-WEBCONTENT-19990505_es.html#gl-new-technologies" target="_blank"&gt;&lt;strong&gt;Pautas de Accesibilidad de la WAI&lt;/strong&gt; &lt;/a&gt;(que como hemos dicho deben acatar las aplicaciones de las Administraciones Públicas) dice así:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;cite&gt;"Asegúrese de que las páginas sigan siendo utilizables cuando se desconecten o no se soporten los scripts, applets u otros objetos programados. Si esto no es posible, proporcione información equivalente en una página alternativa accesible". &lt;/cite&gt;&lt;/p&gt;&lt;p&gt;&lt;cite&gt;&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Dicho punto es de &lt;strong&gt;Prioridad &lt;/strong&gt;1, es decir, es&lt;strong&gt; necesario para alcanzar un nivel de adecuación Simple A&lt;/strong&gt;, el menos exigente (recordemos que hemos dicho que el nivel mínimo recomendado era la Doble A, el siguiente nivel de adecuación y más exigente que la Simple A).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La WAI es realista, prevé que en aquellos casos en los cuales la tecnología del momento no alcanza para ofrecer la plena accesibilidad de un servicio, no habrá más solución que ofrecer una versión o un modo de interacción diferente. En este caso &lt;strong&gt;habría que ofrecer una alternativa accesible&lt;/strong&gt; para los usuarios cuyo navegador no admite o no tiene activo el Javascript (según W3C el 10% &lt;a href="http://www.w3schools.com/browsers/browsers_stats.asp" target="_blank"&gt;de los usuarios navegan con el Javascript desactivado&lt;/a&gt;), así como para aquellos que no puedan ejecutar el ActiveX o el applet.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Podría pensarse en una alternativa&lt;/strong&gt; como la que estamos habituados en los entornos de banca, después de informar al usuario de que su navegador no admite Javascript o no lo tiene activado, o que si bien admite Javascript no puede ejecutar los componentes cliente de firma electrónica (ActiveX o Applet) y que por tanto no podrá autenticarse o firmar con certificado digital, informarle como digo de que sí que podrá hacerlo &lt;strong&gt;mediante usuario y contraseña, reforzado por ejemplo con una tarjeta de coordenadas&lt;/strong&gt;, incluso disponible en versión braille como la que ofrece Bankinter a sus clientes.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;El problema es que&lt;/strong&gt;, aunque esta solución podría valernos para la autenticación, en el caso de la firma electrónica, &lt;strong&gt;dentro de la Administración Pública no tendría validez legal&lt;/strong&gt;, puesto que se exige que la firma electrónica ofrezca garantías de Autenticación, Integridad y No repudio, lo que le confiere validez legal. &lt;a href="#FIRMANOTA5"&gt;[5] &lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Por tanto, nos encontramos con una &lt;strong&gt;paradoja&lt;/strong&gt;: la Administración Pública debe ofrecer servicios de tramitación telemática que necesitan de firma electrónica, pero a su vez debe cumplir con las Pautas de Accesibilidad de la WAI. Y ambos son incompatibles hoy en día. Podrán hacerse accesibles todos los contenidos salvo aquellos que requieran firma electrónica.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A este respecto, la web del Ministerio de Fomento, en su apartado de &lt;a href="http://www.fomento.es/MFOM/LANG_CASTELLANO/OFICINA_VIRTUAL/oficinavirtual.htm" target="_blank"&gt;Accesibilidad &lt;/a&gt;dice así:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;“Todas las aplicaciones satisfacen todos los puntos de verificación de prioridad 1 y 2 definidos en las Directrices de Accesibilidad para el Contenido Web 1.0 (WCAG 1.0) por la Iniciativa de Accesibilidad Web (WAI) del World Wide Web Consortium (W3C). De acuerdo a lo anterior, ninguna de las aplicaciones necesita para alcanzar su funcionalidad completa el uso de javascript.&lt;br /&gt;&lt;br /&gt;En el caso de que la complejidad de los formularios haya aconsejado mantener funcionalidades que hagan uso de javascript para mejorar su usabilidad, se ofrece una versión accesible AA alternativa y equivalente.&lt;br /&gt;&lt;br /&gt;No obstante es necesario puntualizar lo siguiente: &lt;strong&gt;Por motivos de seguridad es necesario que las operaciones de firma se realicen en su navegador, por lo que éste debe capaz de ejecutar javascript y los componentes cliente de firma electrónica (ActiveX o Applet).&lt;/strong&gt; Ésta es la única excepción a la norma y la única funcionalidad que emplee javascript que usted se encontrará si elige usar la versión accesible AA de las aplicaciones.”&lt;/cite&gt; &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Paradójico, como digo: podrás realizar todo el proceso pero no te servirá de nada, porque al final no podrás firmar, deberás cerrar el ordenador e irte a hacer cola a una ventanilla.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La tecnología Web debe avanzar, así que si os queréis forrar ya sabéis lo que tenéis que patentar: una forma de realizar firma electrónica accesible, sin necesidad de lógica en cliente. Hoy en día suena a ciencia ficción, ya veremos mañana.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;&lt;strong&gt;NOTAS&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a name="FIRMANOTA1"&gt;[1]&lt;/a&gt;&lt;/strong&gt; Ley 34/2002, en su &lt;a href="http://noticias.juridicas.com/base_datos/Admin/l34-2002.t7.html#da5" target="_blank" name="da5"&gt;Disposición Adicional Quinta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Las Administraciones públicas adoptarán las medidas necesarias para que la información disponible en sus respectivas páginas de Internet pueda ser accesible a personas con discapacidad y de edad avanzada, de acuerdo con los criterios de accesibilidad al contenido generalmente reconocidos, antes del 31 de diciembre de 2005.&lt;/cite&gt;&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;a name="FIRMANOTA2"&gt;[2]&lt;/a&gt;&lt;/strong&gt; Por ejemplo, en el marco concreto de los registros y las notificaciones telemáticas, los "&lt;a href="http://www.csi.map.es/csi/criterios/normalizacion/index.html#5" target="_blank"&gt;Criterios de seguridad, normalización y conservación de las aplicaciones utilizadas para el ejercicio de potestades&lt;/a&gt;" (Criterios SNC)”. Indica en su apartado cinco específicamente la Doble A:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;cite&gt;La &lt;a href="http://www.csi.map.es/csi/pg2024.htm" target="_blank"&gt;Orden PRE/1551/2003&lt;/a&gt;, de 10 junio, por la que se desarrolla la &lt;a href="http://www.csi.map.es/csi/pg2023.htm#10" target="_blank"&gt;Disposición final primera del Real Decreto 209/2003, de 21de febrero de 2003&lt;/a&gt;, que regula los registros y las notificaciones telemáticas, así como la utilización de medios telemáticos para la sustitución de certificados por los ciudadanos, establece que el registro telemático y el servicio de notificación telemática deberán cumplir los requerimientos en materia de accesibilidad establecidos por la Iniciativa para una Web Accesible (WAI) del Consorcio World Wide Web y en particular las especificaciones de la Recomendación de 5 de mayo de 1999 sobre Pautas de Accesibilidad del Contenido en la Web, versión 1.0, en su nivel AA. &lt;/cite&gt;&lt;/p&gt;&lt;p&gt;&lt;cite&gt;[…] &lt;/cite&gt;&lt;/p&gt;&lt;p&gt;&lt;cite&gt;5.2 Los servicios electrónicos puestos por la Administración a disposición del ciudadano deben ser visualizables, accesibles y funcionalmente operables desde diversos navegadores alternativos. En particular, se deben adaptar las aplicaciones web a los estándares del World Wide Web Consortium (W3C), evitar la utilización de extensiones propietarias de navegadores y verificar el sitio web, al menos, con &lt;a href="http://validator.w3.org/" target="_blank"&gt;http://validator.w3.org/&lt;/a&gt;. (Véase capítulo 'Software libre y de fuentes abiertas')&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;[3]&lt;a name="FIRMANOTA3"&gt;&lt;/a&gt;&lt;/strong&gt; Por ejemplo en la Resolución del Parlamento Europeo sobre la Comunicación de la Comisión “&lt;a href="http://www.sidar.org/recur/direc/eeuro/index.php" target="_blank"&gt;eEurope 2002: Accesibilidad de los sitios Web públicos y de su contenido &lt;/a&gt;(COM(2001) 529 – C5 – 0074/2002 – 2002/2032(COS) de abril de 2002,” en su punto 30:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;cite&gt;Subraya que para que los sitios web sean accesibles es fundamental que satisfagan el nivel doble A y que se aplique en su totalidad la prioridad 2 de las Pautas WAI.&lt;/cite&gt;&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;a name="FIRMANOTA4"&gt;[4]&lt;/a&gt;&lt;/strong&gt; El &lt;a href="http://noticias.juridicas.com/base_datos/Admin/l30-1992.t4.html#a45"&gt;artículo 45 de la Ley 30/1992&lt;/a&gt;, impone a las Administraciones Públicas la obligación de impulsar el empleo y aplicación de técnicas electrónicas, informáticas y telemáticas en el desarrollo de su actividad y el ejercicio de sus competencias. Esta tarea de promoción recibió un nuevo impulso legislativo con la reforma operada por la &lt;a href="http://noticias.juridicas.com/base_datos/Admin/l24-2001.t4.html#a68"&gt;Ley 24/2001&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[&lt;a href="http://www.mecd.es/mecd/registro/files/OrdenMinisterial.pdf" target="_blank"&gt;Más información&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a name="FIRMANOTA5"&gt;[5]&lt;/a&gt;&lt;/strong&gt; &lt;a href="http://noticias.juridicas.com/base_datos/Admin/l59-2003.html" target="_blank"&gt;Ley 59/2003&lt;/a&gt;, de 19 de septiembre, de firma electrónica.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1531275133681113837-3450032720171375532?l=olgacarreras.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://olgacarreras.blogspot.com/feeds/3450032720171375532/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://olgacarreras.blogspot.com/2007/04/accesibilidad-y-firma-electrnica.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/3450032720171375532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1531275133681113837/posts/default/3450032720171375532'/><link rel='alternate' type='text/html' href='http://olgacarreras.blogspot.com/2007/04/accesibilidad-y-firma-electrnica.html' title='Accesibilidad, firma electrónica y DNIe en el ámbito de las Administraciones Públicas'/><author><name>Olga Carreras</name><uri>http://www.blogger.com/profile/09766441534259003449</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/-ExT25d6I8sM/ThApmvcNINI/AAAAAAAAA_Y/_ZW_tOAgmso/s220/olgacarreras.jpg'/></author><thr:total>10</thr:total></entry></feed>
