<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Niquelao &#187; Javascript</title>
	<atom:link href="http://www.niquelao.net/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.niquelao.net</link>
	<description>¿Cómo dices que te ha quedado?</description>
	<lastBuildDate>Wed, 10 Feb 2010 16:59:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Los problemas del elemento &lt;script&gt; en Internet Explorer</title>
		<link>http://www.niquelao.net/xhtml/2008/03/17/los-problemas-del-elemento-script-en-internet-explorer/</link>
		<comments>http://www.niquelao.net/xhtml/2008/03/17/los-problemas-del-elemento-script-en-internet-explorer/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 19:59:05 +0000</pubDate>
		<dc:creator>Maroto</dc:creator>
				<category><![CDATA[(X)HTML]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/xhtml/2008/03/17/los-problemas-del-elemento-script-en-internet-explorer/</guid>
		<description><![CDATA[¿Qué sucede cuando se quiere dotar a un documento (X)HTML de comportamiento desde el lado del cliente, en el navegador?. Es decir, que tenemos que hacer para ejecutar alguna función JavaScript externa en un navegador web.

La pregunta no parece complicada a simple vista. Simplemente con utilizar el elemento &#60;script&#62; en dicho documento, donde el valor [...]]]></description>
			<content:encoded><![CDATA[<p>¿Qué sucede cuando se quiere dotar a un documento <acronym title="eXtensible Hyper Text Markup Language" xml:lang="en" lang="en">(X)HTML</acronym> de comportamiento desde el lado del cliente, en el navegador?. Es decir, que tenemos que hacer para ejecutar alguna función JavaScript externa en un navegador web.</p>
<p><span id="more-85"></span></p>
<p>La pregunta no parece complicada a simple vista. Simplemente con utilizar el elemento &lt;script&gt; en dicho documento, donde el valor del atributo src nos indique donde se encuentra el fichero, sería suficiente.</p>
<p><code><br />
&lt;script type=&quot;text/javascript&quot; src=&quot;ruta_a/fichero.js&quot;&gt;&lt;/script&gt;<br />
</code></p>
<p>Sin embargo, si por un &quot;descuido&quot; olvidásemos la etiqueta de cierre de este elemento (&lt;/script&gt;) comenzarían los problemas. <acronym title="Internet Explorer">IE</acronym> (6 y 7) devuelven un documento en blanco, sin contenido. Si vemos el código fuente de la página, esta todo. Qué raro, ¿no?</p>
<p>En todo caso, la solución no es difícil. Cerramos el elemento y arreglado.</p>
<p>Si se trata de un documento <acronym>XHTML</acronym>, al ser nosotros unos tíos finos que nos gusta el código limpio y ordenado reducimos el código de llamada al código JavaScript mediante el uso de un elemento vacío, al igual que haríamos con contenedor de metainformación (&lt;meta /&gt;), una imagen (&lt;img /&gt;) o incluso con un vínculo a un recurso externo (&lt;link /&gt;).</p>
<p><code>&lt;script type=&quot;text/javascript&quot; src=&quot;ruta_a/fichero.js&quot; /&gt;</code></p>
<p>Sin embargo, a pesar de ser un documento válido, Volvemos a lo mismo, <acronym>IE</acronym> nos vuelve a sorprender con un documento en blanco. De nuevo, la solución es sencilla: utilizar la correspondiente etiqueta de cierre del elemento (&lt;/script&gt;).</p>
<p>¿Eso es todo?. No, que va. Si todo el trabajo lo realizaramos de forma manual no sería mayor inconveniente que recordar en todos los documentos que tenemos que utilizar esta etiqueta de cierre. Lamentablemente, hoy en día las cosas son un poco más complicadas y es habitual que el contenido sea generado y procesado a partir de otros documentos <acronym title="eXtensible Markup Language">XML</acronym>, por lo que el tratamiento de ciertos elementos se realiza en cadena. Por ejemplo, a los elementos vacíos se les proporciona de forma automática su correspondiente etiqueta de cierre (&lt;img&gt;&lt;/img&gt;, &lt;input&gt;&lt;/input&gt;, &lt;script&gt;&lt;/script&gt;), lo que a fin de cuentas devuelve un código no muy limpio. Si por el contrario sucede que a todos los elementos vacíos se les aplica la barra de cierre (/) tendremos los problemas anteriormente descritos con nuestro navegador más querido.</p>
<p>La <a href="http://www.w3.org/TR/html401/interact/scripts.html#edef-SCRIPT" title="Definición del elemento script" hreflang="en">recomendación HTML 4.01</a> indica que la etiqueta de cierre del elemento &lt;script&gt; es requerida, pero de ahí a que <acronym>IE</acronym> se altere y deje de respirar va mucho. ¡Qué menos que pasarse a modo <em xml:lang="en" lang="en">quirks</em>!, ¿no creéis?</p>
<a href='http://www.niquelao.net/xhtml/2008/03/17/los-problemas-del-elemento-script-en-internet-explorer/' class='retweet ' startCount = '0'>Los problemas del elemento &lt;script&gt; en Internet Explorer</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/xhtml/2008/03/17/los-problemas-del-elemento-script-en-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Días disponibles con acc_calendar</title>
		<link>http://www.niquelao.net/accesibilidad/2007/07/07/fitro-de-dias-en-acc_calendar/</link>
		<comments>http://www.niquelao.net/accesibilidad/2007/07/07/fitro-de-dias-en-acc_calendar/#comments</comments>
		<pubDate>Sat, 07 Jul 2007 10:49:29 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Accesibilidad]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/accesibilidad/2007/07/06/fitro-de-dias-en-acc_calendar/</guid>
		<description><![CDATA[En estas fechas estivales es frecuente acudir a sitios web que ofrecen viajes, vuelos, hoteles… En todos ellos hay al menos un campo para introducir fechas y suele ser frecuente que además exista un calendario que nos permita seleccionarlas.

Para evitar las frustrantes esperas que hemos de sufrir cuando, tras realizar la consulta, la fecha elegida [...]]]></description>
			<content:encoded><![CDATA[<p>En estas fechas estivales es frecuente acudir a sitios web que ofrecen viajes, vuelos, hoteles… En todos ellos hay al menos un campo para introducir fechas y suele ser frecuente que además exista un calendario que nos permita seleccionarlas.</p>
<p><span id="more-66"></span></p>
<p>Para evitar las frustrantes esperas que hemos de sufrir cuando, tras realizar la consulta, la fecha elegida no está disponible, en algunos sitios el calendario las filtra ofreciendo sólo las que si lo estan. Esto me hizo pensar que al <a href="http://www.niquelao.net/acc_calendar-calendario-accesible-en-javascript-innecesario-pero-util/">acc_calendar</a> le hacía falta esa posibilidad para quedar (al menos un poco) <strong>“niquelao”</strong>.</p>
<p>Dicho y (tras un buen rato) hecho. Mediante un toque de ajax, podemos aplicar un filtro sobre el calendario para que únicamente permita la selección de determinadas fechas. Para ello, de forma opcional añadiremos la clase <code>disp</code> en el campo de texto para la fecha. En el <code>script</code> hay disponible una variable (<var>fichero_consulta</var>) en la que indicar la dirección que resolverá la consulta de días disponibles en el servidor.</p>
<p>El envío se hace mediante el método POST y las variables son el mes y el año (<var>month</var>, en formato numérico, y <var>year</var>). El servidor ha de devolver los días disponibles en forma de texto y separados por comas. Por ejemplo, con php podría devolver la cadena <samp>12,13,14,17,21,28,29</samp> mediante un simple <code>echo</code>.</p>
<p>Ya he retocado el <a href="http://www.niquelao.net/acc_calendar-calendario-accesible-en-javascript-innecesario-pero-util/#julio2007">artículo original</a> dedicado al calendario para detallar (otra vez) esta funcionalidad e incluir un ejemplo.</p>
<p>Si alguno de vosotros piensa que es mejorable, que lo diga. Yo por mi parte haré lo que pueda (teniendo en cuenta que estoy de vacaciones).</p>
<a href='http://www.niquelao.net/accesibilidad/2007/07/07/fitro-de-dias-en-acc_calendar/' class='retweet ' startCount = '0'>Días disponibles con acc_calendar</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/accesibilidad/2007/07/07/fitro-de-dias-en-acc_calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>acc_slide: Presentaciones con XHTML, CSS y javascript</title>
		<link>http://www.niquelao.net/css/2007/04/15/acc_slide-presentaciones-con-xhtml-css-y-javascript/</link>
		<comments>http://www.niquelao.net/css/2007/04/15/acc_slide-presentaciones-con-xhtml-css-y-javascript/#comments</comments>
		<pubDate>Sun, 15 Apr 2007 19:24:50 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[(X)HTML]]></category>
		<category><![CDATA[Accesibilidad]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/css/2007/04/15/acc_slide-presentaciones-con-xhtml-css-y-javascript/</guid>
		<description><![CDATA[Por fin ha llegado el momento de publicarlo. Hacía tiempo que estaba en ello pero por un motivo u otro no pude hacerlo hasta ahora. Aquí está el nuevo sistema para realizar presentaciones con XHTML, CSS y javascript.

Supongo que alguno ya conocerá más de un sistema de los que habitualmente se utilizan, como por ejemplo [...]]]></description>
			<content:encoded><![CDATA[<p>Por fin ha llegado el momento de publicarlo. Hacía tiempo que estaba en ello pero por un motivo u otro no pude hacerlo hasta ahora. Aquí está el nuevo sistema para realizar presentaciones con XHTML, CSS y javascript.</p>
<p><span id="more-61"></span></p>
<p>Supongo que alguno ya conocerá más de un sistema de los que habitualmente se utilizan, como por ejemplo el <a href="http://www.w3.org/Talks/Tools/Slidy/" title="enlace externo" class="externo">HTML Slidy</a> del W3C o el <a href="http://meyerweb.com/eric/tools/s5/s5-intro.html" title="enlace externo" class="externo">S5</a> de Eric Meyer. Tras utilizarlos llegué a la conclusión de que, aunque buenos, había algo que quizás podría ser mejorable (según mi criterio, claro).</p>
<p>Como he dicho, ambos sistemas son buenos y válidos, pero en ambos se hace necesario utilizar marcado cuya única finalidad es la de servir para que el script lo utilice y aplique estilos sobre él. Si realmente se quiere tener algo eficaz, <strong>¿por qué no hacer que el propio script genere el marcado que necesita de forma inteligente?</strong></p>
<h3>El desarrollo</h3>
<p>Me puse manos a la obra con la siguiente premisa: Si tenemos un documento correctamente estructurado y marcado (con sus encabezados, párrafos, listas&#8230;), el script debe ser lo suficientemente inteligente como para organizar y generar la presentación, todo ello sin incluir ningún contenedor adicional, ni clases, ni id. Únicamente ha de ser la propia estructura del documento la que permita diferenciar lo que se tiene que incluir en cada diapositiva.</p>
<p>Tras pegarme con ello, aquí está el resultado. El <strong>acc_slide</strong>, o como Andrés y Maroto lo llaman, <strong>rumo_slide</strong> o <strong>slide_oso</strong>. En lugar de seguir escribiendo más acerca de ello, lo mejor es demostrar de lo que estoy hablando. He preparado dos presentaciones, ambas con la descripción del sistema y de su utilización. La diferencia entre ambas es el grado de resumen. No dudéis en echar un vistazo al marcado que he empleado para ver de lo que estoy hablando:</p>
<p><strong>nota:</strong> aunque la forma de navegación por la presentación se trata en la misma, la forma básica de moverse por los contenidos se realiza con las flechas (arriba y abajo) del teclado.</p>
<ul>
<li><a href="http://niquelao.net/wp-content/uploads/2007/4/acc_slide/mini/">Versión reducida</a> y <a href="http://niquelao.net/wp-content/uploads/2007/4/acc_slide/mini/acc_slide.zip" title="archivo comprimido en formato zip">Versión reducida descargable</a></li>
<li><a href="http://niquelao.net/wp-content/uploads/2007/4/acc_slide/">Versión extendida (si, muy extendida)</a> y <a href="http://niquelao.net/wp-content/uploads/2007/4/acc_slide/version_ampliada/acc_slide_ampl.zip" title="archivo comprimido en formato zip">Versión extendida descargable</a></li>
</ul>
<h3>Características básicas</h3>
<p><em>acc_slide</em> ha sido creado teniendo como objetivo la separación absoluta entre el contenido y el comportamiento, evitando cualquier consideración acerca de este al crear y marcar la información que se quiera mostrar.</p>
<p>Entre las características que el sistema de presentaciones <em>acc_slide</em> posee se pueden destacar:</p>
<ul>
<li>Únicamente requiere de una correcta y lógica estructuración del contenido mediante el uso de encabezados. No necesita de elementos adicionales más allá de los necesarios para el marcado semántico del contenido. El sistema reconstruye y adapta el árbol DOM, con lo que no impone la necesidad de un marcado concreto. Esto lo hace compatible con cualquier documento (X)HTML bien estructurado (incluso con los que incluyen el marcado empleado por otros sistemas de presentaciones). Esto lo hace totalmente versatil. Se podría utilizar sobre un documento web, sobre el marcado empleado en los otros sistemas de presentaciones, etc.</li>
<li>Respetuoso con los estándares y la accesibilidad.</li>
<li>Separación absoluta de contenido, presentación y comportamiento.</li>
<li>Fácil integración y fácil utilización. No requiere conocimientos específicos, y si se utiliza uno de los temas propuestos, no es necesario conocer CSS.</li>
<li>Permite crear secciones con grupos de diapositivas.</li>
<li>El aspecto gráfico ofrece gran versatilidad y se controla totalmente con CSS. Además se pueden crear varios estilos y jugar con la especificidad de selector para aplicarlos (y combinarlos) en caliente (mientras se ejecuta la presentación).</li>
<li>Sistema <em>autoplay</em> de reproducción automática.</li>
<li>Incorpora un sistema para abrir enlaces de forma integrada a la presentación. Si se incluye el atributo <code>title</code> en el enlace, el contenido de este se mostrará al pié de la ventana. Además, el destino del enlace puede ser una URL o una imagen.</li>
<li>Cada diapositiva se asocia con un ancla de tal manera que se puede ir directamente a la que se desee. El ancla coincide con la posición de la diapositiva en la presentación.</li>
</ul>
<p>Llegados a este punto, espero vuestro feedback. También estaba pensando crear un repositorio público de estilos para el sistema. Si os parece una buena idea y queréis participar con los vuestros, no lo dudéis. Podéis enviar vuestros temas a <a href="mailto:rumoroso@niquelao.net">rumoroso@niquelao.net</a></p>
<a href='http://www.niquelao.net/css/2007/04/15/acc_slide-presentaciones-con-xhtml-css-y-javascript/' class='retweet ' startCount = '0'>acc_slide: Presentaciones con XHTML, CSS y javascript</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/css/2007/04/15/acc_slide-presentaciones-con-xhtml-css-y-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Actualización de acc_calendar</title>
		<link>http://www.niquelao.net/accesibilidad/2007/04/04/actualizacion-de-acc_calendar/</link>
		<comments>http://www.niquelao.net/accesibilidad/2007/04/04/actualizacion-de-acc_calendar/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 18:16:57 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Accesibilidad]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/accesibilidad/2007/04/04/actualizacion-de-acc_calendar/</guid>
		<description><![CDATA[Ya se que parece que soy recurrente con los mismos temas. Primero fue la saga de los formularios y ahora parece que viene la de los calendarios.
Tras observar la posible versatilidad de otros calendarios que se cargan con javascript, me he decidido a implementar un nuevo cambio y retocar/actualizar el artículo original.

El cambio consiste en [...]]]></description>
			<content:encoded><![CDATA[<p>Ya se que parece que soy recurrente con los mismos temas. Primero fue la saga de los formularios y ahora parece que viene la de los calendarios.</p>
<p>Tras observar la posible versatilidad de otros calendarios que se cargan con javascript, me he decidido a implementar un nuevo cambio y retocar/actualizar <a href="http://www.niquelao.net/acc_calendar-calendario-accesible-en-javascript-innecesario-pero-util/">el artículo original</a>.</p>
<p><span id="more-60"></span></p>
<p>El cambio consiste en la posibilidad de utilizar el calendario para cargar cada uno de los datos de la fecha en un campo de texto independiente. Asímismo, he decidido eliminar ciertos estilos que se aplicaban desde el propio script para que todo lo referente a la presentación sea una tarea de CSS.</p>
<p>Espero vuestro feed-back.</p>
<a href='http://www.niquelao.net/accesibilidad/2007/04/04/actualizacion-de-acc_calendar/' class='retweet ' startCount = '0'>Actualización de acc_calendar</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/accesibilidad/2007/04/04/actualizacion-de-acc_calendar/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>acc_calendar v1.1</title>
		<link>http://www.niquelao.net/accesibilidad/2007/03/12/acc_calendar-v11/</link>
		<comments>http://www.niquelao.net/accesibilidad/2007/03/12/acc_calendar-v11/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 17:56:08 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Accesibilidad]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/accesibilidad/2007/03/13/acc_calendar-v11/</guid>
		<description><![CDATA[Hasta el ahora, el script funcionaba ejecutándose al cargar el documento. El problema surgía cuando de forma dinámica, como por ejemplo con el uso de Ajax, se introducían nuevos campos en los que se quería utilizar el calendario. Como se crean después de la carga del contenido, estos no cargarían los enlaces para generarlo. He [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta el ahora, el script funcionaba ejecutándose al cargar el documento. El problema surgía cuando de forma dinámica, como por ejemplo con el uso de <strong>Ajax</strong>, se introducían nuevos campos en los que se quería utilizar el calendario. Como se crean después de la carga del contenido, estos no cargarían los enlaces para generarlo. He introducido un cambio para que esto quede solventado.</p>
<p><span id="more-59"></span></p>
<p>El nuevo script tiene una pequeña modificación tal que si en cualquier momento se introducen nuevos campos de texto bastará con llamar posteriormente a la función <code>cargaLinks()</code> para que todo funcione como se desea.</p>
<p>Se puede acceder al artículo completo del calendario (con la revisión incluida) desde <a href="http://www.niquelao.net/acc_calendar-calendario-accesible-en-javascript-innecesario-pero-util/">acc_calendar v1.1</a> o desde el enlace permanente del área de Recursos de la página principal.</p>
<p><strong>nota:</strong> Lo que no podemos olvidar es que para que los nuevos <code>input</code> asocien el enlace para la apertura del calendario tendrán que poseer las clases ya indicadas en el anterior artículo.</p>
<a href='http://www.niquelao.net/accesibilidad/2007/03/12/acc_calendar-v11/' class='retweet ' startCount = '0'>acc_calendar v1.1</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/accesibilidad/2007/03/12/acc_calendar-v11/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Calendario accesible en javascript (innecesario pero útil)</title>
		<link>http://www.niquelao.net/accesibilidad/2007/02/11/acc_calendar-calendario-en-javascript-innecesario-pero-util/</link>
		<comments>http://www.niquelao.net/accesibilidad/2007/02/11/acc_calendar-calendario-en-javascript-innecesario-pero-util/#comments</comments>
		<pubDate>Sun, 11 Feb 2007 10:22:02 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Accesibilidad]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/accesibilidad/2007/02/11/acc_calendar-calendario-en-javascript-innecesario-pero-util/</guid>
		<description><![CDATA[En los campos de formulario en los que se tiene que introducir una fecha, de cara a mejorar la experiencia de usuario, y a la par que se aumenta el control en el formato de los datos, se puede incluir un calendario mediante javascript. Lo se, palabra maldita, aunque si se hace con cuidado y [...]]]></description>
			<content:encoded><![CDATA[<p>En los campos de formulario en los que se tiene que introducir una fecha, de cara a mejorar la experiencia de usuario, y a la par que se aumenta el control en el formato de los datos, se puede incluir un calendario mediante javascript. Lo se, <strong>palabra maldita</strong>, aunque si se hace con cuidado y control, no tiene por qué tener implicaciones negativas en cuanto a estándares y accesibilidad.</p>
<p><span id="more-58"></span></p>
<h3>Objetivos</h3>
<p>En principio he establecido dos objetivos principales, que más que objetivos han sido pautas de trabajo a la hora de construirlo:</p>
<ul>
<li><strong>Que sea accesible y no intrusivo.</strong> Evidentemente, en ausencia de soporte para javascript no se ofrece la opción de desplegar el calendario, pero, si hay soporte…  ¿por qué no hacer que el contenido generado sea accesible y utilizable?</li>
<li><strong>Que sea fácil de implementar y utilizar.</strong> He buscado una forma tal los programadores que deseen implementarlo en sus páginas web no requieran de introducir código adicional. Al igual que en CSS se utilizan diversos tipos de selectores (de elementos, id, clases,…) para asociar estilos a las diferentes partes de nuestros documentos, ¿por qué no utilizar lo mismo para asociar comportamientos?</li>
</ul>
<p>Además, como objetivos secundarios están: optimizar, generalizar, internacionalizar,… (siendo realista, tuve que eliminar los objetivos de ligar y el de ganar dinero.)</p>
<h3>El ejemplo</h3>
<p>Para comprobar su funcionamiento, podéis <a href="http://www.niquelao.net/acc_calendar-calendario-accesible-en-javascript-innecesario-pero-util" title="ejemplo de funcionamiento e implantación">acceder a un ejemplo</a> y <a href="http://niquelao.net/wp-content/uploads/2007/07/acc_calendar/acc_calendar.zip" title="descargar del ejemplo en formato comprimido zip">descargarlo</a>.</p>
<h3>Incluyéndolo en nuestros documentos</h3>
<p>La inclusión del calendario en nuestro documento es tan sencillo como incluir el elemento <code>script</code> correspondiente en el <code>head</code>:</p>
<p class="ejemplo">
<pre>&lt;script type="text/javascript" src="acc_calendar/acc_calendar.js"&gt;&lt;/script&gt;</pre>
<p>El calendario se cargará para cualquier campo de texto que lleve incluida la clase “<code>fecha</code>“. El formato de la fecha se introduce en la primera línea del script. Así, si por ejemplo se desea que la fecha siga el orden día/mes/año, no incluyendo un 0 delante del día cuando esté formada por un dígito, e incluyéndolo en el mes cuando sea necesario:</p>
<p class="ejemplo">
<pre>var formato = 'd/mm/y';</pre>
<p>Para conseguir mostrar el calendario junto a un campo de texto, este deberá llevar la clase “fecha”. Además, todos los posibles parámetros se introducen como clases. La lista completa es la siguiente:</p>
<ul>
<li>Cargar calendario (requerido): <code>fecha</code></li>
<li>Fechas previas a hoy: <code>prev</code></li>
<li>Fechas posteriores a hoy: <code>post</code></li>
<li>Rango de años: <code>rangX</code> (siendo X el número de años)</li>
<li>No se incluye el día actual: <code>todnact</code></li>
</ul>
<h3>Ventajas</h3>
<p>Entre las ventajas que se le pueden atribuir tenemos:</p>
<ul>
<li>Fácil de usar e implementar.</li>
<li>No es intrusivo.</li>
<li>El código y el contenido que se genera es accesible (marcado, organización, contenido,…) y es utilizable mediante el uso de ayudas técnicas (lector de pantalla,…). En este punto se ha tenido en cuenta en qué lugar recae el foco tanto al mostrarse como durante el funcionamiento y al desaparecer. Así, cuando se muestra, el foco recae directamente sobre el selector de años, siguiendo un orden lógico al tabular desde él, y cuando se cierra el calendario (mediante el enlace de cierre o tras haber seleccionado una fecha) el foco recae sobre el campo de texto al que se le había asociado.</li>
<li>Se facilita la navegación por el mismo independientemente del dispositivo. Se puede navegar utilizando cualquiera de los dispositivos con los que podamos navegar por la web.</li>
<li>Sus parámetros son fácilmente configurables y su llamada muy simple (mediante el uso de nombres de clase).</li>
<li>El idioma lo toma directamente del documento padre, pudiendo añadir traducciones nuevas al código. En el caso de no estar declarado el idimoa en el documento (cosa que no debe ocurrir), el español será el que se utilice por defecto. Actualmente, además del español incluye el inglés. Adicionalmente se ha hecho que reconozca si es inglés americano, no porque vaya a cambiar el contenido, sino para cambiar la disposición de los días de la semana (el domingo se coloca primero).</li>
<li>Los estilos aplicados al calendario se incluyen mediante una CSS enlazada por medio del script, con lo que en ausencia de soporte para este, se optimiza la descarga del documento al no llamarse a dicha hoja de estilos.</li>
<li>Se han incluido clases de tal manera que se puedan aplicar estilos sobre cualquiera de las celdas de la tabla (días activos, días no activos, día actual), así como estilos específicos para los sábados o domingos.</li>
</ul>
<h3>Código generado</h3>
<p>A continuación incluyo parte del código generado por el script. Como se puede observar (y como ya he dicho) se incluyen nombres de clase e id para poder controlar la maquetación mediante la hoja de estilos.</p>
<pre>&lt;a title="Desplegar el calendario para seleccionar una fecha" href="#" class="enl_cal"&gt;
	&lt;img alt="" src="acc_calendar/acc_calendar.gif" /&gt;
&lt;/a&gt;
&lt;div id="calendar"&gt;
	&lt;label id="label_year" for="nav_year_select"&gt;Año
		&lt;select id="nav_year_select"&gt;
			...
			&lt;option&gt;1987&lt;/option&gt;
			&lt;option selected="selected"&gt;1988&lt;/option&gt;
			...
		&lt;/select&gt;
	&lt;/label&gt;
	&lt;label id="label_Meses" for="nav_mes_select"&gt;Mes
		&lt;select id="nav_mes_select"&gt;
			&lt;option selected="selected"&gt;Enero&lt;/option&gt;
			&lt;option&gt;Febrero&lt;/option&gt;
			&lt;option&gt;Marzo&lt;/option&gt;
			...
		&lt;/select&gt;
	&lt;/label&gt;
	&lt;table summary="Calendario con los días disponibles de Enero de 2007" id="calendario"&gt;
		&lt;caption id="caption"&gt;Enero 2007&lt;/caption&gt;
		&lt;colgroup span="5"&gt;&lt;/colgroup&gt;
		&lt;colgroup span="2"&gt;&lt;/colgroup&gt;
		&lt;thead&gt;
			&lt;tr&gt;
				&lt;th scope="col"&gt;&lt;abbr title="Lunes"&gt;Lun&lt;/abbr&gt;&lt;/th&gt;
				&lt;th scope="col"&gt;&lt;abbr title="Martes"&gt;Mar&lt;/abbr&gt;&lt;/th&gt;
				...
			&lt;/tr&gt;
		&lt;/thead&gt;
		&lt;tbody id="tbody"&gt;
			&lt;tr&gt;
				&lt;td class="act"&gt;
					&lt;a title="Seleccione esta fecha" href="#"&gt;1&lt;/a&gt;
				&lt;/td&gt;
				&lt;td class="act"&gt;
					&lt;a title="Seleccione esta fecha" href="#"&gt;2&lt;/a&gt;
				&lt;/td&gt;
				...
			&lt;/tr&gt;
			&lt;tr&gt;
				...
				&lt;td class="inact"&gt;24&lt;/td&gt;
				&lt;td class="inact"&gt;25&lt;/td&gt;
				...
			&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
	&lt;ul id="nav_mes"&gt;
		&lt;li&gt;
			&lt;a href="#"&gt;Diciembre&lt;/a&gt;
		&lt;/li&gt;
		&lt;li class="post"&gt;
			&lt;a href="#"&gt;Febrero&lt;/a&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;ul id="nav_year"&gt;
		&lt;li&gt;
			&lt;a href="#" title="Ir al año"&gt;2004&lt;/a&gt;
		&lt;/li&gt;
		&lt;li class="post"&gt;
			&lt;a href="#" title="Ir al año"&gt;2006&lt;/a&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;div id="close_it"&gt;
		&lt;a href="#"&gt;Cerrar calendario&lt;/a&gt;
	&lt;/div&gt;
&lt;/div&gt;</pre>
<h3>Conclusión</h3>
<p>A modo de cierre… ¿qué se podría decir de este calendario?…  pues que “<strong>es innecesario…   pero útil</strong>” y que “<strong>no tiene implicaciones negativas en términos de accesibilidad</strong>“.</p>
<p>…por cierto ¿qué día es hoy?</p>
<a href='http://www.niquelao.net/accesibilidad/2007/02/11/acc_calendar-calendario-en-javascript-innecesario-pero-util/' class='retweet ' startCount = '0'>Calendario accesible en javascript (innecesario pero útil)</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/accesibilidad/2007/02/11/acc_calendar-calendario-en-javascript-innecesario-pero-util/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Y más formularios&#8230;  jarl!</title>
		<link>http://www.niquelao.net/accesibilidad/2007/01/02/y-mas-formularios-jarl/</link>
		<comments>http://www.niquelao.net/accesibilidad/2007/01/02/y-mas-formularios-jarl/#comments</comments>
		<pubDate>Tue, 02 Jan 2007 19:27:48 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Accesibilidad]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/accesibilidad/2007/01/02/y-mas-formularios-jarl/</guid>
		<description><![CDATA[Tras la ya extensa saga &#8220;Retocando Formularios&#8220;, muchos pensaron (bueno, presuponiendo tanto lo de &#8220;muchos&#8221; como su capacidad para pensar) que no volvería a tratar sobre ellos&#8230; ¡Pues va a ser que no! He vuelto para tratar de mejorarlo, pero en esta ocasión desde el punto de vista de la accesibilidad.

A las funcionalidades que introducían [...]]]></description>
			<content:encoded><![CDATA[<p>Tras la ya extensa saga &#8220;<strong>Retocando Formularios</strong>&#8220;, muchos pensaron (bueno, presuponiendo tanto lo de &#8220;muchos&#8221; como su capacidad para pensar) que no volvería a tratar sobre ellos&#8230; <strong>¡Pues va a ser que no!</strong> He vuelto para tratar de mejorarlo, pero en esta ocasión desde el punto de vista de la accesibilidad.</p>
<p><span id="more-55"></span></p>
<p>A las funcionalidades que introducían los anteriores scripts le he añadido la capacidad de reconocer la agrupación de campos mediante el elemento <a href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.10" title="enlace externo" xml:lang="en" lang="en">fieldset</a>, y todo con la finalidad de mejorar la experiencia de usuario y la accesibilidad. Este elemento tiene como finalidad el agrupar campos en base al tipo de datos a introducir (ej. datos personales, datos bancarios, datos académicos, etc), mejorando la estructura y la accesibilidad del conjunto. Al fieldset se le añade el elemento <a href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.10" title="enlace externo" xml:lang="en" lang="en">legend</a> que funciona a modo de encabezado de los datos agrupados.</p>
<h3>&#8230;y ¿para qué?</h3>
<p>La idea me surgió tras ver horrorizado un inmenso formulario con multitud de campos obligatorios (y no voy a decir donde&#8230;). Cuando no se rellenan estos, la lista con los errores se vuelve <strong>larguíííííííííísima</strong>, con lo que resulta muy incomodo de leer, difícil de comprender e incluso estéticamente horrible.</p>
<p>Si los campos de formulario van agrupados para facilitar su comprensión, ¿por qué no agrupar los errores siguiendo el mismo patrón?</p>
<p>Para el funcionamiento del script no hace falta la agrupación, pero bueno&#8230;   siempre es positivo tenerla presente y utilizarla.</p>
<h3>La prueba</h3>
<p>Como siempre, podéis acceder al <a href="http://www.niquelao.net/wp-content/uploads/2007/1/formulario_IV/index.html">ejemplo de uso</a> o incluso <a href="http://www.niquelao.net/wp-content/uploads/2007/1/formulario_IV/formulario_IV.zip" title="archivo comprimido en formato zip">descargarlo directamente</a>.</p>
<p>Como se puede observar, los errores siguen mostrándose mediante una lista. No obstante, en este caso se crea una lista anidada para tratar de agruparlos y conseguir esa mejora en estructura antes mencionada.</p>
<h3>&#8230;y todo esto se relaciona con</h3>
<ul>
<li><a href="http://www.niquelao.net/javascript/2006/12/17/retocando-formularios-episodio-3-el-retorno/">Retocando Formularios, Episodio III (”El Retorno”)</a></li>
<li><a href="http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/">Retocando Formularios (Episodio II)</a></li>
<li><a href="http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/">Retocando Formularios (episodio I)</a></li>
</ul>
<p><strong>Importante:</strong> Quiero recordar que el uso de javascript no debe tener implicaciones negativas en la accesibilidad. Bien utilizado, y con todas las consideraciones hacia el usuario, mejora su experiencia.</p>
<a href='http://www.niquelao.net/accesibilidad/2007/01/02/y-mas-formularios-jarl/' class='retweet ' startCount = '0'>Y más formularios&#8230;  jarl!</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/accesibilidad/2007/01/02/y-mas-formularios-jarl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Retocando Formularios, Episodio III (&#8220;El Retorno&#8221;)</title>
		<link>http://www.niquelao.net/javascript/2006/12/17/retocando-formularios-episodio-3-el-retorno/</link>
		<comments>http://www.niquelao.net/javascript/2006/12/17/retocando-formularios-episodio-3-el-retorno/#comments</comments>
		<pubDate>Sun, 17 Dec 2006 17:06:02 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/css/2006/12/17/retocando-formularios-episodio-3-el-retorno/</guid>
		<description><![CDATA[Después de tanto tiempo, quizás alguno de los tres (incluyendote a ti) lectores de niquelao pensaba que no volveríamos a escribir sobre los formularios&#8230;  evidentemente no nos conoce lo suficiente.
El episodio de hoy gira en torno a la idea de conseguir la validación del formato en el que han sido introducidos los datos en [...]]]></description>
			<content:encoded><![CDATA[<p>Después de tanto tiempo, quizás alguno de los tres (incluyendote a ti) lectores de <strong>niquelao</strong> pensaba que no volveríamos a escribir sobre los formularios&#8230;  evidentemente no nos conoce lo suficiente.</p>
<p>El episodio de hoy gira en torno a la idea de conseguir la validación del formato en el que han sido introducidos los datos en los campos de un formulario (o más de uno en el mismo documento, evidentemente).<span id="more-51"></span></p>
<h3>Planteamiento</h3>
<p>Conseguir un script de cliente con las siguientes características:</p>
<ul>
<li>Reconocer el formato (tipo de dato y/o longitud) con el que hemos introducido los datos en el formulario</li>
<li>Reutilizable para más de un formulario por documento</li>
<li>No intrusivo</li>
<li>Sin modificar (o con una mínima modificación) el código de la página</li>
<li>Accesible para las ayudas técnicas tales como los lectores de pantalla</li>
</ul>
<h3>En episodios anteriores de &#8220;Retocando formularos&#8221;&#8230;</h3>
<p>A las funcionalidades desarrolladas previamente en los episodios anteriores (<a href="http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/">Episodio I</a> y <a href="http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/">Episodio II</a>)&#8230;</p>
<ul>
<li>Limpiar de caracteres introducidos por defecto y restaurarlos en su caso</li>
<li>Comprobar si se han rellenado los campos obligatorios y devolver el error correspondiente si es necesario</li>
<li>El script aplica su proceso de reconocimiento de la misma manera que lo haría un usuario (leyendo la información de cumplimentación del formulario (aportada por ejemplo en el propio <code>label</code> del campo)</li>
<li>Modificación mínima o nula del marcado</li>
</ul>
<p>&#8230;se han añadido:</p>
<ul>
<li>Comprobación de que se ha introducido un correo electrónico válido</li>
<li>Comprobación de que se ha introducido un mínimo de caracteres</li>
<li>Comprobación de que se ha introducido un número si es este el único formato posible</li>
</ul>
<h3>El script</h3>
<p>Podéis probar el funcionamiento del script directamente en la <a href="http://www.niquelao.net/wp-content/uploads/2006/12/formulario_III/index.html">página de ejemplo</a>. En esta se han incluido tres formularios para demostrar que es reutilizable y no se interfieren entre ellos.</p>
<p>Si tras probarlo, os gusta tanto como para querer utilizarlo, o sois de los que quieren comprobar lo bien (o mal) que los demás hacen las cosas para sacarle pegas y criticar&#8230;  (tras esto último, debería haber unos segundos de silencio) &#8230;podéis <a href="http://www.niquelao.net/wp-content/uploads/2006/12/formulario_III/formularioIII.zip" title="descarga en formato comprimido zip">descargarlo directamente</a>.</p>
<h3>¿Cómo se utiliza?</h3>
<p><strong>nota I:</strong> Antes de decir cómo se utiliza, es súmamente importante recordar que dado que <strong>esta validación se hace en el lado del cliente</strong>, <strong>siempre va a ser necesario hacer una validación en el servidor</strong> (no hacerlo os puede restar puntos&#8230;  ¿verdad Andrés?). La validación del lado de cliente nunca debería sustituir a la del servidor. Lo que aporta es una mejor experiencia de usuario al no implicar las demoras que el envío, comprobación y devolución de información llevan asociados.</p>
<p><strong>nota II:</strong> Recordaros también que siempre se debe informar al usuario acerca de cómo ha de rellenar el formulario, y esto incluye la información de campos obligatorios y de los formatos de datos a introducir. Esta información debe presentarse antes del propio formulario y no se debe dar por sentado que el usuario la va a entender tan bien como la entendería un experto.</p>
<p>Retomando el tema introducido por el último encabezado&#8230; al comienzo del script estan declaradas unas variables. Estas son las que incluyen el texto que posteriormente se va a buscar en los <code>label</code> o en los controles de formulario y que servirá para identificar el formato</p>
<pre>var for_req = '*'; // identifica el campo obligatorio
var for_mail = 'mail'; // identifica un campo como correo electrónico
var for_num = 'numero'; // identifica un campo como numérico</pre>
<p>Los valores son los que se emplearán en el propio formulario y podrán incluirse en el contenido o la clase del elemento <code>label</code> o en la clase del control al que esta se asocie. <acronym title="ejemplo">Ej.</acronym>:</p>
<pre>&lt;label for="nombre"&gt;
    Nombre *
    &lt;input type="text" name="nombre" id="nombre" /&gt;
&lt;/label&gt;
&lt;label for="cp" class="numero"&gt;
    Código Postal
    &lt;input type="text" name="cp" id="cp" /&gt;
&lt;/label&gt;
&lt;label for="correo"&gt;
    E-mail *
    &lt;input type="text" name="correo" id="correo" /&gt;
&lt;/label&gt;</pre>
<p>También se ha añadido una variable con el texto que determinará si un dato a introducir en el formulario debe tener una longitud mínima:</p>
<pre>var for_min = 'minimo';</pre>
<p>Este texto se deberá incluir en la clase del <code>label</code> o del campo, indicando inmediatamente detrás de él, y mediante el/los dígitos correspondiente/s, su valor. <acronym title="ejemplo">Ej.</acronym>:</p>
<pre>&lt;label for="tel"&gt;
    Teléfono
    &lt;input type="text" class="minimo9 numero" name="tel" id="tel" /&gt;
&lt;/label&gt;</pre>
<p>Como se muestra en este último ejemplo, el sistema permite combinar más de una validación (a excepción de determinadas combinaciones ilógicas tales como el correo electrónico y el formato numérico).</p>
<p>A continuación, en el script están presentes dos variables que servirán para aplicar un estilo a los <code>label</code> y campos cuando estos no respeten las condiciones adecuadas de formato y obligatoriedad para su envío:</p>
<pre>var labelerror = 'error';
var fielderror = 'error';</pre>
<p>Estos valores son los nombres de las clases sobre las que declararemos estilos en la CSS. En este punto es necesario recordar  que con la ejecución del script no se ven alteradas ni la cascada ni la especificidad, con lo que deberemos tenerlo presente al establecer nuestras reglas en la hoja de estilos.</p>
<p>Es importante también tener en cuenta que deberemos aplicar un identificador al elemento <code>form</code>.</p>
<h3>Rizando el rizo</h3>
<p>Al igual que en el episodio anterior, cuando se crea el contenido que indica el/los error/es cometidos, el foco se traslada al comienzo de este. Esto se pensó teniendo en cuenta que tras pulsar el botón de envío, si ocurre un error, la información de este debería ser lo primero que se mostrase. Un usuario de navegador gráfico no tendría mucho problema en ello (generalmente), pero el usuario que utilizase un lector de pantalla, sin ese cambio del foco, continuaría leyendo el contenido que hay después del botón (¿lo cogéis?).</p>
<p>Además, el script trata de adaptar el lenguaje empleado para la información del error de tal manera que diferencie el singular del plural en función del número de errores encontrados, e incluso si lo que se introducen son caracteres generales o dígitos (en el caso de que el formato sea numérico). También se trataron de agrupar los errores sobre el mismo campo agrupando así la información y facilitando su comprensión y lectura. Puede parecer una forma de rizar el rizo un poco exagerada, pero&#8230; ¿por qué no utilizar correctamente el lenguaje?</p>
<h3>Optimizando</h3>
<p>Personalmente me gusta optimizar los códigos y eliminar lo que no sea necesario. En el script se incluyen determinados fragmentos que podrían ser eliminados, tales como la búsqueda dentro del contenido del <code>label</code>, de su clase y de la clase del campo al que este se asocia, del texto para comprobar si lo introducido sigue un formato adecuado. Si siempre introducimos el mentado texto en la clase del <code>label</code>, las demás búsquedas podrían eliminarse.</p>
<h3>Un cambio de última hora (24 de diciembre de 2006)</h3>
<p>Haciendo pruebas me di cuenta de que no había tenido en consideración que dentro del <code>label</code> pudiera haber un elemento de línea (tipo <code>strong</code>, <code>span</code>,&#8230;) o incluso que pudiera haber <a href="http://www.w3.org/TR/WCAG10/" title="enlace externo" xml:lang="en" lang="en">asociación implícita</a> con el control de formulario al que se asocia. Esto originaría problemas, pues al crearse la lista de errores, se mostrarían las etiquetas correspondientes o el propio contenido del campo. Para evitarlo acabo de incluir en el <em>script</em> una función que extrae el contenido de las etiquetas a la par que las elimina, y además he añadido lo necesario para no mostrar el contenido del control de formulario.</p>
<p>Bueno, lo dejaré ya porque son las 14:19 del día de NocheBuena. Supongo que no es el momento de estar pensando en formularios y si en los seres querídos&#8230;  así que <strong>Feliz Navidad a todos</strong>.</p>
<a href='http://www.niquelao.net/javascript/2006/12/17/retocando-formularios-episodio-3-el-retorno/' class='retweet ' startCount = '0'>Retocando Formularios, Episodio III (&#8220;El Retorno&#8221;)</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/javascript/2006/12/17/retocando-formularios-episodio-3-el-retorno/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Retocando Formularios (Episodio II)</title>
		<link>http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/</link>
		<comments>http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/#comments</comments>
		<pubDate>Thu, 14 Sep 2006 16:15:48 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/</guid>
		<description><![CDATA[Siguiendo con el patrón que nos marca este mes de frenética actividad &#8220;blogera post-vacacional&#8221;, ha llegado el momento de acudir al Episodio II de la archiconocida saga &#8220;Retocando Formularios&#8221;.
El episodio de hoy nos presenta un script que comprueba antes del envio del formulario si se han rellenado todos los campos obligatorios. En caso negativo&#8230;  [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con el patrón que nos marca este mes de frenética actividad &#8220;blogera post-vacacional&#8221;, ha llegado el momento de acudir al <strong>Episodio II</strong> de la archiconocida saga <strong>&#8220;Retocando Formularios&#8221;</strong>.</p>
<p>El episodio de hoy nos presenta un script que comprueba antes del envio del formulario si se han rellenado todos los campos obligatorios. En caso negativo&#8230;   hace cosas muy chulas&#8230;<span id="more-32"></span></p>
<h3>Planteamiento</h3>
<p>Crear un script que reconozca los campos de formulario de obligada cumplimentación de la misma manera que lo reconocería el propio usuario (por ejemplo, lo del típico asterisco &#8220;*&#8221;).</p>
<h3>El desarrollo</h3>
<p>Partiendo de la idea de no aumentar el marcado del formulario con clases, identificadores, elementos,&#8230; que señalen al script lo que es obligatorio y de que el marcado utilizado es correcto y accesible (<a href="http://www.w3.org/TR/WAI-WEBCONTENT-TECHS/#tech-associate-labels" class="externo" hreflang="en">uso de elementos label asociados correctamente</a>), se ha desarrollado un script que busca todos los label y reconoce en ellos la presencia del <strong>*</strong> (mundialmente conocido como <strong>*</strong> o &#8220;punto despeinado&#8221;).</p>
<p>El valor inicial de los campos obligatorios se almacena en una matriz. Esto permitirá comprobar posteriormente, antes del envío, si se ha modificado o no. También se almacenan la clase que tienen aplicados tanto el label como el campo obligatorio asociado. Esto último se hace para aplicar o restaurar (según sea el caso) una clase un otra en función de que la validación de como resultado el que uno de los campos no ha sido cumplimentado.</p>
<p>El script se ha creado teniendo en consideración la posible presencia de más de un formulario en la página (por ejemplo: un formulario de búsqueda en la barra de utilidades de la sección &#8220;formulario de contacto&#8221;).</p>
<p>Cuando se pulsa el botón de envío se realiza la comprobación. Si esta es positiva, el formulario se envía (lógicamente o de <a href="http://www.cervantes.es/Internet/gab/biografia_cervantes/glosario/htmlssss/htm/2776.htm" class="externo" title="enlace externo">perogrullo</a>). En el caso de ser negativa, se crea un párrafo con el mensaje que nosotros queramos y una lista con los campos que no han sido rellenados. Asimismo (casi pongo lo escribo como siempre: Así mismo), se aplica una clase al label y otra al campo obligatorio que lleva asociado un estilo declarado en la CSS.</p>
<p>Adicionalmente se ha añadido el comportamiento ya explicado en el <a href="http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/">Episodio I</a> y que consiste en limpiar/restaurar los valores iniciales de los campos.</p>
<h4>El ejemplo</h4>
<p>En el caso de que os aburra tanta palabrería, podéis entreteneros con el <a href="http://www.niquelao.net/wp-content/uploads/2006/09/formulariosII/index.html">ejemplo de funcionamiento</a> que hemos desarrollado para este caso, o incluso <a href="http://www.niquelao.net/wp-content/uploads/2006/09/formulariosII/form.zip" title="descarga del archivo comprimido">podéis descargarlo</a> (y sacarle &#8220;pegas&#8221;).</p>
<h3>Problemas:</h3>
<p><del>El resultado negativo de la validación crea contenido que se coloca al principio del formulario. Si estamos usando un lector de pantalla, este no lo leerá si no le mandamos para allí.</del> <strong>Solucionado</strong>: Tras la creación de los elementos que avisan del error, se provoca un salto al inicio de estos (aprovechando la &#8220;id&#8221; del párrafo), con lo que lo siguiente que se leerá será el propio aviso seguido del formulario.</p>
<p><del>A pesar de su fama, no quiero utilizar el <strong>*</strong>.</del> <strong>Solucionado</strong>: El script reconoce la presencia de lo que nosotros le indiquemos que busque. Además, se puede hacer que compruebe si se ha aplicado una clase concreta a los campos o a los label (muchas veces se destacan estos aplicando un estilo).</p>
<p>Supongo que habrá más problemas, por lo que si a alguien se le ocurre alguno&#8230;  que nos lo diga. Mientras tanto seguiremos pensado que hacemos las cosas REMATADAMENTE bien&#8230;</p>
<h3>Concluyendo</h3>
<p>A partir de ahora, cuando se quiera crear un formulario y validar los campos obligatorios, no hará falta cambiar el marcado ni añadir &#8220;cosas raras&#8221;. Únicamente será necesario hacer un formulario correcto (según los estádares W3C) y asociarlo el script.</p>
<h3>Postdata</h3>
<p>Se me olvidaba decir que la accesibilidad no está comprometida si no funciona javascript.</p>
<p>Por cierto, la validación del formulario siempre se debe hacer también del lado del servidor (que no se os olvide).</p>
<a href='http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/' class='retweet ' startCount = '0'>Retocando Formularios (Episodio II)</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/javascript/2006/09/14/retocando-formularios-ii/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Retocando Formularios (episodio I)</title>
		<link>http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/</link>
		<comments>http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/#comments</comments>
		<pubDate>Tue, 05 Sep 2006 04:49:25 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/css/2006/09/05/retocando-formularios-i/</guid>
		<description><![CDATA[En numerosas ocasiones nos encontramos con campos de formulario que inicialmente incluyen un texto, bien sea con el objetivo de conseguir un nivel de accesibilidad AAA al pie de la letra (punto de verificación 10.4 de las WCAG 1.0), bien por ofrecer una ayuda al usuario indicándole el tipo de contenido a introducir.

Asimismo, en no [...]]]></description>
			<content:encoded><![CDATA[<p>En numerosas ocasiones nos encontramos con campos de formulario que inicialmente incluyen un texto, bien sea con el objetivo de conseguir un <strong>nivel de accesibilidad AAA</strong> al pie de la letra (<a href="http://www.w3.org/TR/WCAG10/wai-pageauth.html#tech-place-holders" hreflang="en" class="externo">punto de verificación 10.4</a> de las <a href="http://www.w3.org/TR/WCAG10/wai-pageauth.html" hreflang="en" xml:lang="en" class="externo" lang="en"><acronym title="Web Content Accessibility Guidelines">WCAG</acronym> 1.0</a>), bien por ofrecer una ayuda al usuario indicándole el tipo de contenido a introducir.<span id="more-26"></span></p>
<p class="ejemplo"><img src="http://www.niquelao.net/wp-content/uploads/2006/09/formulariosI/1.gif" alt="Campo de texto relleno" class="ejemplo" /></p>
<p>Asimismo, en no menos casos, al recaer el foco sobre el campo en cuestión, el texto que había inicialmente se borra dejándonos escribir lo que deseemos. La cuestión es que si no escribimos nada&#8230;   ¿por qué no hacer que vuelva el texto inicial?. Tal vez luego quiera volver a ese campo de formulario para escribir algo.</p>
<p class="ejemplo"><img src="http://www.niquelao.net/wp-content/uploads/2006/09/formulariosI/2.gif" alt="Comportamiento al recaer el foco sobre el campo de texto (se vacía)" class="ejemplo" /></p>
<h3>Problema</h3>
<p>Queremos restaurar el texto original de los campos del formulario.</p>
<h3>Solución</h3>
<p>Un script que guarde en una matriz dichos valores y que, al perder el foco el campo de formulario, permita restaurarlos.</p>
<h3>El script</h3>
<p>El script se detalla a continuación, pudiendo acceder al <a href="http://www.niquelao.net/wp-content/uploads/2006/09/formulariosI/simple.html">ejemplo demostrativo</a> o incluso <a href="http://www.niquelao.net/wp-content/uploads/2006/09/formulariosI/formulario_I.zip" title="descarga del archivo comprimido">descargarlo</a>.</p>
<p>Para poder utilizarlo, únicamente hay que enlazarlo en la cabecera del documento (<code>&lt;script type="text/javascript" src="ruta/simple.js"&gt;&lt;/script&gt;</code>). Además, la ausencia de funcionalidad del mismo a causa de que el navegador no lo soporte no implica pérdida alguna ni disminución de la accesibilidad para el usuario.</p>
<p>Lo primero es revisar todos los campos que vamos a controlar mediante este script:</p>
<pre>var inputs = document.getElementsByTagName("input");
var textareas =  document.getElementsByTagName("textarea");</pre>
<p>Guardamos los valores iniciales:</p>
<pre>var valorinicial = new Array();</pre>
<p>Asignamos a los campos en los que se puede introducir texto las funciones necesarias para <strong>vaciar su contenido o restaurarlo</strong> al original según las circunstancias:</p>
<pre>function formulario() {
  for (var i = 0; i &lt; inputs.length; i++) {
    if((inputs[i].type == "text") || (inputs[i].type == "password")) {
      valorinicial[inputs[i].id]=inputs[i].value;
       inputs[i].onfocus = function() {vacia(this.id,this.value)}
      inputs[i].onblur = function() {restaura(this.id,this.value)}
    }
  }
  for (var i = 0; i &lt; textareas.length; i++) {
    valorinicial[textareas[i].id]=textareas[i].value;
    textareas[i].onfocus = function() {vacia(this.id,this.value)}
    textareas[i].onblur = function() {restaura(this.id,this.value)}
  }
}</pre>
<p>Vaciamos los campos únicamente cuando su contenido sea el mismo que el inicial:</p>
<pre>function vacia(id,valor){
  var targetElement = document.getElementById(id);
  var tipo = targetElement.type;
  switch ( tipo ) {
    case "text":
      if (valorinicial[id] == valor)
        targetElement.value = "";
      break
    case "password":
      if (valorinicial[id] == valor)
        targetElement.value = "";
      break
    case "textarea":
      if (valorinicial[id] == valor) {
        targetElement.innerHTML = "";
        targetElement.value = "";
      }
    break
  }
}</pre>
<p>Restauramos el contenido de los campos en el caso de no haber introducido nada o únicamente espacios en blanco (y/o retornos de carro en los textarea):</p>
<pre>function restaura(id){
  var targetElement = document.getElementById(id);
  var tipo = targetElement.type;
  switch ( tipo ) {
    case "text":
      if (targetElement.value.replace(/ /g, '') == '')
        targetElement.value = valorinicial[id];
      break
    case "password":
      if (targetElement.value.replace(/ /g, '') == '')
        targetElement.value = valorinicial[id];
      break
    case "textarea":
      revisa = targetElement.value.replace(/ /g, '');
      // Eliminamos saltos de línea y tabulaciones
      revisa = revisa.replace(/n/g, '')
      revisa = revisa.replace(/t/g, '')
      revisa = revisa.replace(/r/g, '')
      if (revisa == '') {
        targetElement.innerHTML = valorinicial[id];
        targetElement.value = valorinicial[id];
      }
      break
  }
}</pre>
<p>&#8230;y finalmente cargamos la función:</p>
<pre>window.onload = formulario;</pre>
<a href='http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/' class='retweet ' startCount = '0'>Retocando Formularios (episodio I)</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/javascript/2006/09/05/retocando-formularios-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Identificando tipos de enlace</title>
		<link>http://www.niquelao.net/css/2006/09/03/enlaces-con-estilo/</link>
		<comments>http://www.niquelao.net/css/2006/09/03/enlaces-con-estilo/#comments</comments>
		<pubDate>Sun, 03 Sep 2006 17:40:44 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/javascript/2006/09/03/enlaces-con-estilo/</guid>
		<description><![CDATA[Una buena práctica que afecta positivamente a la accesibilidad y usabilidad de nuestras páginas es la de identificar el tipo de enlaces que tenemos en nuestra web en función de su destino. Para ello, además de las correspondientes medidas a adoptar respecto a temas de accesibilidad, podríamos crear diferencias de estilo mediante la CSS (procurando [...]]]></description>
			<content:encoded><![CDATA[<p>Una buena práctica que <strong>afecta positivamente a la accesibilidad y usabilidad de nuestras páginas</strong> es la de identificar el tipo de enlaces que tenemos en nuestra web en función de su destino. Para ello, además de las correspondientes medidas a adoptar respecto a temas de accesibilidad, podríamos crear diferencias de estilo mediante la <abbr title="Cascading Style Sheets" lang="en">CSS</abbr> (procurando siempre mantener la <strong>consistencia que permita identificar los enlaces como tal</strong>).<span id="more-25"></span> Mediante esta práctica, los usuarios con acceso a los navegadores gráficos podrán reconocer si el documento al que van a acceder es, por ejemplo, un pdf o si el destino se encuentra fuera de nuestro portal.</p>
<h3>Problemas</h3>
<ul>
<li>Tendremos que identificar cada tipo de enlace mediante una clase que permita aplicarle el estilo.</li>
<li>En muchas ocasiones las personas que introducen los enlaces son los responsables del contenido y no tienen acceso a marcar el código.</li>
</ul>
<h3>Solución</h3>
<p>Mediante una sencilla función escrita en javascript, e introducida de forma no intrusiva, podremos identificar el tipo de documento en función del contenido del atributo &#8220;title&#8221; (si está presente) y/o de la extensión del archivo destino.</p>
<p><del>Para</del> <strong>nota</strong>: es una buena práctica el que los editores/responsables de contenido adopten el protocolo común de identificar el tipo de destino del enlace en el atributo &#8220;title&#8221; del mismo, pues la mayor parte de las herramientas de edición permiten su introducción.</p>
<p>Adicionálmente, se le ha añadido al script la funcionalidad de incluir un texto en el atributo &#8220;title&#8221; de aquellos enlaces que no lo posean y que apunten a un documento reconocible por el propio script.</p>
<h3>Enlaces de Ejemplo</h3>
<ul class="lista_normal">
<li><a href="http://www.google.com" title="Enlace externo al buscador">Google</a></li>
<li><a href="http://www.niquelao.net/wp-content/uploads/2006/09/enlaces/ejemplo.pdf" title="Documento en formato pdf">Documento en formato pdf</a></li>
<li> Este enlace no posee atributo &#8220;title&#8221; y con la función se le añade: <a href="http://www.niquelao.net/wp-content/uploads/2006/09/enlaces/ejemplo.doc">Archivo de Word</a></li>
</ul>
<h3>El script</h3>
<p>El script se detalla a continuación y lo puedes <a href="http://www.niquelao.net/wp-content/uploads/2006/09/enlaces/funciones.zip" title="archivo comprimido">descargar directamente</a></p>
<p>Lo primero es declarar un array con el fragmento de texto a introducir por el editor/responsable del contenido y que describe el tipo de destino del enlace:</p>
<pre>var tFormat = ["enlace externo", "formato pdf", "formato word"];</pre>
<p>Declaramos una tipología de enlaces (declarado en el mismo orden que el anterior):</p>
<pre>var Format = ["externo", "pdf", "doc"];</pre>
<p>Declaramos las clases para formatear cada tipo de enlace (declarado en el mismo orden que los anteriores). Estas tendrán su correspondiente estilo en la CSS:</p>
<pre>var classFormat = ["externo", "pdf", "doc"];

function enlaces() {
// Seleccionamos todos los enlaces del documento
 var links = document.getElementsByTagName("a");
 for (var i = 0; i &lt; links.length; i++) {
   // Comprobamos que no son anclas
   if(links[i].href.indexOf(".") &gt; -1) {
     // Comprobamos si tienen atributo "title"
     if(links[i].getAttribute("title")) {
       // Obtenemos el atributo "title" en minúscula
       var title = links[i].getAttribute("title").toLowerCase();
       // Hacemos un bucle que comprueba si en el "title" se
       // encuentra uno de los textos indicados en el array
       // tFormat. Si lo encuentra, le añade la clase
       // declarada en la misma posición que el texto
       // en el array classFormat
       for(var f = 0; f &lt; tFormat.length; f++)
         if(title.indexOf(tFormat[f]) &gt; -1)
           links[i].className += " " + classFormat[f];
     }
     // Dado que no siempre todos los enlaces tienen atributo "title"
     // comprobaremos, por si acaso, el atributo "href" obteniendo
     // la extensión del documento destino y comparándolo
     // con las declaradas en el array Format.
     var ini = links[i].href.length-4;
     var fin = links[i].href.length;
     var wFormat = links[i].href.substring(ini,fin).toLowerCase();
     for(var f = 0; f &lt; Format.length; f++)
       if(wFormat.indexOf(Format[f]) &gt; -1) {
         links[i].className += " " + classFormat[f];
          // Si no tiene el atributo "title" se lo añade
          if(!links[i].getAttribute("title"))
             links[i].setAttribute("title", tFormat[f])
       }

   }
 }
}</pre>
<p>Finalmente cargamos el script:</p>
<pre>window.onload = enlaces;</pre>
<a href='http://www.niquelao.net/css/2006/09/03/enlaces-con-estilo/' class='retweet ' startCount = '0'>Identificando tipos de enlace</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/css/2006/09/03/enlaces-con-estilo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Script para intercambiar css</title>
		<link>http://www.niquelao.net/javascript/2006/07/17/script-para-intercambiar-css/</link>
		<comments>http://www.niquelao.net/javascript/2006/07/17/script-para-intercambiar-css/#comments</comments>
		<pubDate>Mon, 17 Jul 2006 18:25:20 +0000</pubDate>
		<dc:creator>Rumoroso</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.niquelao.net/css/2006/07/17/script-para-intercambiar-css/</guid>
		<description><![CDATA[La idea es tener un script que cambie la hoja de estilos que tenga actualmente asociado el documento por otra alternativa de forma dinámica.
Evidentemente se pueden pensar varias formas para conseguir tal fin. La ventaja que ofrece este sistema es que no inplica la recarga de la página para llevarlo a cabo. Con esto se [...]]]></description>
			<content:encoded><![CDATA[<p>La idea es tener un script que cambie la hoja de estilos que tenga actualmente asociado el documento por otra alternativa de forma dinámica.<span id="more-24"></span></p>
<p>Evidentemente se pueden pensar varias formas para conseguir tal fin. La ventaja que ofrece este sistema es que no inplica la recarga de la página para llevarlo a cabo. Con esto se consigue un efecto sensíblemente más rápido así como la posibilidad de efectuarlo sobre documentos que contengan campos de formulario sin implicar que el usuario pierda los datos introducidos.</p>
<p>Antes de seguir, podéis <a href="http://www.niquelao.net/wp-content/uploads/2006/07/niquelao/" title="ejemplo de documento con enlace que intercambia la hoja de estilos">acceder a un ejemplo</a>.</p>
<p>Este sencillo script se basa en la intervención de dos funciones. Una de ellas es la encargada de sustituir la actual hoja de estilos que tenga el documento asociado. La otra se encarga de generar el enlace necesario para que se ejecute la función anterior. El enlace para la ejecución del cambio se crea mediante un script en lugar de introducirlo en el código por cuestiones de accesibilidad. En el caso de que el navegador no soporte javascript, no se mostrará un enlace sin funcionalidad.</p>
<p>Para nuestro ejemplo hemos desarrollado una de las posibles formas de hacer el intercambio. En este caso se alternan dos hojas de estilo, pero podría hacerse que se sustituya directamente por la que queramos.</p>
<p>La función para cambiar la css:</p>
<pre>function cambiacss(id){
	var targetElement = document.getElementById(id);
	//Se busca el fragmento "-print" que sabemos forma parte
	//del nombre de una de las css y se introduce esa css
	//o la alternativa en función del resultado
	if(targetElement.href.indexOf('-print') == -1) {
		targetElement.href="css/style-print-preview.css"
		return "vista normal";
 	}else{
		targetElement.href="css/style.css";
		return "vista preliminar";
	}
}</pre>
<p>Se le pasa como parámetro la “id” del elemento link desde donde se enlaza la hoja de estilo. En función de cual sea la css que está enlazada se introduce una u otra. Además, la función devuelve el texto que aparecerá en el enlace que la ejecuta. En nuestro ejemplo se utiliza para pasar a mostrar una supuesta vista preliminar del documento actual (es necesario recordar que si esta fuese la supuesta vista de impresión, debería hacerse una css que se asocie al documento mediante un elemento link que incluya el atributo media=&#8221;print&#8221;. Echadle un vistazo al código de este documento para verlo.).</p>
<p>&#8230;y la función que crea el enlace:</p>
<pre>function enlacecss(){
	var pie = document.getElementById("pie");
	parrafo = document.createElement("p");
	parrafo.innerHTML = '&lt;a onkeypress="this.innerHTML=
	cambiacss('hojadeestilo');" onclick="this.innerHTML=
	cambiacss('hojadeestilo');"&gt;Vista Preliminar&lt;/a&gt;';
 	pie.appendChild (parrafo);
}</pre>
<p>Se crea un elemento “p” (párrafo) donde irá nuestro enlace. En el ejemplo se crea como parte del pie del documento. Como contenido del párrafo tendremos el enlace al que le asociamos en los eventos “onclick” y “onkeypress” la función de cambio de css. Finalmente hacemos que el script se ejecute al cargar la página:</p>
<pre>window.onload = enlacecss;</pre>
<p>Bueno, con esto termino, pues además de estar de vacaciones, hoy es mi aniversario de boda y no quiero ni imaginarme lo que puede pasar si mi mujer se entera de que estoy ante el ordenador&#8230;</p>
<a href='http://www.niquelao.net/javascript/2006/07/17/script-para-intercambiar-css/' class='retweet ' startCount = '0'>Script para intercambiar css</a>]]></content:encoded>
			<wfw:commentRss>http://www.niquelao.net/javascript/2006/07/17/script-para-intercambiar-css/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
