<?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>aNieto2K &#187; javascript</title>
	<atom:link href="http://www.anieto2k.com/category/programacion/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.anieto2k.com</link>
	<description>Desarrollo web, Wordpress, y alguna cosilla más</description>
	<lastBuildDate>Sun, 05 Feb 2012 10:15:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Speech Javascript API, habla con las páginas web</title>
		<link>http://www.anieto2k.com/2012/01/08/speech-javascript-api-habla-con-las-paginas-web/</link>
		<comments>http://www.anieto2k.com/2012/01/08/speech-javascript-api-habla-con-las-paginas-web/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 10:20:10 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10277</guid>
		<description><![CDATA[La llegada de Internet a los móvil h a producido una gran serie de cambios en los lenguajes de programación que usamos para crear páginas web, hace unos días vimos como la W3C publicaba el primer borrador para controlar el estado de la batería mediante Javascript. Y ahora os traigo el primer borrador no oficial [...]]]></description>
			<content:encoded><![CDATA[La llegada de Internet a los móvil h a producido una gran serie de cambios en los lenguajes de programación que usamos para crear páginas web, hace unos días vimos como la W3C publicaba <a href="http://www.anieto2k.com/2012/01/05/battery-status-api-controla-la-carga-de-la-bateria-de-tus-usuarios-con-javascript/">el primer borrador para controlar el estado de la batería mediante Javascript</a>. Y ahora os traigo <a href="http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/att-1696/speechapi.html">el primer borrador no oficial de la especificación javascript para dotar de voz y hacer que nuestras páginas nos entiendan</a>.

Se trata de una propuesta por parte del equipo de desarrollo de Google para dotar a los navegadores de herramientas de síntesis y de reconocimiento de voz. Haciendo posible que podamos hablar con páginas web y que estas nos respondan.

<h3>Speech Javascript API</h3>

<p class="center">
<a rel="lightbox" href="http://www.anieto2k.com/wp-content/uploads/2012/01/descarga.png"><img src="http://www.anieto2k.com/wp-content/uploads/2012/01/descarga.png" alt="descarga"/></a><br /><a href="http://www.anieto2k.com/wp-content/uploads/2012/01/descarga.png"><small>(Ver Imagen)</small></a>
</p>

La API se compone de 2 interfaces:
<ul>
	<li><strong>SpeechReco()</strong>, que nos permite grabar al usuario directamente desde el navegador.</li>
	<li><strong>TTS()</strong>, que nos permitirá convertir texto en voz directamente.</li>
</ul>
<h3>Ver código</h3>

Que mejor que un poco de código para hacernos una idea de lo que podría ser adaptar nuestra página a esta nueva tecnología:

<h4>SpeechReco</h4>

<pre><code>&lt;script type="text/javascript"&gt;
    var sr = new SpeechReco(); // Nuevo interface
    sr.onresult = function(event) {
      var q = document.getElementById("q");
      q.value = event.result[0].transcript; // Devolvemos la transcripción del mensaje
      q.form.submit();
    }
  &lt;/script&gt;

  &lt;form action="http://www.example.com/search"&gt;
  &lt;input type="search" id="q" name="q"/&gt;
  &lt;input type="button" value="Speak" onclick="sr.start()"/&gt; // Iniciamos la grabación
  &lt;/form&gt;
</code></pre>

<h4>TTS</h4>

<pre><code>
  &lt;script type="text/javascript"&gt;
     var tts = new TTS(); //Nuevo interface
     function speak(text, lang) {
        tts.text = text; // Indicamos el texto
        tts.lang = lang; // Indicamos el idioma
        tts.play(); // Hacemos hablar a nuestro navegador
     }
     speak("Hello world.", "en-US"); // Hola mundo :D
  &lt;/script&gt;
</code></pre>

No parece muy complicado, ¿no? :D
Esto haría que publicar en tu WordPress pudiera ser una tarea que haces mientras vas al trabajo en coche, por ejemplo :D<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2006/01/11/text-to-speech-o-de-texto-a-voz/" rel="bookmark" title="Permanent Link: Text to speech, o de texto a voz">Text to speech, o de texto a voz</a></li><li><a href="http://www.anieto2k.com/2006/11/16/los-mejores-sitios-sobre-wordpress/" rel="bookmark" title="Permanent Link: Los mejores sitios sobre WordPress">Los mejores sitios sobre WordPress</a></li><li><a href="http://www.anieto2k.com/2007/05/15/acelera-la-velocidad-de-carga-de-tus-paginas/" rel="bookmark" title="Permanent Link: Acelera la velocidad de carga de tus páginas">Acelera la velocidad de carga de tus páginas</a></li><li><a href="http://www.anieto2k.com/2007/03/19/creando-paginas-404-amigables-para-los-usuarios/" rel="bookmark" title="Permanent Link: Creando páginas 404 amigables para los usuarios">Creando páginas 404 amigables para los usuarios</a></li><li><a href="http://www.anieto2k.com/2006/02/23/google-page-creator/" rel="bookmark" title="Permanent Link: Google Page Creator">Google Page Creator</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2012/01/08/speech-javascript-api-habla-con-las-paginas-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>syze, añade @media queries avanzadas y cross browser con javascript</title>
		<link>http://www.anieto2k.com/2012/01/05/syze-anade-media-queries-avanzadas-y-cross-browser-con-javascript/</link>
		<comments>http://www.anieto2k.com/2012/01/05/syze-anade-media-queries-avanzadas-y-cross-browser-con-javascript/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 08:18:14 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10273</guid>
		<description><![CDATA[Syze, es una librería javascript cross-browser, cross-device y cross-library que nos permitirá disponer de una opción funcional para disfrutar de los @media queries de CSS3. Y todo ello en menos de 1KB. Instalación Añadimos la llamada al CDN (o descargamos el fichero JS y lo servimos desde nuestro servidor). &#60;script src="//rezitech.github.com/syze/syze.min.js"&#62;&#60;/script&#62; Y añadimos una línea [...]]]></description>
			<content:encoded><![CDATA[<a href="http://rezitech.github.com/syze/">Syze</a>, es una librería javascript cross-browser, cross-device y cross-library que nos permitirá disponer de una opción funcional para disfrutar de los<a href="http://www.anieto2k.com/2007/08/22/tecnicas-css3-que-estoy-deseando-que-lleguen-a-mis-manos/"> @media queries de CSS3</a>. Y todo ello en menos de 1KB.
<h3>Instalación</h3>
Añadimos la llamada al CDN (o <a href="http://github.com/rezitech/syze">descargamos el fichero JS</a> y lo servimos desde nuestro servidor).
<pre><code>&lt;script src="//rezitech.github.com/syze/syze.min.js"&gt;&lt;/script&gt;</code></pre>
Y añadimos una línea Javascript que indicará<a href="http://rezitech.github.com/syze/#features"> las opciones</a> de las que queremos disponer en nuestro CSS.
<pre><code>syze.sizes(320, 480, 768, 1024, 1920);</code></pre>
Esto nos permitirá trabajar con un sistema de clases que podremos condicionar, haciendo que se ajuste a cada dispositivo dependiendo de su tamaño y su orientación.
<pre><code>body { background: no-repeat center center; }
.is320  body { background-image: url(mobile-tall-128x128.png); }
.is480  body { background-image: url(mobile-wide-128x128.png); }
.is768  body { background-image: url(tablet-tall-256x256.png); }
.is1024 body { background-image: url(tablet-wide-256x256.png); }
.is1920 body { background-image: url(hdsize-wide-512x512.png); }</code></pre>
Podéis ver un ejemplo <a href="http://rezitech.github.com/syze/example-syze.html">directamente desde aquí</a> (redimensionar la página).<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2012/01/08/twitterweek-2012-01-08/" rel="bookmark" title="Permanent Link: TwitterWeek &#8211; 2012-01-08">TwitterWeek &#8211; 2012-01-08</a></li><li><a href="http://www.anieto2k.com/2006/06/18/coleccion-de-utilidades-javascript/" rel="bookmark" title="Permanent Link: Colección de utilidades Javascript">Colección de utilidades Javascript</a></li><li><a href="http://www.anieto2k.com/2008/03/15/el-estado-de-acid3-en-la-actualidad/" rel="bookmark" title="Permanent Link: El estado de Acid3 en la actualidad">El estado de Acid3 en la actualidad</a></li><li><a href="http://www.anieto2k.com/2009/08/29/browser-shooter-dispara-navegadores-con-javascript/" rel="bookmark" title="Permanent Link: Browser Shooter, dispara navegadores con Javascript">Browser Shooter, dispara navegadores con Javascript</a></li><li><a href="http://www.anieto2k.com/2006/06/21/flash-vs-ajax/" rel="bookmark" title="Permanent Link: Flash VS Ajax">Flash VS Ajax</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2012/01/05/syze-anade-media-queries-avanzadas-y-cross-browser-con-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Battery Status API, controla la carga de la batería de tus usuarios con Javascript</title>
		<link>http://www.anieto2k.com/2012/01/05/battery-status-api-controla-la-carga-de-la-bateria-de-tus-usuarios-con-javascript/</link>
		<comments>http://www.anieto2k.com/2012/01/05/battery-status-api-controla-la-carga-de-la-bateria-de-tus-usuarios-con-javascript/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 07:57:57 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10268</guid>
		<description><![CDATA[El pasado día 29 de Noviembre la W3C publicó el primer borrador sobre el que se está trabajando para permitir conocer el estado de la batería directamente desde el navegador, algo que actualmente no hay forma de hacer. Esta opción, que puede parecer una tontería puede ayudarnos muchos en casos de operativas delicadas, ya que [...]]]></description>
			<content:encoded><![CDATA[El pasado día <a href="http://www.w3.org/TR/battery-status/">29 de Noviembre la W3C publicó el primer borrador sobre el que se está trabajando para permitir conocer el estado de la batería directamente desde el navegador</a>, algo que actualmente no hay forma de hacer. Esta opción, que puede parecer una tontería puede ayudarnos muchos en casos de operativas delicadas, ya que podríamos advertir al usuario antes de que la batería se termine.

Por el momento, solo <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=678694">Mozilla Aurora 11, una futura versión de Firefox, lo incluye</a> entre <a href="http://hacks.mozilla.org/2011/12/introducing-aurora-11-with-tons-of-new-features-and-improvements/">muchas otras nuevas funcionalidade</a>s.

La API dispone de una serie de atributos que cuelgan directamente del elemento <code>window.navigator</code>.

<h3><code>window.navigator.battery</code></h3>

Por el momento, ya que solo está disponible en <a href="http://www.mozilla.org/en-US/firefox/channel/">Mozilla Aurora 11</a> y la API no está del todo definida tendremos que usarlo con el prefijo <code>moz </code>como ya nos tienen acostumbrados. Por lo tanto pasaría a ser <code>window.navigator.mozBattery</code>.

El nuevo objeto dispone de una serie de atributos que nos permitirá<a href="http://davidwalsh.name/battery-api"> conocer ciertos datos sobre el estado de la batería</a>:
<ul>
	<li><code>charging (boolean)</code>: <code>true </code>si la batería está cargando y <code>false </code>si no lo está.</li>
	<li><code>chargingTime(int)</code>: Número de segundos en los que se estima que la batería esté cargada.</li>
	<li><code>dischargingTime(int)</code>: Número de segundos en los que se estima que la batería se descargará y entraremos en modo suspensión (o apagado).</li>
	<li><code>level(int)</code>: Escala de 0-10 que indica el estado de carga de la batería, siendo 0 completamente descargada y 10 completamente cargada.</li>
</ul>
Además, disponemos de una serie de eventos que podremos controlar para condicionar acciones a ellos:
<ul>
	<li><code>onchargingchange</code></li>
	<li><code>onchargingtimechange</code></li>
	<li><code>ondischargingtimechange</code></li>
	<li><code>onlevelchange</code></li>
</ul>
Una interesante propuesta para mejorar, sobretodo las aplicaciones móviles web con posibilidades nuevas y realmente útiles.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2012/01/08/speech-javascript-api-habla-con-las-paginas-web/" rel="bookmark" title="Permanent Link: Speech Javascript API, habla con las páginas web">Speech Javascript API, habla con las páginas web</a></li><li><a href="http://www.anieto2k.com/2007/05/09/perdemos-25-dias-al-ano-por-la-carga-de-las-paginas/" rel="bookmark" title="Permanent Link: Perdemos 2.5 dias al año por la carga de las páginas">Perdemos 2.5 dias al año por la carga de las páginas</a></li><li><a href="http://www.anieto2k.com/2009/02/04/wordpress-271-beta-1-primera-actualizacion-de-mantenimiento-de-la-27/" rel="bookmark" title="Permanent Link: WordPress 2.7.1 beta 1, primera actualización de mantenimiento de la 2.7">WordPress 2.7.1 beta 1, primera actualización de mantenimiento de la 2.7</a></li><li><a href="http://www.anieto2k.com/2008/12/10/wordpress-27-rc2-la-final-tendra-que-esperar/" rel="bookmark" title="Permanent Link: WordPress 2.7 RC2, la final tendrá que esperar">WordPress 2.7 RC2, la final tendrá que esperar</a></li><li><a href="http://www.anieto2k.com/2007/10/11/crea-listas-rapidamente-con-javascript-y-solo-con-tu-teclado/" rel="bookmark" title="Permanent Link: Crea listas rapidamente con javascript y solo con tu teclado">Crea listas rapidamente con javascript y solo con tu teclado</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2012/01/05/battery-status-api-controla-la-carga-de-la-bateria-de-tus-usuarios-con-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>POM: Programación Orientada a Maquetadores</title>
		<link>http://www.anieto2k.com/2011/07/25/pom-programacion-orientada-a-maquetadores/</link>
		<comments>http://www.anieto2k.com/2011/07/25/pom-programacion-orientada-a-maquetadores/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 19:07:31 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10225</guid>
		<description><![CDATA[Entre diseñadores web y desarrolladores web siempre ha habido una línea un tanto difusa entre las funciones de uno y las funciones de otros. En esa línea difusa aparece el perfil de maquetador que en muchas empresas recae entre las funciones de uno o de otro. Si nos ponemos tiquismiquis podemos sacar muchos más perfiles, [...]]]></description>
			<content:encoded><![CDATA[Entre diseñadores web y desarrolladores web siempre ha habido una línea un tanto difusa entre las funciones de uno y las funciones de otros. En esa línea difusa aparece el perfil de maquetador que en muchas empresas recae entre las funciones de uno o de otro.

Si nos ponemos tiquismiquis podemos <a href="http://javierperez.com/perfiles-existentes-en-el-desarrollo-web/">sacar muchos más perfiles</a>, pero para este artículo nos bastará con estos 3  :D
<h3>Proceso de creación</h3>
Para entendernos un poco mejor, explico lo que entiendo por un proceso de creación de una aplicación web, partiendo de que se haya hecho (o no...) un buen análisis, con su correspondiente toma de requerimientos y si ya estás en una empresa seria de verdad, un proceso de validación de prototipos, y especificaciones... pero solo si es una empresa seria de verdad, no vale con ir de ello...

En ese punto, una vez aprovado todo por el cliente, remarcado y explicado perfectamente lo que se ha pedido y lo que se ha de entregar, se comienza a trabajar.

En este punto, los diseñadores empiezan a darle forma a esos prototipos, esos wireframes que el usuario a validado y que espera recibir. Una vez terminados estos diseños, generalmente en formato imagen, se le muestran al usuario para que valide el diseño de la página y pasemos a darle funcionalidad a la misma. (Ojo!, creo que estoy entrando en un mundo utópico rodeado de unicornios y dragones... :D).

Vale, ya hemos validado con el usuario el diseño y la funcionalidad que desea para su nueva y flamante nueva aplicación web, ha sido un proceso duro, pero nos permite disponer de toda la información necesaria para empezar y no tener que volver a molestar al usuario, salvo las notificaciones periódicas que se planifiquen.

En este punto, el diseño se pasa a los maquetadores, encargados de convertir ese diseño en el HTML que el usuario podrá ver en su navegador, este HTML no contendrá ninguna funcionalidad, únicamente habrá HTML y CSS.

En este punto, entramos una zona pantanosa, ya que nos encontramos código javascript que necesita el diseño para ser funcional (sliders, autocompletes, ....). Soy de los que cree que esta responsabilidad debería caer en el maquetador, ya que es el que está más cerca del diseñador para saber que funcionamiento ha de tener esa porción de web concreta.

Por otro lado, nos encontramos con que hay ciertas funcionalidades que afectan, tanto al maquetador como al desarrollador web, por ejemplo los autocompletes (suggest), validación de formularios, ... esta funcionalidad es a veces un poco difusa. En este punto entra lo que yo llamo, en alarde de originalidad POM (Programación Orientada a Maquetadores).
<h3>POM: Programación Orientada a Maquetadores</h3>
Se trata de ofrecer al maquetador una serie de herramientas que le permita añadir funcionalidad básica al HTML sin necesidad de tocar una sola línea de Javascript. Básicamente se trata de generar componentes autónomos que lean el HTML y los atributos especiales que este HTML ha de tener.

Hace ya mucho tiempo, publiqué <a href="http://www.anieto2k.com/2008/06/25/validar-formularios-con-jquery/">un ejemplo de validación de formularios con jQuery que seguía esta metodología</a>. Se basaba en indicar a cada elemento de que tipo de validación requería para comprobar los datos de entrada. A grandes rasgos, vemos que usando el class de los atributos &lt;input /&gt;, &lt;select /&gt;,... informábamos el tipo de validación.
<h4>Atributos data-*</h4>
Entonces llegó <a href="http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data-with-the-data-attributes">HTML5 y sus atributos data-*</a>, unos atributos que abren un abanico de posibilidades, y aunque antes me daban un poco de miedo, ahora disfruto con ellos :D

Los atributos data-*, nos permiten dotar a nuestros elementos de un montón de datos que podemos usar en nuestro código javascript, de forma que podremos construir un código capaz de trabajar con ellos y construirse en función de ellos.

Veamos un ejemplo:
<pre>&lt;input type="text" class="autocomplete estilobonito" data-max-items="15" data-type="clientes" data-min-length="3" /&gt;

// jQuery
$("input.autocomplete").bind(function(){

	// Recogemos valores
	var $this = $(this),
	 	$value = $this.val(),
		$maxitems = $this.data("max-items") || 5,
		$type = $this.data("type") || "compras", 
		$minlength = $this.data("min-length") || 5;
	
	
	/* Funcionalidad */
	
	// Salimos si ha pulsado menos de $minlength carácteres
	if ($value.length &lt; $minlength) return;
	
	jQuery.getJSON("http://miservicio.com/", {
		type: $type,
		items: $maxitems,
		value: $value
	},function(){
		/* LO QUE QUIERAS HACER*/
	});
});</pre>
Como podemos ver, nos permita acceder a ellos fácilmente, <a href="http://stackoverflow.com/questions/5696464/are-html-data-attributes-safe-for-older-browsers-e-g-ie-6/5696483#5696483">sin jQuery y para IE es igual de fácil</a>.
<h3>¿Donde está la gracia?</h3>
La gracia está en hacer el código lo más reutilizable posible, haciendo que nos permita configurar nuestros elementos HTML de forma fácil. En mi caso personal, esta programación ha conseguido descargarme bastante de trabajo que antes hacía yo para que ahora los maquetadores/diseñadores puedan configurar.

Por experiencia, puedo decir que siempre terminas modificando el código y adaptando el código a las diferentes necesidades del diseño, pero se convierte en una tarea más sencilla y fácil de depurar.

Un ejemplo que estamos usando y que nos funciona muy bien, a ver si un día puedo implementar una versión de demo para que la veáis, es un autocomplete usando el de jQuery UI, capaz de diferenciar entre 3 o 4 tipos diferentes de datos y 3 o 4 salidas diferentes que comparten prácticamente todo el código.

Esto, añadido al <a href="http://www.anieto2k.com/2011/02/13/modularizar-aplicaciones-escalables-javascript-con-poa/">modelo de programación modular que vimos hace ya muuucho tiempo</a>, nos está dando unos muy buenos resultados, tanto a la hora de desarrollar como a la hora de depurar la aplicación.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2007/09/23/programacion-orientada-a-objetos-poo-en-javascript/" rel="bookmark" title="Permanent Link: Programación Orientada a Objetos (POO) en Javascript">Programación Orientada a Objetos (POO) en Javascript</a></li><li><a href="http://www.anieto2k.com/2006/03/20/browser-book-libro-para-maquetadores/" rel="bookmark" title="Permanent Link: Browser Book, Libro para maquetadores">Browser Book, Libro para maquetadores</a></li><li><a href="http://www.anieto2k.com/2008/06/18/joose-js-mejorando-la-programacion-orientada-a-objetos/" rel="bookmark" title="Permanent Link: Joose-js, mejorando la programación orientada a objetos">Joose-js, mejorando la programación orientada a objetos</a></li><li><a href="http://www.anieto2k.com/2006/11/21/top-20-lenguajes-de-programacion/" rel="bookmark" title="Permanent Link: Top 20 lenguajes de programacion">Top 20 lenguajes de programacion</a></li><li><a href="http://www.anieto2k.com/2009/05/13/de-photoshop-a-xhtmlcss-paso-a-paso/" rel="bookmark" title="Permanent Link: De Photoshop a XHTML/CSS paso a paso">De Photoshop a XHTML/CSS paso a paso</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2011/07/25/pom-programacion-orientada-a-maquetadores/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Qwery, el mini selector CSS3</title>
		<link>http://www.anieto2k.com/2011/03/24/qwery-el-mini-selector-css3/</link>
		<comments>http://www.anieto2k.com/2011/03/24/qwery-el-mini-selector-css3/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 08:19:49 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10196</guid>
		<description><![CDATA[Dustin Diaz presenta un nuevo selector CSS3 que parece ser el más ligero de los actuales. Con tan solo 6, 7kb, tenemos la posibilidad de recorrer el DOM de nuestra página realizando búsquedas usando los selectores CSS1, CSS2 y CSS3 disponibles. Para ello se ha basado en el ya mítico script de Simon Willison que [...]]]></description>
			<content:encoded><![CDATA[<strong>Dustin Diaz</strong> presenta <a href="http://dustindiaz.com/qwery">un nuevo selector CSS3 que parece ser el más ligero</a> de los actuales. Con<a href="https://github.com/polvero/qwery/blob/master/qwery.js"> tan solo 6, 7kb</a>, tenemos la posibilidad de recorrer el DOM de nuestra página realizando búsquedas usando los <strong>selectores CSS1, CSS2 y CSS3 disponibles</strong>. Para ello se ha basado en el ya <a href="http://simonwillison.net/2003/Mar/25/getElementsBySelector/">mítico script de Simon Willison que publicó en 2003 (getElementsBySelector())</a> del que han surgido otros tantos. [<a href="https://github.com/polvero/qwery/raw/master/qwery.js">Descargar</a>]<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2008/08/28/zebra-tables-con-css3/" rel="bookmark" title="Permanent Link: Zebra tables con CSS3">Zebra tables con CSS3</a></li><li><a href="http://www.anieto2k.com/2009/03/26/sly-el-selector-css3-bueno-bonito-y-barato/" rel="bookmark" title="Permanent Link: Sly, el selector CSS3 bueno, bonito y barato">Sly, el selector CSS3 bueno, bonito y barato</a></li><li><a href="http://www.anieto2k.com/2008/12/15/extendiendo-los-selectores-de-mootoos-y-jquery/" rel="bookmark" title="Permanent Link: Extendiendo los selectores de MooToos y jQuery">Extendiendo los selectores de MooToos y jQuery</a></li><li><a href="http://www.anieto2k.com/2006/06/14/css3-generando-contenidos/" rel="bookmark" title="Permanent Link: CSS3 Generando contenidos">CSS3 Generando contenidos</a></li><li><a href="http://www.anieto2k.com/2008/08/25/el-selector-not-de-css3/" rel="bookmark" title="Permanent Link: El selector :not() de CSS3">El selector :not() de CSS3</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2011/03/24/qwery-el-mini-selector-css3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>$script.js, otra librería de Javascript ondemand</title>
		<link>http://www.anieto2k.com/2011/02/21/script-js-otra-libreria-de-javascript-ondemand/</link>
		<comments>http://www.anieto2k.com/2011/02/21/script-js-otra-libreria-de-javascript-ondemand/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 07:55:09 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10177</guid>
		<description><![CDATA[Dustin Diaz ha publicado su propia librería javascript para cargar javascript cuando realmente lo necesitemos. $script('analytics.js'); $script('library.js', function() { // do stuff with library. }); $script.js, nos permite añadir un funcionalidad que será ejecutada al cargar el fichero Javascript que estemos solicitando. Lo que nos permitirá cargar más JS, o ejecutar directamente el código que [...]]]></description>
			<content:encoded><![CDATA[<em>Dustin Diaz</em> ha publicado su propia <a href="http://www.dustindiaz.com/scriptjs/">librería javascript para cargar javascript cuando realmente lo necesitemos</a>.
<pre><code>$script('analytics.js');
$script('library.js', function() {
  // do stuff with library.
});</code></pre>
<strong>$script.js</strong>, nos permite añadir un funcionalidad que será ejecutada al cargar el fichero Javascript que estemos solicitando. Lo que nos permitirá cargar más JS, o ejecutar directamente el código que acabamos de cargar.
<pre><code>$script('yui-base.js', function() {
 // do stuff with base...
 $script(['yui-anim.js', 'yui-connect.js'], function() {
 // do stuff with anim and connect...
 });
 $script('yui-drag.js', function() {
 // do stuff with drag...
 });
});</code></pre>
No es algo nuevo, hace ya tiempo <a href="../2007/02/06/cargar-el-javascript-que-queremos-cuando-queremos/">vimos una versión simple de como conseguir esto</a>, y vimos como <a href="../2008/02/27/include-carga-y-comprime-tu-javascript-ondemand/">IncludeJS además nos devolvía el contenido comprimido</a>, pero nunca está de mal conocer otras alternativas.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2008/04/14/usingjs-el-javascript-ondemand-llevado-al-maximo/" rel="bookmark" title="Permanent Link: Using.js, el javascript onDemand llevado al máximo">Using.js, el javascript onDemand llevado al máximo</a></li><li><a href="http://www.anieto2k.com/2009/07/09/glow-otra-libreria-javascript/" rel="bookmark" title="Permanent Link: Glow, otra librería javascript">Glow, otra librería javascript</a></li><li><a href="http://www.anieto2k.com/2006/03/02/otra-libreria-para-trabajar-con-ajax/" rel="bookmark" title="Permanent Link: Otra librería para trabajar con Ajax">Otra librería para trabajar con Ajax</a></li><li><a href="http://www.anieto2k.com/2006/09/14/40-librerias-para-trabajar-con-ajax-y-creciendo/" rel="bookmark" title="Permanent Link: 40 librerías para trabajar con Ajax y creciendo">40 librerías para trabajar con Ajax y creciendo</a></li><li><a href="http://www.anieto2k.com/2009/06/17/doodle-js-libreria-para-trabajar-con-canvas/" rel="bookmark" title="Permanent Link: Doodle.js, librería para trabajar con canvas">Doodle.js, librería para trabajar con canvas</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2011/02/21/script-js-otra-libreria-de-javascript-ondemand/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Modularizar aplicaciones escalables javascript con POA</title>
		<link>http://www.anieto2k.com/2011/02/13/modularizar-aplicaciones-escalables-javascript-con-poa/</link>
		<comments>http://www.anieto2k.com/2011/02/13/modularizar-aplicaciones-escalables-javascript-con-poa/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 13:06:27 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10161</guid>
		<description><![CDATA[Hace ya tiempo vimos como construir una aplicación javascript fácilmente escalable basado en una presentación de Nicholas C.Zackas. Una forma de modularizar nuestro código Javascript con la intención de separar competencias haciendo que nuestro código no sea dependiente de otro. En el código que vimos, además encapsulábamos todos los métodos de los módulos en un [...]]]></description>
			<content:encoded><![CDATA[Hace ya tiempo vimos como construir <a href="http://www.anieto2k.com/2009/09/25/aplicaciones-javascript-escalables/">una aplicación javascript fácilmente escalable basado en una presentación de Nicholas C.Zackas</a>. Una forma de modularizar nuestro código Javascript con la intención de separar competencias haciendo que nuestro código no sea dependiente de otro.

En el código que vimos, además encapsulábamos todos los métodos de los módulos en un gestor de errores básico que se encargaba de evitar que un error en uno de los módulos provocara que la aplicación dejara de funcionar.
<pre><code>...
 for (name in instance){
    method = instance[name];
    if (typeof method == "function") {
      instance[name] = function(name, method) {
      return function(){
         <strong> try { return method.apply(this, arguments);}
          catch(ex) { console.log("[Error]" + name + "(): " + ex.message); }</strong>
        }
      }(name, method);
    }
  }
...</code></pre>
<h3>Programación orientada a aspecto</h3>
Por otro lado, hace todavía más tiempo, vimos <a href="http://www.anieto2k.com/2008/09/14/anadiendo-filtros-a-tus-scripts-con-javascript/">una implementación de los filtros de WordPress en Javascript</a>. Una forma de acercar la programación orientada a aspectos al lado del cliente.

La programación orientada a aspectos, no es más que un paradigma de programación que nos ayuda modularizar nuestra aplicación de una forma controlada, permitiendo extenderla desde fuera sin alterar el funcionamiento principal de la misma. O lo que es lo mismo, poder desarrollar plugins que modifiquen el funcionamiento principal.
<h3>Uniendo conceptos</h3>
Uniendo conceptos podríamos disponer de la capacidad de crear aplicaciones escalables gestionadas por un objeto encargado de arrancar y/o parar módulos, con una batería de herramientas disponibles en estos módulos capaces de hacernos disfrutar de las ventajas de la programación orientada a aspectos.

Veamos el código completo:
<pre><code>
var debug = false;
var Sandbox = function() {
	var listeners = {};
	return {
		add: function(name, func){
		  if (typeof listeners == 'undefined') return;
		  if (typeof listeners[name] == 'undefined') listeners[name] = new Array();
			listeners[name].push(func);
		},
		remove: function(name, func){
			if (typeof listeners[name] == 'undefined') return;
			var j = 0;
			while (j &lt; listeners[name].length) {
				if (listeners[name][j] == func) { listeners[name].splice(j, 1);}
				else { j++; }
				}
		},
		fire: function(name, args){
			if (typeof listeners == 'undefined' || (!listeners[name]  || typeof listeners[name] == 'undefined')) return;
		    for (var x=0; x&lt;listeners[name].length; x++)
		        listeners[name][x].call(this, args);
		}
	};
};

var Core = function(){
   	var modules = {}, sandbox = new Sandbox(this);
   	function createInstance(moduleID){
   		var instance = modules[moduleID].creator(sandbox),name, method;
    	if (!debug) {
      		for (name in instance){
        		method = instance[name];
        		if (typeof method == "function") {
          			instance[name] = function(name, method) {
						var evname = moduleID + ":" + name;
            			return function(){
              				try {
								sandbox.fire("pre-" + evname, arguments);
								salida = method.apply(this, arguments);
								sandbox.fire("post-" + evname, salida);
								return salida;
							}
              				catch(ex) {
								if (typeof instance["onerror"] == 'function') instance["onerror"].apply(this, [ex]);
								console.log("[Error]" + name + "(): " + ex.message);
							}
            			}
          			}(name, method);
        		}
      		}
    	}
  	return instance;
 	}

 	// Método públicos
 	return {
   		register: function(moduleID, creator) {
     		modules[moduleID] = {
       			creator: creator,
       			instance: null
     		};
   		},
   		start: function(moduleID) {
     		modules[moduleID].instance = createInstance(moduleID);
     		modules[moduleID].instance.init();
   		},
   		stop: function(moduleID){
     		var data = modules[moduleID];
     		if (data.instance) {
       			data.instance.destroy();
       			data.instance = null;
     		}
   		},
   		startAll: function(){
     		for (var moduleID in modules) {
       			if (modules.hasOwnProperty(moduleID)) {
         			this.start(moduleID);
       			}
     		}
   		},
   		stopAll: function() {
     		for (var moduleID in modules) {
       			if (modules.hasOwnProperty(moduleID)) {
         			this.stop(moduleID);
       			}
     		}
   		}
 	};
}();
</code></pre>
<h3>¿Que nos ofrece?</h3>
He modificado el script para añadir 2 puntos de enlace predeterminados a todos los métodos de los módulos, "pre-XXX" y "post-XXX". Lo que nos permite definir funcionalidades que se ejecutarán antes y después de la ejecución del módulo.  Veamos un ejemplo:
<pre><code>Core.register("test", function($s){
	return {
		init: function(){
			console.log("Constructor");
		},
		destroy: function(){
			console.log("Destroy");
		},
		onerror: function(ex){
			alert("Error: " + ex);
		}
	}
});

Core.register("test2", function($s){
	return {
		init: function(){
        <strong>                // Añadimos el evento al contructor del módulo "test"
	</strong>		$s.add("pre-test:init", function(){
				console.log("Bla bla");
			});
			console.log("Constructor 2");
		},
		destroy: function(){
			console.log("Destroy 2");
		},
		onerror: function(ex){
			alert("Error: " + ex);
		}
	}
});

<strong>// Cargamos los módulos
</strong>Core.start("test2");
Core.start("test");

<strong>// Resultado
// --&gt; Constructor 2

// --&gt; Bla bla
// --&gt; Constructo</strong></code></pre>
<h3>Eventos personalizados</h3>
Al igual que los eventos por defecto de los que disponemos, podemos especificar eventos propios en nuestro módulos mediante el uso de Sandbox.fire(), que se encargará de ejecutar el contenido asociado al evento especificado.
<pre><code>
Core.register("test3", function($s){
	return {
		init: function(){
			console.log("Constructor 2");
<strong>			// Ejecutamos el evento "mievento"
</strong>			$s.fire("mievento", this);
		},
		destroy: function(){
			console.log("Destroy 2");
		},
		onerror: function(ex){
			alert("Error: " + ex);
		}
	}
});
</code></pre>
Como podemos ver, nos permitirá crear aplicaciones escalables y fácilmente extensibles mediante módulos que a su vez serán interoperables entre ellos mediante la programación orientada a aspectos.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2011/09/04/twitterweek-2011-09-04-2/" rel="bookmark" title="Permanent Link: TwitterWeek &#8211; 2011-09-04">TwitterWeek &#8211; 2011-09-04</a></li><li><a href="http://www.anieto2k.com/2007/10/15/10-acordeones-en-javascript/" rel="bookmark" title="Permanent Link: 10 acordeones en Javascript">10 acordeones en Javascript</a></li><li><a href="http://www.anieto2k.com/2011/01/09/twitterweek-2011-01-09/" rel="bookmark" title="Permanent Link: TwitterWeek &#8211; 2011-01-09">TwitterWeek &#8211; 2011-01-09</a></li><li><a href="http://www.anieto2k.com/2007/10/05/las-damas-en-javascript/" rel="bookmark" title="Permanent Link: Las Damas en Javascript">Las Damas en Javascript</a></li><li><a href="http://www.anieto2k.com/2007/10/01/javascript-para-hackers/" rel="bookmark" title="Permanent Link: Javascript para Hackers">Javascript para Hackers</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2011/02/13/modularizar-aplicaciones-escalables-javascript-con-poa/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>jQuery Blog informa que deshabilitará el hotlinking</title>
		<link>http://www.anieto2k.com/2010/12/31/jquery-blog-informa-que-deshabilitara-el-hotlinking/</link>
		<comments>http://www.anieto2k.com/2010/12/31/jquery-blog-informa-que-deshabilitara-el-hotlinking/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 08:27:19 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[Actualidad]]></category>
		<category><![CDATA[de la red]]></category>
		<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10143</guid>
		<description><![CDATA[Desde el blog oficial de jQuery informan que apartir del próximo día 31 de enero de 2011 dejarán de servir ficheros hacia servidores externos, osea que van a deshabilitar el hotlinking que hasta ahora se estaba haciendo. Esto afectará a muchos sitios que estén usando la dirección directa a los servidores de jQuery.com para llamar [...]]]></description>
			<content:encoded><![CDATA[Desde el <a href="http://blog.jquery.com/2010/12/30/hotlinking-to-be-disabled-on-jan-31-2011/">blog oficial de jQuery informan</a> que apartir del <strong>próximo día 31 de enero de 2011 dejarán de servir ficheros hacia servidores externos</strong>, osea que van a deshabilitar el hotlinking que hasta ahora se estaba haciendo.

Esto afectará a muchos sitios que estén usando la dirección directa a los servidores de jQuery.com para llamar a los ficheros Javascript desde nuestras webs.
<pre><code>&lt;script type="text/javascript" src="<strong>http://www.jquery.com/....</strong>"&gt;&lt;/script&gt;</code></pre>
Para evitar problemas te recomiendo que cambies la ubicación de tus ficheros Javascript que hasta ahora estaban alojados en jQuery.com. Lo ideal sería alojar el fichero en tu servidor, pero si por algún motivo no es posible <a href="http://www.anieto2k.com/2008/05/27/google-ajax-libraries-api-ajax-sobre-la-arquitectura-google/">tienes el CDN de Google Ajax Libraries</a> que cumple perfectamente esta función.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2007/05/05/hotlinking-protection-plugin-para-wordpress/" rel="bookmark" title="Permanent Link: Hotlinking Protection Plugin para WordPress">Hotlinking Protection Plugin para WordPress</a></li><li><a href="http://www.anieto2k.com/2007/01/15/jquery-11-nueva-version-y-nuevo-sitio-web/" rel="bookmark" title="Permanent Link: jQuery 1.1, nueva versión y nuevo sitio web">jQuery 1.1, nueva versión y nuevo sitio web</a></li><li><a href="http://www.anieto2k.com/2007/02/28/jquery-112-ha-visto-la-luz/" rel="bookmark" title="Permanent Link: jQuery 1.1.2, ha visto la luz">jQuery 1.1.2, ha visto la luz</a></li><li><a href="http://www.anieto2k.com/2006/02/09/hotlinking/" rel="bookmark" title="Permanent Link: Hotlinking">Hotlinking</a></li><li><a href="http://www.anieto2k.com/2007/09/17/jquery-121/" rel="bookmark" title="Permanent Link: jQuery 1.2.1">jQuery 1.2.1</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2010/12/31/jquery-blog-informa-que-deshabilitara-el-hotlinking/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Validación de formularios con HTML5</title>
		<link>http://www.anieto2k.com/2010/11/18/validacion-de-formularios-con-html5/</link>
		<comments>http://www.anieto2k.com/2010/11/18/validacion-de-formularios-con-html5/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 11:28:11 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10110</guid>
		<description><![CDATA[HTML5 no solo ofrecerá una serie de elementos para hacer la web más visual, también ayudará a los desarrolladores web a realizar tareas cotidianas de forma más rápida y segura. Una de ellas es la validación de formularios. Atributos Gracias a una serie de atributos que podremos usar en elementos de nuestros formularios podremos condicionar [...]]]></description>
			<content:encoded><![CDATA[HTML5 no solo ofrecerá una serie de elementos para hacer la web más visual, también ayudará a los desarrolladores web a realizar tareas cotidianas de forma más rápida y segura. Una de ellas es <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html">la validación de formularios</a>.

<strong>Atributos</strong>

Gracias a una serie de atributos que podremos usar en elementos de nuestros formularios podremos condicionar desde el diseño las validaciones de cualquier formulario de nuestra página.
<h4>required</h4>
Como su nombre indica, el formulario no se enviará mientras el elemento que contenga este atributo no esté informado. Algo que hasta ahora estábamos haciendo en nuestra capa de funcionalidad con javascript, recorriendo elementos o comprobando los elementos con una class específica.
<pre><code>&lt;input name="nombre" required &gt;</code>;</pre>
<strong>pattern</strong>

También podremos difinir el patrón que el texto deba tener dentro de nuestros elementos <code>&lt;input /&gt;</code>. Este atributo realiza dos funciones, una especificar el formato del dato que recibiremos y otra la de ayudar a comprender al usuario el formato que deba usar (por ejemplo, campo para insertar un teléfono (+34) 971 123456).
<pre><code>&lt;input type="telefono" pattern="(+[0-9]{2}) [0-9]{3} [0-9]{6}" &gt;</code></pre>
<h4>maxlength</h4>
Podremos especificar la longitud máxima de nuestros datos directamente desde un atributo sin necesidad de controlarla desde javascript.
<pre><code>&lt;textarea name="tweet" maxlength="150"&gt;&lt;/textarea&gt;</code></pre>
<h4>min, max, step</h4>
Los actuales sliders pasarán a mejor vida cuando nuestros elementos se puedan definir desde nuestros elementos indicando los valores mínimos, máximos y los pasos entre ellos directamente.
<pre><code>&lt;input name="slider" min="1" max="10" step="2" &gt;</code></pre>
<strong>Javascript</strong>

Esto no significa que desde Javacript no vayamos a hacer nada ya con nuestros formularios, todo lo contrario, se añaden métodos nuevos a los elementos que nos permitirán trabajar con estas validaciones de una forma más cómoda.

Aún es una propuesta, pero apunta a ser una herramienta muy útil.
<h4>element.validity</h4>
Objeto que nos muestra información referente a la validación del elemento.
<ul>
	<li><code>boolean valueMissing;</code> -- Devuelve true si el elemento está vacío y requerido.</li>
	<li><code>boolean typeMismatch;</code> -- Devuelve true si el elemento no contiene la sintaxis correcta.</li>
	<li><code>boolean patternMismatch;</code> -- Devuelve true si el elemento no cumple el patrón definido.</li>
	<li><code>boolean tooLong;</code> -- Devuelve true si el elemento es más grande que el tamaño definido.</li>
	<li><code>boolean rangeUnderflow;</code> -- Devuelve true si el elemento es menor al mínimo definido.</li>
	<li><code>boolean rangeOverflow;</code> -- Devuelve true si el elemento es mayor al máximo definido.</li>
	<li><code>boolean stepMismatch;</code> -- Devuelve true si el elemento no concuerda con uno de los pasos definidos.</li>
	<li><code>boolean customError;</code> -- Devuelve true si el elemento tiene un error personalizado.</li>
	<li>b<code>oolean valid;</code> -- Devuelve true si el elemento es válido.</li>
</ul>
<strong>element.setCustomValidity()</strong>

Método definido para especificar un mensaje de error personalizado a un elemento:
<pre><code>&lt;label&gt;Feeling: &lt;input name=f type="text" oninput="check(this)"&gt;&lt;/label&gt;
&lt;script&gt;
 function check(input) {
   if (input.value == "good" ||
       input.value == "fine" ||
       input.value == "tired") {
     input.setCustomValidity('"' + input.value + '" is not a feeling.');
   } else {
     // input is fine -- reset the error message
     input.setCustomValidity('');
   }
 }
&lt;/script&gt;</code></pre>
<h3>CSS</h3>
La capa de diseño además nos permitirá informar al usuario que un elemento no ha sido validado a la hora de enviar nuestro formulario, para ello nos acercan el pseudoselector <code>:invalid</code> para que podamos definir el aspecto de nuestros elementos no válidos.
<pre><code>:invalid{
border: 1px red solid;
}</code></pre>
Hay muchas más y más interesantes nuevas funcionalidades que nos harán la vida más fácil, las iremos viendo más adelante.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2010/01/09/todo-lo-que-necesitas-saber-sobre-los-formularios-html5/" rel="bookmark" title="Permanent Link: Todo lo que necesitas saber sobre los formularios HTML5">Todo lo que necesitas saber sobre los formularios HTML5</a></li><li><a href="http://www.anieto2k.com/2009/09/07/vanadiumjs-validacion-de-formularios-en-el-cliente/" rel="bookmark" title="Permanent Link: VanadiumJS, validación de formularios en el cliente">VanadiumJS, validación de formularios en el cliente</a></li><li><a href="http://www.anieto2k.com/2006/07/19/valida-formularios-con-prototype/" rel="bookmark" title="Permanent Link: Valida formularios con Prototype">Valida formularios con Prototype</a></li><li><a href="http://www.anieto2k.com/2007/09/05/livevalidation-sistema-de-validacion-javascript-en-vivo/" rel="bookmark" title="Permanent Link: LiveValidation, sistema de validación javascript en vivo">LiveValidation, sistema de validación javascript en vivo</a></li><li><a href="http://www.anieto2k.com/2007/11/22/buenas-practicas-en-la-implementacion-de-formularios/" rel="bookmark" title="Permanent Link: Buenas prácticas en la implementación de formularios">Buenas prácticas en la implementación de formularios</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2010/11/18/validacion-de-formularios-con-html5/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Popcorn, dándole semántica a los videos con HTML5</title>
		<link>http://www.anieto2k.com/2010/11/08/popcorn-dandole-semantica-a-los-videos-con-html5/</link>
		<comments>http://www.anieto2k.com/2010/11/08/popcorn-dandole-semantica-a-los-videos-con-html5/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 10:23:42 +0000</pubDate>
		<dc:creator>aNieto2k</dc:creator>
				<category><![CDATA[Actualidad]]></category>
		<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[de la red]]></category>
		<category><![CDATA[estandares]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[semántica]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://www.anieto2k.com/?p=10106</guid>
		<description><![CDATA[Mozilla quiere romper la idea actual del video en Internet. El actual modelo, basado en un elemento pasivo que muestra información al usuario mediante el navegador simula perfectamente la televisión actual, pero gracias a Drumbeat ha surgido Popcorn. Popcorn Popcorn, es una iniciativa que añade una funcionalidad extra a los elementos &#60;video /&#62; y &#60;audio [...]]]></description>
			<content:encoded><![CDATA[<strong>Mozilla </strong>quiere romper la idea actual del video en Internet. El actual modelo, basado en un elemento pasivo que muestra información al usuario mediante el navegador simula perfectamente la televisión actual, pero gracias a <a href="http://www.drumbeat.org/">Drumbeat </a>ha surgido <em>Popcorn</em>.
<h3>Popcorn</h3>
Popcorn, es una iniciativa que añade una funcionalidad extra a los elementos <a href="http://www.anieto2k.com/2009/06/30/el-elemento-video-del-html5/">&lt;video /&gt;</a> y <a href="http://www.anieto2k.com/2009/07/14/el-elemento-audio-del-html5/">&lt;audio /&gt;</a> del HTML5 permitiendo que muestren al usuario información extra sobre el video, subtítulos, geolocalización, información sobre personas que aparezcan,...

La idea es añadir una semántica extra a lo que hasta ahora solo era un canal de visualización.
<h3>XML</h3>
Mediante <a href="https://wiki.mozilla.org/PopcornOpenVideoAPI">un fichero XML externo que definiríamos en nuestro elemento multimedia especificaremos toda la información que consideremos relevante de nuestro video</a>.
<pre><code>&lt;video width="530px" height="299px" controls="" <strong>data-timeline-sources="xml/webMadeMovies.xml"</strong>&gt;
 &lt;source type="video/ogg; codecs="theora, vorbis" src="wmmjuly6.ogv"&gt;&lt;/source&gt;
 &lt;source type="video/mp4; codecs="avc1.42E01E, mp4a.40.2" src="wmmjuly6.mp4"&gt;&lt;/source&gt;
&lt;/video&gt;</code></pre>
Aquí vemos <a href="http://webmademovies.etherworks.ca/popcorndemo/xml/webMadeMovies.xml">un ejemplo (recortado) del fichero XML</a> que podríamos encontrar.
<pre><code>&lt;popcorn&gt;
 &lt;manifest&gt;
 &lt;people&gt;
 &lt;person id="celine" name="Celine" salutation="Miss." &gt;
 &lt;resource id="celinehomepage" src="http://www.celinecelines.com/" description="Celine's Homepage" /&gt;
 &lt;/person&gt;
 &lt;person id="brian" name="brian" &gt;
 &lt;/person&gt;
 &lt;person id="SteveSong" name="Steve Song" &gt;
 &lt;/person&gt;
 [...]
 &lt;/people&gt;
 &lt;places&gt;
 &lt;place id="saopaulo" type="city" name="Sao Paulo"&gt;
 &lt;resource id="saopaulowiki" src="http://en.wikipedia.org/wiki/S%C3%A3o_Paulo" description="Sao Paulo city, Brazil"/&gt;
 &lt;/place&gt;
 &lt;place id="CapeTown" type="city" name="Cape Town"&gt;
 &lt;resource id="capetownwiki" src="http://en.wikipedia.org/wiki/Cape_Town" description="Cape Town, South Africa"/&gt;
 &lt;/place&gt;
 [...]
 &lt;/places&gt;
 &lt;attributions&gt;
 &lt;attribution id="yacht1attrib" nameofwork="Don't Fight The Darkness" copyrightholder="Yacht" copyrightholderurl="http://www.teamyacht.com/" nameofworkurl="http://freemusicarchive.org/curator/WFMU/blog/Join_YACHT_See_Mystery_Lights_instrumentals" license="CC-BY-NC" licenseurl="http://creativecommons.org/licenses/by-nc/2.0/"/&gt;
 &lt;attribution id="yacht2attrib" nameofwork="Psychic City Voodoo City" copyrightholder="Yacht" copyrightholderurl="http://www.teamyacht.com/" nameofworkurl="http://freemusicarchive.org/curator/WFMU/blog/Join_YACHT_See_Mystery_Lights_instrumentals" license="CC-BY-NC" licenseurl="http://creativecommons.org/licenses/by-nc/2.0/"/&gt;
 &lt;attribution id="attrib" nameofwork="A Shared Culture" copyrightholder="Jesse Dylan" license="CC-BY-NC" licenseurl="http://creativecommons.org/licenses/by-nc/2.0/"/&gt;
 [...]
 &lt;/attributions&gt;
 &lt;articles&gt;
 &lt;resource id="theinternet" src="http://en.wikipedia.org/wiki/internet" description="The Internet"/&gt;
 &lt;resource id="villagetelco" src="http://en.wikipedia.org/wiki/Village_telco" description="The Village Telco"/&gt;
 &lt;resource id="oilspill" src="http://en.wikipedia.org/wiki/Deepwater_Horizon_oil_spill" description="Deepwater Horizon Oil Spill"/&gt;
 [...]
 &lt;/articles&gt;
 &lt;/manifest&gt;

 &lt;timeline&gt;
 &lt;footnotes&gt;
 &lt;footnote in="00:00:00" out="00:14:00" target="footnotediv"&gt;Look around the page as info is updated!&lt;/footnote&gt;
 &lt;/footnotes&gt;
 &lt;resources&gt;
 &lt;attribution in="00:00:05:02" out="00:00:34:00" target="container5" resourceid="yacht1attrib"&gt;&lt;/attribution&gt;
 &lt;attribution in="00:00:34:01" target="container5" resourceid="yacht1attrib"&gt;&lt;/attribution&gt;
 &lt;footnote in="00:00:00" out="00:15:00" target="footnotediv"&gt;Look around the page!&lt;/footnote&gt;
 &lt;videotag in="00:00:05:02" out="00:00:10:07"&gt;Steve Song&lt;/videotag&gt;
 &lt;attribution in="00:00:05:02" out="00:00:10:07" target="container5" resourceid="villagetelcoattrib"&gt;&lt;/attribution&gt;
 &lt;twitter in="00:00:05:02" out="00:00:10:07" title="Steve Song" source="from:stevesong" target="personaltwitter" width="238" height="120" overlay="images/overlay/twitter.png" /&gt;
 &lt;wiki in="00:00:05:02" out="00:00:10:07" resourceid="villagetelco" numberOfWords="200" target="wikidiv" overlay="images/overlay/wiki.png"/&gt;
 &lt;flickr in="00:00:05:02" out="00:00:10:07" target="personalflickr" userid="78868639@N00" numberofimages="8" padding="4px" overlay="images/overlay/flickr.png"/&gt;
 &lt;googlenews in="00:00:05:02" out="00:00:10:07" target="googlenewsdiv" topic="Village Telco"/&gt;
 [...]
 &lt;/resources&gt;

 &lt;map&gt;
 &lt;location resourceid="capetownwiki" in="00:00:03:00" out="00:00:11:07" lat="-33.9238" long="18.4233" target="container2" zoom="8"/&gt;
 &lt;location resourceid="grandislewiki" in="00:00:11:07" out="00:00:19:07" lat="29.2720" long="-90.0233 " target="container2" zoom="8"/&gt;
 &lt;location resourceid="mitmedialabhome" in="00:00:19:08" out="00:00:27:00" lat="42.3613" long="-71.0863" target="container2" zoom="12"/&gt;
 [...]
 &lt;/map&gt;
 &lt;subtitles&gt;

 &lt;subtitles language="en" align="center"&gt;
 &lt;subtitle in="00:00:00:03" out="00:00:01:06"&gt;All right let's take a look and show me some&lt;/subtitle&gt;
 &lt;subtitle in="00:00:01:06" out="00:00:03:00"&gt;of the neat things you can do on the internet&lt;/subtitle&gt;
 [...]
 &lt;/subtitles&gt;

 &lt;subtitles language="fa" align="center"&gt;

 &lt;subtitle in="00:04:00:08" out="00:04:01:09"&gt;My name is Mona Kasra&lt;/subtitle&gt;

 &lt;subtitle in="00:04:01:10" out="00:04:03:11"&gt;and I'm building a better Internet&lt;/subtitle&gt;
 [...]
 &lt;/subtitles&gt;

 &lt;/subtitles&gt;
 &lt;credits&gt;&lt;/credits&gt;
 &lt;/timeline&gt;
&lt;/popcorn&gt;</code></pre>
<a href="http://webmademovies.etherworks.ca/popcorndemo/">Uno de los ejemplos</a> de uso de este tipo de información es la de enviar en tiempo real los subtítulos en Inglés a una herramienta de traducción para mostrarlos en un idioma diferente al definido en el XML.

Sin duda se trata de un <a href="http://mozilla.github.com/popcorn-js/">interesante proyecto</a> que Mozilla está apoyando con el que los videos/audios de Internet dejarán de ser lo que son hoy en día.<h3>Artículos relacionados</h3>
<ul><li><a href="http://www.anieto2k.com/2007/09/17/557-herramientas-para-la-web-semantica/" rel="bookmark" title="Permanent Link: 557 herramientas para la Web semántica">557 herramientas para la Web semántica</a></li><li><a href="http://www.anieto2k.com/2006/07/18/tabulator-un-navegador-para-la-web-semantica/" rel="bookmark" title="Permanent Link: Tabulator: un navegador para la web semántica">Tabulator: un navegador para la web semántica</a></li><li><a href="http://www.anieto2k.com/2009/12/24/html5-inusable-en-todos-los-navegadores/" rel="bookmark" title="Permanent Link: HTML5 video con problemas en todos los navegadores">HTML5 video con problemas en todos los navegadores</a></li><li><a href="http://www.anieto2k.com/2007/12/09/mas-sobre-el-contenido-multimedia-html5-y-webkit/" rel="bookmark" title="Permanent Link: Más sobre el contenido multimedia, HTML5 y WebKit">Más sobre el contenido multimedia, HTML5 y WebKit</a></li><li><a href="http://www.anieto2k.com/2010/03/26/ambilight-para-html5-video/" rel="bookmark" title="Permanent Link: Ambilight para HTML5 Video">Ambilight para HTML5 Video</a></li></ul><p><a href="http://www.anieto2k.com" id="38.107.179.240"><img rel="38.107.179.240" src="http://www.anieto2k.com/favicon.ico" alt="aNieto2k" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.anieto2k.com/2010/11/08/popcorn-dandole-semantica-a-los-videos-con-html5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

