<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>theproc.es</title>
    <link>http://theproc.es</link>
    <description>The Process - Todo lo que necesitas saber sobre EL PROCESO de desarrollo de aplicaciones web</description>
    <item>
      <title>Menus deplegables con jQuery</title>
      <link>http://theproc.es/2012/1/10/66313/menus-deplegables-con-jquery</link>
      <description>&lt;p&gt;Hay un mill&amp;oacute;n de formas distintas de crear men&amp;uacute;s deplegables con HTML. Unas s&amp;oacute;lo utilizan CSS y selectores :hover, otras utilizan javascript y otras una combinaaci&amp;oacute;n de ambas.&lt;/p&gt;
&lt;p&gt;Siempre podemos buscar y utilizar algunos de los muchos scripts que hay por la red peroyo prefiero tener mi propia colecci&amp;oacute;n de scripts y plugins sencillos. Esto me permite, por un lado, aprender como funcionan las cosas y, por otro, tener un arsenal de sencillas herramientas, r&amp;aacute;pidas de comprender y sencillas de utilizar.&lt;/p&gt;
&lt;p&gt;Dicho esto, vamos con nuestro plugin para men&amp;uacute; deplegables:&lt;/p&gt;
&lt;h3&gt;Demo&lt;/h3&gt;
&lt;p&gt;Haz &lt;a title="Demostraci&amp;oacute;n de men&amp;uacute;s deplegables con jQuery" href="/page/demo/demo-20120111-menus-deplegables?layout=false"&gt;click aqu&amp;iacute;&lt;/a&gt; para verlo en acci&amp;oacute;n.&lt;/p&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;p&gt;Los men&amp;uacute;s deben estar incluidos en una lista desordenada, y los submenus deben ser a su vez listas desordenadas.&lt;/p&gt;
&lt;p&gt;Los puntos clave son:&lt;/p&gt;
&lt;ul&gt;
&lt;li style="margin-bottom: 5px; margin-left: 20px; list-style-type: disc;"&gt;Los menos deben estar incluidos en una lista desordenada &lt;code&gt;ul&lt;/code&gt;&lt;/li&gt;
&lt;li style="margin-bottom: 5px; margin-left: 20px; list-style-type: disc;"&gt;Los submenus deben ser a su vez listas desordenadas&lt;/li&gt;
&lt;li style="margin-bottom: 5px; margin-left: 20px; list-style-type: disc;"&gt;El enlace que activa el men&amp;uacute; deplegable debe tener la clase &lt;code&gt;trigger&lt;/code&gt;&lt;/li&gt;
&lt;li style="margin-bottom: 5px; margin-left: 20px; list-style-type: disc;"&gt;El men&amp;uacute; desplegable debe tener la clase "submenu"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aqu&amp;iacute; podemos ver la estructura b&amp;aacute;sica:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ul id="menu"&amp;gt;
  &amp;lt;li&amp;gt;
    &amp;lt;a href="#" class="trigger"&amp;gt;Coches&amp;lt;/a&amp;gt;
    &amp;lt;ul class="submenu"&amp;gt;
      &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Ferrari&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Mercedes&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;Renault&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;p&gt;El &amp;uacute;nico CSS necesario es el siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt;
  .submenu{
    display:none;
  }
  .open .submenu{
    display:block;
  }
&amp;lt;/style&amp;gt;&lt;/code&gt;   &lt;/pre&gt;
&lt;p&gt;Esto funciona de la siguiente manera: al principio los menus deplegables aparecen ocultos. Al hacer click en el enlace con las clase &lt;code&gt;trigger&lt;/code&gt; a&amp;ntilde;adiremos la clase &lt;code&gt;open&lt;/code&gt; al &lt;code&gt;li&lt;/code&gt; que contiente tanto al enlace como al menu desplegable.&lt;/p&gt;
&lt;h3&gt;Javascript&lt;/h3&gt;
&lt;p&gt;Antes de explicar el funcionamiento del script, aqu&amp;iacute; podeis ver su c&amp;oacute;digo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&amp;gt;
  (function($){
    $.fn.submenu = function () {
      var $this = $(this);
      function closeSubmenus() {
        $this.find('li').removeClass('open');
      }

      $('html').bind("click", closeSubmenus);

      return $this.each(function() {
        $this.delegate('.trigger', 'click', function (e) {
          var li = $(this).parent('li'),
              isActive = li.hasClass('open');
          closeSubmenus();
          !isActive &amp;amp;&amp;amp; li.toggleClass('open');
          return false;
        });
      });
    }
  })(jQuery);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esta funci&amp;oacute;n de plugin se invocar&amp;aacute; sobre el elemento de menu, es decir, sobre el &lt;code&gt;ul&lt;/code&gt; principal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&amp;gt;
  $('#menu').submenu();
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El primer paso es la tipica funci&amp;oacute;n an&amp;oacute;nima y autoejecutable que recibe un par&amp;aacute;metro que se llamar&amp;aacute; &lt;code&gt;$&lt;/code&gt;y que se invocar&amp;aacute; con el objeto &lt;code&gt;jQuery&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De esta forma todo queda recogido en su propio contexto y podemos utilizar tranquilamente &lt;code&gt;$&lt;/code&gt; en caso de tener otras librer&amp;iacute;as cargadas en la p&amp;aacute;gina:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(function($){

})(jQuery);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A continuaci&amp;oacute;n creamos nuestra funcion de plugin y lo guardamos en el espacio de nombres de jQuery dedicado a ello:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.fn.submenu = function(){

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esta funci&amp;oacute;n devuelve el elemento sobre el que invocamos el plugin para permitir llamadas encadenadas:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.fn.submenu = function () {
  var $this = $(this);

  return $this.each(function() {
    // c&amp;oacute;digo del plugin
  });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notad que he guardado una referencia a &lt;code&gt;this&lt;/code&gt; encapsulada con jQuery. Esto tiene doble objetivo. El primero es evitar repetir llamadas a &lt;code&gt;$(this)&lt;/code&gt; cacheando el resultado y el segundo es tener una referencia que podremos usar en funciones auxiliares como mostrar&amp;eacute; a continuaci&amp;oacute;n. &lt;code&gt;this&lt;/code&gt; hace referencia al elemento &lt;code&gt;#menu&lt;/code&gt; sobre el que hemos invocado el plugin.&lt;/p&gt;
&lt;p&gt;Antes de a&amp;ntilde;adir los comportamientos a los enlaces que desplegar&amp;aacute;n el submen&amp;uacute; voy a crear una funci&amp;oacute;n auxiliar que utilizar&amp;eacute; para cerrar el men&amp;uacute; deplegable abierto, es decir, aquel que tiene la clase &lt;code&gt;open&lt;/code&gt; y lo asigno al evento &lt;code&gt;click&lt;/code&gt; de la p&amp;aacute;gina. Con esto conseguir&amp;eacute; que al hacer click fuera del men&amp;uacute; deplegable se cierre:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function closeSubmenus() {
  $this.find('li').removeClass('open');
}

$('html').bind("click", closeSubmenus);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por &amp;uacute;ltimo necesitamos que al pinchar en los enlaces con clase &lt;code&gt;trigger&lt;/code&gt; se cierre el men&amp;uacute; deplegable abierto (si lo hubiese) y que se abra el nuevo. As&amp;iacute; que delegaremos sobre el men&amp;uacute; para que cada &lt;code&gt;click&lt;/code&gt; en el elemento con la clase &lt;code&gt;trigger&lt;/code&gt; elimine la clase &lt;code&gt;open&lt;/code&gt; de cualquier elemento &lt;code&gt;li&lt;/code&gt; y lo a&amp;ntilde;ada al &lt;code&gt;li&lt;/code&gt; padre del mismo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$this.delegate('.trigger', 'click', function (e) {
  var li = $(this).parent('li'),
      isActive = li.hasClass('open');
  closeSubmenus();
  !isActive &amp;amp;&amp;amp; li.toggleClass('open');
  return false;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Y con esto queda el plugin terminado.&amp;nbsp;Haz&amp;nbsp;&lt;a title="Demostraci&amp;oacute;n de men&amp;uacute;s deplegables con jQuery" href="/page/demo/demo-20120111-menus-deplegables?layout=false"&gt;click aqu&amp;iacute;&lt;/a&gt;&amp;nbsp;para verlo en acci&amp;oacute;n&lt;/p&gt;</description>
      <guid>http://theproc.es/2012/1/10/66313/menus-deplegables-con-jquery</guid>
      <pubDate>Tue, 10 Jan 2012 22:22:00 +0100</pubDate>
    </item>
    <item>
      <title>Scroll con jQuery</title>
      <link>http://theproc.es/2012/1/5/65927/scroll-con-jquery</link>
      <description>&lt;p&gt;En el nuevo dise&amp;ntilde;o de &lt;a href="http://www.axtro.es/" target="_blank"&gt;www.axtro.es&lt;/a&gt; necesitabamos un efecto de scroll suave de una secci&amp;oacute;n a la siguiente. Mi primera idea era simplemente usar uno de los varios Plugins de jQuery, pero todos los que prob&amp;eacute; ten&amp;iacute;an problemas y como descubr&amp;iacute; despu&amp;eacute;s, realmente no hace falta un plugin porque es muy f&amp;aacute;cil programarlo en pocas l&amp;iacute;neas:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(function(){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;$('a.scroll_demo[href^="#"]').click(function(e){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var hash = $(this).attr('href'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;posicionNueva = $(hash).offset().top; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$("body,html,document").animate( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{scrollTop:posicionNueva}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'slow', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function(){ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.location.hash = hash; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.preventDefault(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;});&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;El c&amp;oacute;digo de arriba se usa en esta misma entrada en el ejemplo de abajo. Repasemos el c&amp;oacute;digo l&amp;iacute;nea por l&amp;iacute;nea:&lt;br /&gt; Lo que queremos es que todos los enlaces que no apunten a otra p&amp;aacute;gina sino simplemente a un ancla de la p&amp;aacute;gina actual tengan el nuevo comportamiento. Con el selector en &lt;code&gt;$('a.scroll_demo[href^="#"]')&lt;/code&gt; lo conseguimos, buscando s&amp;oacute;lo los enlaces cuyo atributo &lt;code&gt;href&lt;/code&gt; empieza con un &lt;code&gt;#&lt;/code&gt;. En este ejemplo tambi&amp;eacute;n he incluido la restricci&amp;oacute;n de que el enlace tiene que tener la clase &lt;code&gt;scroll_demo&lt;/code&gt; para no interferir con el resto del blog.&lt;/p&gt;
&lt;p&gt;En cuanto el usuario pincha en uno de estos enlaces, sacamos primero el valor del &lt;code&gt;href&lt;/code&gt; con &lt;code&gt;hash = $(this).attr('href')&lt;/code&gt; y despu&amp;eacute;s obtenemos la distancia entre el principio del documento y el principio del ancla con &lt;code&gt;posicionNueva = $(hash).offset().top&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Con esto ya tenemos todo para empezar el scroll: &lt;code&gt;$("body,html,document").animate({scrollTop:posicionNueva}, 'slow')&lt;/code&gt; mover&amp;aacute; el documento para que el elemento apuntado por el enlace est&amp;eacute; visible. Es necesario incluir &lt;code&gt;body,html,document&lt;/code&gt; en el selector, para que funcione en todos los navegadores.&lt;/p&gt;
&lt;p&gt;En el ejemplo de arriba he incluido como tercer argumento la funci&amp;oacute;n &lt;code&gt;function(){window.location.hash = hash;}&lt;/code&gt;. Esta funci&amp;oacute;n se ejecutar&amp;aacute; despu&amp;eacute;s de finalizar la animaci&amp;oacute;n del scroll. Simplemente actualiza la direcci&amp;oacute;n mostrada en el navegador para simular el comportamiento por defecto de pinchar en uno de estos enlaces.&lt;/p&gt;
&lt;p&gt;Pod&amp;eacute;is probarlo en esta misma p&amp;aacute;gina con los dos enlaces de abajo:&lt;/p&gt;
&lt;h3 id="scroll_titulo_1"&gt;T&amp;iacute;tulo 1&lt;/h3&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;
&lt;p&gt;&lt;a class="scroll_demo" href="#scroll_titulo_2"&gt;Hac&amp;iacute;a abajo&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="scroll_titulo_2"&gt;T&amp;iacute;tulo 2&lt;/h3&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;
&lt;p&gt;&lt;a class="scroll_demo" href="#scroll_titulo_1"&gt;Hac&amp;iacute;a arriba&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type="text/javascript"&gt;// &lt;![CDATA[
$(function(){
$('a.scroll_demo[href^="#"]').click(function(e){
    var hash = $(this).attr('href');
    
    $("body,html,document").animate({scrollTop:$(hash).offset().top}, 'slow', function(){
      window.location.hash = hash;
    });
    
    e.preventDefault();
  });

}

);
// ]]&gt;&lt;/script&gt;</description>
      <guid>http://theproc.es/2012/1/5/65927/scroll-con-jquery</guid>
      <pubDate>Thu, 05 Jan 2012 11:01:00 +0100</pubDate>
    </item>
    <item>
      <title>Tutorial de HTML5 - Sem&#225;ntica, parte 2</title>
      <link>http://theproc.es/2011/10/26/32745/tutorial-de-html5---semantica--parte-2</link>
      <description>&lt;p&gt;En este tutorial desarrollaremos la segunda parte del art&amp;iacute;culo anterior - &lt;a href="http://theproc.es/2010/9/3/28781/tutorial-de-html5---semantica--parte-1"&gt;Tutorial de HTML5 - Sem&amp;aacute;ntica, parte 1&lt;/a&gt;- para as&amp;iacute; dar por terminado lo relacionado a la sem&amp;aacute;ntica del HTML5.&lt;/p&gt;
&lt;p&gt;Continuaremos presentando nuevos elementos que se utilizan en el c&amp;oacute;digo de HTML5.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;aside&lt;/strong&gt;&lt;br /&gt; As&amp;iacute; como el header coincide con el concepto de un &amp;ldquo;tope superior&amp;rdquo;, el elemento &lt;strong&gt;aside&lt;/strong&gt; (en ingl&amp;eacute;s: a un lado) coincide con el concepto de una &amp;ldquo;barra lateral&amp;rdquo;. Cuando digo "barra lateral", no me estoy refiriendo a la posici&amp;oacute;n. El hecho de que algunos contenidos aparezcan a la izquierda o a la derecha del contenido principal no es raz&amp;oacute;n suficiente para utilizar el elemento &lt;strong&gt;aside&lt;/strong&gt;. Una vez m&amp;aacute;s, es el contenido el que importa, no la posici&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;El elemento &lt;strong&gt;aside&lt;/strong&gt; se debe utilizar para un contenido que est&amp;eacute; relacionado tangencialmente. Si usted tiene un contenido que considera debe estar separado del contenido principal, entonces probablemente ser&amp;iacute;a adecuado utilizar el elemento aside para que contenga esta contenido. Preg&amp;uacute;ntese si el contenido que hemos colocado dentro de &lt;strong&gt;aside&lt;/strong&gt; puede ser eliminado y esta acci&amp;oacute;n no resta o altera el significado del contenido principal del documento o de la secci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Por poner un ejemplo del tipo de contenido del que hablamos, podemos mencionar frases entrecomilladas con notable relevancia. (Imagen) Es un contenido directamente relacionado con el contenido principal, pero si se eliminara, este &amp;uacute;ltimo no perder&amp;iacute;a su comprensi&amp;oacute;n ni su estructura sem&amp;aacute;ntica.&lt;/p&gt;
&lt;p&gt;Recuerde, s&amp;oacute;lo porque su dise&amp;ntilde;o visual requiere un cierto contenido que aparezca en una barra lateral, no significa necesariamente que &lt;strong&gt;aside&lt;/strong&gt; es el contenedor que debe contener los elementos correctos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nav&lt;/strong&gt;&lt;br /&gt; El elemento &lt;strong&gt;nav&lt;/strong&gt; hace exactamente lo que usted cree. Contiene informaci&amp;oacute;n de navegaci&amp;oacute;n, por lo general una lista de enlaces.&lt;/p&gt;
&lt;p&gt;Aclaremos un poco eso. El elemento nav est&amp;aacute; destinado a la informaci&amp;oacute;n de navegaci&amp;oacute;n principal. El hecho de que un grupo de enlaces se agrupan en una lista no es raz&amp;oacute;n suficiente para utilizar el elemento nav. Toda la navegaci&amp;oacute;n del sitio, en cambio, casi con toda seguridad pertenece al elemento &lt;strong&gt;nav&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Muy a menudo, un elemento &lt;strong&gt;nav&lt;/strong&gt; aparecer&amp;aacute; dentro de un elemento header. Eso tiene sentido si se considera que el elemento header se puede utilizar para "ayudas a la navegaci&amp;oacute;n" o colocar el men&amp;uacute; principal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;article&lt;/strong&gt;&lt;br /&gt; Es correcto pensar en header, footer, nav, y aside como bloques espec&amp;iacute;ficos del elemento section. Una secci&amp;oacute;n es un trozo gen&amp;eacute;rico de contenido que est&amp;aacute; relacionado, mientras que header, footer, nav, y aside son trozos de tipos de contenido espec&amp;iacute;ficos relacionado.&lt;/p&gt;
&lt;p&gt;El elemento article es otro tipo de secci&amp;oacute;n especializada. Se utiliza como contenedor de un tipo de contenido que est&amp;eacute; relacionado consigo mismo. &amp;iquest;Dif&amp;iacute;cil de entender?&lt;/p&gt;
&lt;p&gt;Preg&amp;uacute;ntese si se sindicar&amp;aacute; el contenido en un RSS o Atom feed. Si el contenido todav&amp;iacute;a tiene sentido en ese contexto, entonces &lt;strong&gt;article&lt;/strong&gt; ser&amp;aacute; probablemente el elemento correcto a utilizar. De hecho, &lt;strong&gt;article&lt;/strong&gt; es un elemento que est&amp;aacute; dise&amp;ntilde;ado espec&amp;iacute;ficamente para sindicaci&amp;oacute;n de contenido.&lt;/p&gt;
&lt;p&gt;Si usted usa el elemento &lt;strong&gt;time&lt;/strong&gt; dentro de un elemento &lt;strong&gt;article&lt;/strong&gt;, tiene la opci&amp;oacute;n de a&amp;ntilde;adir un atributo &lt;em&gt;Boolean&lt;/em&gt;o pubdate para indicar que contiene la fecha de publicaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;nbsp; &amp;lt;header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;T&amp;iacute;tulo de la p&amp;aacute;gina&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt;Qu&amp;eacute; lindo el Sol esta ma&amp;ntilde;ana en Calcuta&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;El Cambio clim&amp;aacute;tico en la India&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt;Publicado&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;time datetime="005-10-08T15:13" pubdate&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;3:13pm 12 de Octubre de 2010&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/time&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;por Jos&amp;eacute; P&amp;eacute;rez&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Si tiene m&amp;aacute;s de un elemento &lt;em&gt;time&lt;/em&gt; en un art&amp;iacute;culo, solamente podr&amp;aacute; uno de ellos podr&amp;aacute; contener el atributo pubdate.&lt;/p&gt;
&lt;p&gt;El elemento &lt;strong&gt;article&lt;/strong&gt; es muy &amp;uacute;til para art&amp;iacute;culos de Bit&amp;aacute;coras (Blogs), noticias, comentarios, cr&amp;iacute;ticas y art&amp;iacute;culos de foros.&lt;/p&gt;
&lt;p&gt;Lo que es m&amp;aacute;s problem&amp;aacute;tico es que &lt;strong&gt;article&lt;/strong&gt; y &lt;strong&gt;section&lt;/strong&gt; son muy similares. Todo lo que les separa es la palabra o el concepto "relacionado entre s&amp;iacute;". Ser&amp;iacute;a muy f&amp;aacute;cil si existiera una regla a seguir, pero en este caso todo se basa en la "interpretaci&amp;oacute;n". Se puede tener m&amp;uacute;ltiples article dentro de una etiqueta section, se puede tener m&amp;uacute;ltiples section dentro de un &lt;strong&gt;article&lt;/strong&gt;, se pueden anidar &lt;strong&gt;article&lt;/strong&gt; dentro de article y section dentro de section. Es cuesti&amp;oacute;n de cada uno la selecci&amp;oacute;n que sem&amp;aacute;nticamente m&amp;aacute;s se adecue a uno u otro elemento teniendo en cuenta que "todo" el contenido de &lt;strong&gt;section&lt;/strong&gt; debe estar relacionado entre si, y el contenido de article, que ha sido pensado para art&amp;iacute;culos y puedan ser sindicados.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://theproc.es/2010/9/3/28781/tutorial-de-html5---semantica--parte-1"&gt;Ver primara parte del Art&amp;iacute;culo: Tutorial de HTML5 - Sem&amp;aacute;ntica, parte&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/10/26/32745/tutorial-de-html5---semantica--parte-2</guid>
      <pubDate>Wed, 26 Oct 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Plantillas Javascript con jQuery.tmpl</title>
      <link>http://theproc.es/2011/10/8/31436/plantillas-javascript-con-jquery-tmpl</link>
      <description>&lt;p&gt;Esta semana se ha anunciado el soporte oficial por parte del equipo de jQuery del plugin de plantillas desarrollado por Microsoft, jQuery.tmpl.&lt;/p&gt;

&lt;p&gt;Este plugin permite definir plantillas para renderizar contenidos de forma sencilla. Mucho m&#225;s sencillo que crear marcado HTML por medio de javascript.&lt;/p&gt;

&lt;p&gt;Voy a hacer una peque&#241;a introducci&#243;n demostrativa y para ello voy a ayudarme del c&#243;digo de un art&#237;culo anterior, &lt;a href="/2010/3/4/14880/notificador-ajax-usando-jquery"&gt;Notificador Ajax usando jQuery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;La miniaplicaci&#243;n de dicho articulo permite mostrar de forma asincrona los &#250;ltimos mensajes del timeline de TheProc.es en twitter. Para ello utiliza la API de twitter, obteniendo
el listado de tweets en formato JSON. En esta ocasi&#243;n obtendremos los tweets del timeline p&#250;blico.&lt;/p&gt;

&lt;p&gt;En el c&#243;digo del ejemplo una vez obtenidos los tweets se a&#241;adia el texto de los mismos en un simple &lt;code&gt;div&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$.ajax({
  url: 'http://api.twitter.com/1/statuses/public_timeline.json?count=15&amp;amp;callback=?',
  dataType: 'json',
  success: function(data){
    $('#status').html("");
    $(data).each(function(){
      $('#status').append("&amp;lt;div&amp;gt;"+this.text+"&amp;lt;/div&amp;gt;");
    });
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si quisieramos un marcado m&#225;s complejo nos resultaria algo tedioso y m&#225;s propenso a errores. Crear la estructura a mano, a&#241;adir las clases a mano, etc..&lt;/p&gt;

&lt;p&gt;Por ejemplo, si quisieramos crear el siguiente marcado para cada tweet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div class="tweet"&amp;gt;
  &amp;lt;div class="tweet-user-image"&amp;gt;
    &amp;lt;img src="" alt="" width="48" height="48" /&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class="tweet-content"&amp;gt;
    &amp;lt;div class="tweet-text"&amp;gt;&amp;lt;strong&amp;gt;usuario&amp;lt;/strong&amp;gt; texto&amp;lt;/div&amp;gt;
    &amp;lt;div class="tweet-meta"&amp;gt;fecha&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class="hr"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ser&#237;a algo as&#237;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$("&amp;lt;div&amp;gt;").addClass("tweet").append(
  $("&amp;lt;div&amp;gt;").addClass("tweet-user-image").append(
    $("&amp;lt;img&amp;gt;").attr({src:"", alt: "", height: 48, width: 48})
  )
).append(...);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con jQuery.tmpl es sencillo crear una plantilla para cada tweet, por ejemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script id="tweet" type="text/x-jquery-tmpl"&amp;gt;
  &amp;lt;div class="tweet"&amp;gt;
    &amp;lt;div class="tweet-user-image"&amp;gt;
      &amp;lt;img src="" alt="" width="48" height="48" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="tweet-content"&amp;gt;
      &amp;lt;div class="tweet-text"&amp;gt;&amp;lt;strong&amp;gt;usuario&amp;lt;/strong&amp;gt; texto&amp;lt;/div&amp;gt;
      &amp;lt;div class="tweet-meta"&amp;gt;fecha&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="hr"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como se puede ver se crea la plantilla dentro de un elemento &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; (puede crearse tambien como cadena de car&#225;cteres si no queremos tenerla definida en el propio HTML)
con un &lt;code&gt;id&lt;/code&gt;. Utilizamos el &lt;code&gt;id&lt;/code&gt; para compilar y renderizar la plantilla con los datos que le pasemos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('#tweets').tmpl(datos);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Los datos que pasamos es un objeto JSON. Dicho objeto contendr&#225; una lista de tweets ofrecidos por Twitter con los siguientes datos en su estructura:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[{
  text: "texto del tweet",
  createt_at: "fecha de creacion del tweet",
  user: {
    screen_name: "Nombre corto del usuario",
    profile_image_url: "url de avatar de usuario"
  }
}...]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Accedemos a esas propiedades en la plantilla con el tag &lt;code&gt;${nombre_de_variable}&lt;/code&gt;, por ejemplo &lt;code&gt;${user.name}&lt;/code&gt;, &lt;code&gt;${text}&lt;/code&gt;, etc..&lt;/p&gt;

&lt;p&gt;La plantilla para los tweets ser&#237;a la siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script id="tweet" type="text/x-jquery-tmpl"&amp;gt;
  &amp;lt;div class="tweet"&amp;gt;
    &amp;lt;div class="tweet-user-image"&amp;gt;
      &amp;lt;img src="${user.profile_image_url}" alt="${ user.screen_name }" width="48" height="48" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="tweet-content"&amp;gt;
      &amp;lt;div class="tweet-text"&amp;gt;&amp;lt;strong&amp;gt;${user.screen_name}&amp;lt;/strong&amp;gt; ${text}&amp;lt;/div&amp;gt;
      &amp;lt;div class="tweet-meta"&amp;gt;${created_at}&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="hr"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para renderizar esta plantilla hariamos lo siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('#tweets').tmpl(data).appendTo("#status");
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;#status&lt;/code&gt; es el div donde se mostrar&#225;n los tweets.&lt;/p&gt;

&lt;p&gt;La llamada ajax quedar&#237;a de la siguiente manera:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$.ajax({
    url: 'http://api.twitter.com/1/statuses/public_timeline.json?count=15&amp;amp;callback=?',
    dataType: 'json',
    success: function(data){
      $('#status').html("");
      $("#tweet").tmpl(data).appendTo("#status");
    }
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Muy limpio y pontente. Si ahora queremos modificar la plantilla es mucho m&#225;s sencillo que enredar con m&#233;todos y funciones jQuery.&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/10/8/31436/plantillas-javascript-con-jquery-tmpl</guid>
      <pubDate>Sat, 08 Oct 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Sacar fotos de una webcam con Javascript y Flash</title>
      <link>http://theproc.es/2011/10/5/31186/sacar-fotos-de-una-webcam-con-javascript-y-flash</link>
      <description>&lt;p&gt;Hace poco descubr&amp;iacute; dos librer&amp;iacute;as Javascript, &lt;a href="http://code.google.com/p/jpegcam/" target="_blank"&gt;jpegcam&lt;/a&gt; y &lt;a href="http://www.xarg.org/project/jquery-webcam-plugin/" target="_blank"&gt;jQuery Webcam Plugin&lt;/a&gt; que permiten sacar fotos de una webcam y subirlo a nuestro servidor. L&amp;oacute;gicamente no se puede hacer&amp;nbsp;solamente&amp;nbsp;con Javascript. Por eso las librer&amp;iacute;as utilizan un peque&amp;ntilde;o Flash para controlar la webcam. Puede ser interesante usarlo en algunas de nuestras p&amp;aacute;ginas, por ejemplo en formularios de comentarios para ayudarle al usuario a crear un avatar. Hoy voy a presentar jpegcam, simplemente porque no depende de ninguna librer&amp;iacute;a y por lo tanto se puede usar f&amp;aacute;cilmente en cualquier p&amp;aacute;gina web.&lt;/p&gt;
&lt;p&gt;Para empezar, lo primero que tenemos que hacer es incluir el archivo javascript de jpegcam en nuestra p&amp;aacute;gina:&lt;/p&gt;
&lt;pre&gt;&lt;code class="javascript"&gt;
&amp;lt;script src="webcam.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Entonces podemos configurar algunas opciones de la librer&amp;iacute;a para adaptarla a nuestro entorno:&lt;/p&gt;
&lt;pre&gt;&lt;code class="javascript"&gt;
webcam.set_api_url('test.php');
webcam.set_swf_url('/themes/theproces/data/webcam.swf');
webcam.set_quality(90);
webcam.set_shutter_sound(true);
webcam.shutter_url = '/themes/theproces/data/shutter.mp3';
webcam.set_hook("onLoad", null);
webcam.set_hook("onComplete", null);
webcam.set_hook("onError", null);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Las posibles opciones son:&lt;/p&gt;
&lt;dl&gt; &lt;dt&gt;set_api_url&lt;/dt&gt;&lt;dd&gt;La URL a donde queremos enviar la imagen&lt;/dd&gt; &lt;dt&gt;set_swf_url&lt;/dt&gt;&lt;dd&gt;La URL donde hemos guardado la pel&amp;iacute;cula flash de jpegcam&lt;/dd&gt; &lt;dt&gt;set_quality&lt;/dt&gt;&lt;dd&gt;La calidad para crear el JPEG&lt;/dd&gt; &lt;dt&gt;set_shutter_sound&lt;/dt&gt;&lt;dd&gt;Si queremos reproducir un sonido o no al sacar una foto&lt;/dd&gt; &lt;dt&gt;shutter_url&lt;/dt&gt;&lt;dd&gt;La URL del archivo MP3 usado para el sonido de arriba&lt;/dd&gt; &lt;dt&gt;set_hook&lt;/dt&gt;&lt;dd&gt;Aqu&amp;iacute; podemos definir funciones a las que llamar&amp;aacute; la librer&amp;iacute;a seg&amp;uacute;n el evento. El evento 'onLoad' pasa despu&amp;eacute;s de haber cargado la librer&amp;iacute;a. 'onComplete' despu&amp;eacute;s de haber subido la imagen a nuestro servidor. 'onError' en caso de alg&amp;uacute;n error de trasmisi&amp;oacute;n.&lt;/dd&gt; &lt;/dl&gt;
&lt;p&gt;Para insertar el HTML de la pel&amp;iacute;cula Flash en nuestra p&amp;aacute;gina podemos usar el siguiente c&amp;oacute;digo:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;
&amp;lt;div&amp;gt;
  &amp;lt;script&amp;gt;
    document.write(webcam.get_html(320, 240));
  &amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El c&amp;oacute;digo de arriba simplemente inserta el HTML necesario en el sitio donde lo ejecutamos. Podemos pasar dos par&amp;aacute;metros, el ancho y el alto del elemento. Las dimensiones m&amp;iacute;nimas son 214 por 137 p&amp;iacute;xeles. Normalmente deber&amp;iacute;amos usar 320 por 240 o 640 por 480 p&amp;iacute;xeles, ya que cualquier webcam deber&amp;iacute;a tener soporte para estas dimensiones.&lt;/p&gt;
&lt;p&gt;Ahora podemos cargar la p&amp;aacute;gina y deber&amp;iacute;amos ver un di&amp;aacute;logo de Flash pregunt&amp;aacute;ndonos si permitimos el acceso a la webcam. Pinchamos en 'Ok' y veremos nuestra cara ;-)&lt;/p&gt;
&lt;p&gt;Controlamos la webcam con 2 m&amp;eacute;todos de la librer&amp;iacute;a, 'freeze' para hacer una grabaci&amp;oacute;n y 'reset' para descartar la grabaci&amp;oacute;n hecha con 'freeze'. Si nos gusta el resultado lo podemos enviar al servidor con el m&amp;eacute;todo 'upload'.&lt;/p&gt;
&lt;pre&gt;&lt;code class="javascript"&gt;
webcam.freeze(); // Grabamos la imagen actual
webcam.upload(); // La subimos al servidor
webcam.reset(); // Reseteamos la webcam
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hasta aqu&amp;iacute; muy f&amp;aacute;cil. El &amp;uacute;nico problema con estas dos librer&amp;iacute;as es que no env&amp;iacute;an la imagen en el formato que por ejemplo generar&amp;iacute;a un formulario normal de HTML. Por lo tanto requieren un c&amp;oacute;digo diferente en el servidor. El siguiente ejemplo muestra c&amp;oacute;mo leerlo en PHP (sacado de la p&amp;aacute;gina de jpegcam).&lt;/p&gt;
&lt;pre&gt;&lt;code class="php"&gt;
$jpeg_data = file_get_contents('php://input');
$filename = "my_file.jpg";
$result = file_put_contents( $filename, $jpeg_data );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Primero leemos la imagen con 'file_get_contents'. Despu&amp;eacute;s la guardamos con el nombre 'my_file.jpg'&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/10/5/31186/sacar-fotos-de-una-webcam-con-javascript-y-flash</guid>
      <pubDate>Wed, 05 Oct 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Tutorial de c&#243;mo a&#241;adir un Favicon a tu web.</title>
      <link>http://theproc.es/2011/10/3/31056/tutorial-de-como-anadir-un-favicon-a-tu-web-</link>
      <description>&lt;p&gt;Un Favicon es una peque&amp;ntilde;a im&amp;aacute;gen, un icono visible en los navegadores al costado de la URL o en las pesta&amp;ntilde;as de los navegadores actuales.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Favicon url" height="32" src="/files/8295" title="Favicon url" width="190" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Favicon en las pesta&amp;ntilde;as" height="83" src="/files/8297" title="Favicon en las pesta&amp;ntilde;as" width="297" /&gt;&lt;/p&gt;
&lt;p&gt;Para crear un Favicon, e implementarlo en tu web, podemos seguir los siguientes pasos.&lt;/p&gt;
&lt;p&gt;Se necesitar&amp;aacute;n:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un editor de im&amp;aacute;genes que guarde en formato .ico&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La imagen debe medir 16 x 16 px.&lt;/li&gt;
&lt;li&gt;16 colores (4 bits);&lt;/li&gt;
&lt;li&gt;Formato ICO, &lt;strong&gt;no BMP&lt;/strong&gt;, &lt;strong&gt;no GIF&lt;/strong&gt;, &lt;strong&gt;no JPG&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Algunos navegadores permiten iconos m&amp;aacute;s grandes, una gama crom&amp;aacute;tica m&amp;aacute;s amplia y otros formatos. LO cierto es que si queires con certeza que el favicon se vea en todos deber&amp;aacute; seguir las caracter&amp;iacute;sticas expuestas, &lt;strong&gt;16x16&lt;/strong&gt; px, con &lt;strong&gt;16 colores&lt;/strong&gt; y en &lt;strong&gt;formato ICO&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modificar el HTML con un editor de texto&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Demos declarar en nuestras p&amp;aacute;ginas para que los navegadores lo reconozcan, la existencia de ese Favicon. Hay que a&amp;ntilde;adir el siguiente c&amp;oacute;digo teni&amp;eacute;ndo en cuenta la ruta donde hayas guardado previamente al imagen. El c&amp;oacute;digo se debe escribir entre las etiquetas &lt;code&gt;&amp;lt;HEAD&amp;gt;&lt;/code&gt; y &lt;code&gt;&amp;lt;/HEAD&amp;gt;&lt;/code&gt; de tus ficheros HTML.&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &amp;lt;link rel="shortcut icon" href="http://www.tudominio.com/favicon.ico"&amp;gt;&lt;br /&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;o por ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &amp;lt;link rel="shortcut icon" href="http://www.undominio.com/directorio/favicon.ico"&amp;gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Subir las modificaciones mediante un programa de ftp o de transferencia de archivos.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Otra forma muy efectiva es accediendo a la siguiente web y siguiendo los pasos que te dicen. En principio te ahorras tener que editar t&amp;uacute; el icono, ya que con subir una imagen la web te devuelve un archivo con el ico listo para la p&amp;aacute;gina.&lt;/p&gt;
&lt;p&gt;http://www.html-kit.com/favicon/&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/10/3/31056/tutorial-de-como-anadir-un-favicon-a-tu-web-</guid>
      <pubDate>Mon, 03 Oct 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Textareas redimensionables autom&#225;ticamente con jQuery</title>
      <link>http://theproc.es/2011/9/17/29821/textareas-redimensionables-automaticamente-con-jquery</link>
      <description>&lt;p&gt;
&lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&gt;
En un art&amp;iacute;culo anterior se propuso un un &lt;a href="/2010/4/7/17376/cambiar-la-altura-de-textareas-automaticamente-con-prototype"&gt;plugin de Prototype para conseguir textareas redimensionables autom&amp;aacute;ticamente&lt;/a&gt; al estilo Facebook.&lt;/p&gt;
&lt;p&gt;En &amp;eacute;l se explica la t&amp;eacute;cnica de usar un &lt;code&gt;textarea&lt;/code&gt; oculto para calcular la altura del contenido y cambiar la del &lt;code&gt;textarea&lt;/code&gt; donde estamos escribiendo.&lt;/p&gt;
&lt;p&gt;En un proyecto reciente he dado ese comportamiento a los &lt;code&gt;textarea&lt;/code&gt; para los comentarios de los usuarios pero utilizando el framework jQuery.&lt;/p&gt;
&lt;p&gt;Para ello he creado un plugin que pod&amp;eacute;is descargar que utiliza la t&amp;eacute;cnica del &lt;code&gt;div&lt;/code&gt; no visible, es decir, cuando el contenido del &lt;code&gt;textarea&lt;/code&gt; cambia, copiamos su contenido en un &lt;code&gt;div&lt;/code&gt; no visible. &amp;Eacute;ste div adapta su altura autom&amp;aacute;ticamente al contenido y entonces la usamos para establecer la altura del &lt;code&gt;textarea&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Su sintaxis es la siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(element).autogrow();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y acepta una opci&amp;oacute;n de configuraci&amp;oacute;n, la altura m&amp;aacute;xima que alcanzar&amp;aacute; el &lt;code&gt;textarea&lt;/code&gt;. Por ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$('textarea.autogrow').autogrow({maxHeight: 200});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aqu&amp;iacute; podeis ver el resultado:&lt;/p&gt;
&lt;p&gt;&lt;textarea class="autogrow"&gt;&lt;/textarea&gt;&lt;/p&gt;
&lt;script type="text/javascript"&gt;// &lt;![CDATA[
(function($){
        var opts;
        $.fn.autogrow = function(options){
          opts = $.extend({}, $.fn.autogrow.defaults, options);

          return $(this).each(function(){
            var $this = $(this);
            var minHeight = parseInt($this.css('height'));

            var maxHeight = opts.maxHeight;
            var lineHeight = parseInt($this.css('line-height'));
            if (isNaN(lineHeight)) lineHeight = parseInt($this.css('font-size'));

            var $shadow = $('&lt;div&gt;')
              .css({
                'position': 'absolute',
                'top':  -10000,
                'left': -10000,
                'width': $(this).css('width'),
                'line-height': $this.css('line-height'),
                'font-size': $this.css('font-size'),
                'font-family': $this.css('font-family')
              })
              .html($this.html())
              .appendTo('body');

            var updateTextArea = function(){
              var content = $this.val().replace("&lt;","").replace("&gt;", "").replace(/\n/g, '&lt;br /&gt;');

              $shadow.html(content);
              var height = $shadow.height() + lineHeight;

              $this.css({
                'height': Math.max(Math.min(maxHeight, height), minHeight)
              });

              if($this.height() &gt;= maxHeight){
                $(this).css({'overflow-y':'auto'});
              }else{
                $(this).css({'overflow-y':'hidden'});
              }
            }

            $this.change(updateTextArea).keyup(updateTextArea).keydown(updateTextArea);
          });

        };

        $.fn.autogrow.defaults = {
          maxHeight: 100
        };
      })(jQuery);

  jQuery(document).ready(function(){
    jQuery('textarea.autogrow').autogrow({maxHeight: 200});
  });
// ]]&gt;&lt;/script&gt;</description>
      <guid>http://theproc.es/2011/9/17/29821/textareas-redimensionables-automaticamente-con-jquery</guid>
      <pubDate>Sat, 17 Sep 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Tutorial de HTML5 - Sem&#225;ntica, parte 1</title>
      <link>http://theproc.es/2011/9/3/28781/tutorial-de-html5---semantica--parte-1</link>
      <description>&lt;p&gt;HTML5 introduce nuevos elementos "inline" muy &amp;uacute;tiles para aumentar nuestro existente arsenal de "span, strong, em, abbr, etc". A partir de ahora a estos elementos ya no se les llamar&amp;aacute; "inline", sino &amp;ldquo;text-level semantics.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mark&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cuando revisamos un listado de una b&amp;uacute;squeda en una web, usualmente vemos el t&amp;eacute;rmino por el que hemos buscado iluminado o resaltado dentro de cada resultado. Por lo general se marca cada instancia del t&amp;eacute;rmino de b&amp;uacute;squeda con un elemento &lt;strong&gt;span&lt;/strong&gt;, pero &lt;strong&gt;span&lt;/strong&gt; desde un punto de vista sem&amp;aacute;ntico, se queda un poco cojo, ya que realmente sirve para poco m&amp;aacute;s que aplicarle una clase espec&amp;iacute;fica a un elemento dentro de un estilo ya definido.&lt;/p&gt;
&lt;p&gt;Se podr&amp;iacute;a utilizar &lt;strong&gt;em&lt;/strong&gt; o &lt;strong&gt;strong &lt;/strong&gt;pero sem&amp;aacute;nticamente no ser&amp;iacute;a correcto ya que no querr&amp;iacute;as otorgarle una &amp;ldquo;importancia&amp;rdquo; al t&amp;eacute;rmino de b&amp;uacute;squeda, simplemente queremos que de alguna manera quede resaltado.&lt;/p&gt;
&lt;p&gt;Introduzcamos el elemento &lt;strong&gt;mark&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;h1&amp;gt;Resultado de b&amp;uacute;squeda para 'unicornio'&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;ol&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;a href="http://www.3sellers.com/"&amp;gt;Leyendo el Gran &amp;lt;mark&amp;gt;unicornio&amp;lt;/mark&amp;gt; azul.&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;El elemento mark no lleva impl&amp;iacute;cito ninguna importancia para el contenido salvo el mostrarlo como algo de inter&amp;eacute;s en el contexto en que est&amp;eacute;. Seg&amp;uacute;n la especificaci&amp;oacute;n, mark denota fragmento de texto de un documento marcado o iluminado con fines de referencia debido a su importancia en otro contexto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;meter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El elemento &lt;strong&gt;meter&lt;/strong&gt; puede ser utilizado para marcar medidas, siempre que esas medidas sean parte de una escala con valores m&amp;iacute;nimos y m&amp;aacute;ximos.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;meter&amp;gt;9 de 10 gatos&amp;lt;/meter&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;No es obligatorio escribir el valor m&amp;aacute;ximo si no quiere, para eso se puede utilizar el atributo &lt;strong&gt;max&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;meter max="10"&amp;gt;9 gatos&amp;lt;/meter&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Existe un atributo &lt;strong&gt;min&lt;/strong&gt; correspondiente. Tambi&amp;eacute;n se puede utilizar los atributos &lt;strong&gt;high&lt;/strong&gt;, &lt;strong&gt;low&lt;/strong&gt;, y &lt;strong&gt;optimum&lt;/strong&gt;. Si lo desea, puede incluso ocultar la medici&amp;oacute;n dentro del atribulo &lt;strong&gt;value&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;meter low="-273" high="100" min="12" max="30" optimum="21" value="25"&amp;gt;Hace bastante calor en esta &amp;eacute;poca del a&amp;ntilde;o.&amp;lt;/meter&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;progress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mientras el elemento &lt;strong&gt;meter&lt;/strong&gt; es muy bueno para describir algo que ya ha sido medido. El elemento &lt;strong&gt;progress&lt;/strong&gt; te permite marcar un valor que est&amp;aacute; en proceso de cambio.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;Su perfil est&amp;aacute; &amp;lt;progress&amp;gt;60%&amp;lt;/progress&amp;gt; completado.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Otra vez se pueden utilizar los atributos &lt;strong&gt;min&lt;/strong&gt;, &lt;strong&gt;max&lt;/strong&gt;, y &lt;strong&gt;value&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;progress min="0" max="100" value="60"&amp;gt;&amp;lt;/progress&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;El elemento &lt;strong&gt;progress&lt;/strong&gt; es m&amp;aacute;s &amp;uacute;til cuando se utiliza combinado con DOM Scripting. Se puede utilizar JavaScript para actualizaciones din&amp;aacute;micas del valor, permitiendo al navegador comunicar el cambio al usuario. Muy &amp;uacute;til para cargar archivos con Ajax.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Estructura&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTML5 presenta una estructura basada en la experiencia de los desarrolladores de HTML y CSS. Tras haber valorado un mill&amp;oacute;n de p&amp;aacute;ginas y haber tabulado los nombres m&amp;aacute;s comunes que se le asigna a los elementos class, nombres como &amp;ldquo;header, footer y nav&amp;rdquo; prevalecieron.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;section&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El elemento &lt;strong&gt;section&lt;/strong&gt; es usado para agrupar por temas contenido relacionado. Eso suena muy similar al elemento &lt;strong&gt;div&lt;/strong&gt;, que suele utilizarse como contenedor de contenido gen&amp;eacute;rico. La diferencia es que &lt;strong&gt;div&lt;/strong&gt; no tiene sentido en la sem&amp;aacute;ntica; no te dice nada sobre el contenido que lleva dentro. El elemento &lt;strong&gt;section&lt;/strong&gt;, por otra parte, se utiliza de forma expl&amp;iacute;cita para agrupar contenido relacionado.&lt;/p&gt;
&lt;p&gt;Usted podr&amp;iacute;a sustituir a algunos de sus elementos &lt;strong&gt;div&lt;/strong&gt; con elementos &lt;strong&gt;section&lt;/strong&gt;, pero recuerde siempre preguntarse &amp;iquest;Est&amp;aacute; todo el contenido relacionado?&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;h1&amp;gt;&lt;strong&gt;Ave del para&amp;iacute;so&lt;/strong&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt; Narrativa polic&amp;iacute;aca y de intriga/Novela negra.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt; CAROL JOICE&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;header&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Especialistas en HTML5 describen al elemento &lt;strong&gt;header&lt;/strong&gt; como un contenedor de &amp;ldquo;&lt;em&gt;a group of introductory or navigational aids", &lt;/em&gt;que viene siendo algo como: elementos que sirven como introducci&amp;oacute;n o elemento para la navegaci&amp;oacute;n. Eso suena razonable. Ese es el tipo de contenido que yo esperar&amp;iacute;a encontrar en un encabezado, y en ingl&amp;eacute;s la palabra "header" se utiliza a menudo como sin&amp;oacute;nimo de cabecera (&lt;em&gt;masthead&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Existe una diferencia crucial entre el elemento &lt;strong&gt;header&lt;/strong&gt; en HTML5 y el uso aceptado y generalizado de la palabra&amp;nbsp; encabezado o cabecera. Por lo general en una p&amp;aacute;gina existe una sola cabecera pero un documento puede tener m&amp;uacute;ltiples encabezados, o lo que ser&amp;iacute;a lo mismo m&amp;uacute;ltiple elementos &amp;ldquo;&lt;strong&gt;header&lt;/strong&gt;&amp;rdquo;. Se puede utilizar un elemento &lt;strong&gt;header &lt;/strong&gt;dentro de un elemento &lt;strong&gt;section &lt;/strong&gt;&amp;nbsp;por ejemplo. Las especificaciones describen los elementos &lt;strong&gt;section &lt;/strong&gt;como &amp;ldquo;a thematic grouping of content, typically with a heading&amp;rdquo;, o sea, una agrupaci&amp;oacute;n tem&amp;aacute;tica de contenido, generalmente con un encabezado.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;h1&amp;gt;&lt;strong&gt;Ave del para&amp;iacute;so&lt;/strong&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt;Narrativa polic&amp;iacute;aca y de intriga/Novela negra.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt;CAROL JOICE&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;El elemento &lt;strong&gt;header&lt;/strong&gt; aparecer&amp;aacute; por lo general en la parte superior de un documento o &lt;strong&gt;section&lt;/strong&gt;, no tiene que ser as&amp;iacute; obligatoriamente. Ha sido definido por su contenido &amp;mdash;introductorio o elemento para la navegaci&amp;oacute;n&amp;mdash; sea cual sea su posici&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;footer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Como el elemento &lt;strong&gt;header&lt;/strong&gt;, &lt;strong&gt;footer&lt;/strong&gt; (pie) suena como su descripci&amp;oacute;n y ubicaci&amp;oacute;n. En cambio, el elemento &lt;strong&gt;footer&lt;/strong&gt; deber&amp;aacute; contener informaci&amp;oacute;n sobre sus elementos de contenido: quien lo escribi&amp;oacute;, informaci&amp;oacute;n de copyright, enlaces a contenido relacionado, etc.&lt;/p&gt;
&lt;p&gt;Mientras estamos acostumbrados a tener un pie para todo un documento, HTML5 nos permite tambi&amp;eacute;n tienen pies dentro de las secciones.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;h1&amp;gt;&lt;strong&gt;Ave del para&amp;iacute;so&lt;/strong&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt;Narrativa polic&amp;iacute;aca y de intriga/Novela negra.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;p&amp;gt;CAROL JOICE&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/9/3/28781/tutorial-de-html5---semantica--parte-1</guid>
      <pubDate>Sat, 03 Sep 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Tutorial HTML5 &#8211; Browsers y doctype</title>
      <link>http://theproc.es/2011/8/20/27733/tutorial-html5-&#8211;-browsers-y-doctype</link>
      <description>&lt;p&gt;EL !DOCTYPE (Document Type Declaration) es usado tradicionalmente para especificar a los navegadores el lenguaje y/o versi&amp;oacute;n con el que est&amp;aacute; escrito un documento HTML.&lt;br /&gt;&lt;br /&gt;El doctype para HTML 4.01 tiene la siguiente apariencia:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Este es el doctype para XHTML 1.0:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;No est&amp;aacute;n escritos en lenguaje "humano" pero simplemente vienen a decir algo as&amp;iacute;: &amp;ldquo;este documento ha sido escrito en HTML 4.01&amp;rdquo; o &amp;ldquo;este documento ha sido escrito en XHTML 1.0.&amp;rdquo;&lt;br /&gt;&lt;br /&gt;Se podr&amp;iacute;a esperar que para &lt;strong&gt;HTML5&lt;/strong&gt; la declaraci&amp;oacute;n del doctype fuera &amp;ldquo;este documento ha sido escrito en &lt;strong&gt;HTML5&lt;/strong&gt;&amp;rdquo; deber&amp;iacute;a tener un n&amp;uacute;mero 5 en alg&amp;uacute;n sitio, pues no, el doctype para &lt;strong&gt;HTML5&lt;/strong&gt; quedar&amp;iacute;a as&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Cuando lo vemos por primera vez nos puede resultar raro no encontrar un n&amp;uacute;mero de versi&amp;oacute;n, y sobre todo, &amp;iquest;c&amp;oacute;mo se especificar&amp;aacute;n futuras versiones de HTML? &amp;iquest;Realmente piensan que esta ser&amp;aacute; la definitiva?&lt;br /&gt;&lt;br /&gt;Deteng&amp;aacute;monos a pensarlo por un momento, el doctype de &lt;strong&gt;HTML5&lt;/strong&gt; es muy pragm&amp;aacute;tico. Debemos tener en cuenta que una de las premisas de &lt;strong&gt;HTML5&lt;/strong&gt; es que tiene que soportar el contenido existente, el doctype de &lt;strong&gt;HTML5 &lt;/strong&gt;deber&amp;aacute; poderse aplicar a documentos ya escritos en&amp;nbsp; HTML 4.01 o XHTML 1. Las futuras versiones de HTML deber&amp;aacute;n tambi&amp;eacute;n soportar el contenido en &lt;strong&gt;HTML5&lt;/strong&gt;, por lo que ponerle un n&amp;uacute;mero no ser&amp;iacute;a lo m&amp;aacute;s conveniente. &lt;br /&gt;&lt;br /&gt;La verdad es que el doctype no es lo m&amp;aacute;s importante. Supongamos que tenemos un documento con un doctype para HTML 4.01. Si ese documento contiene elementos de otras especificaciones, como HTML 3.2 o &lt;strong&gt;HTML5&lt;/strong&gt;, el navegador mostrar&amp;aacute; esa parte del documento. Los navegadores soportan funcionalidades no doctypes.&lt;/p&gt;
&lt;h3&gt;HTML5 &amp;ndash; Simplificando&lt;/h3&gt;
&lt;p&gt;El doctype no es la &amp;uacute;nica cosa que se ha simplificado en &lt;strong&gt;HTML5&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Si usted quiere especificar la codificaci&amp;oacute;n de caracteres del marcado de un documento, la mejor forma es asegurarnos que el servidor env&amp;iacute;a en correcto &lt;span style="color: #3366ff;"&gt;Content-Type&lt;/span&gt; del header. Si quiere estar doblemente seguro puede especificar los caracteres utilizando la etiqueta &lt;span style="color: #3366ff;"&gt;&amp;lt;meta&amp;gt;&lt;/span&gt;. Aqu&amp;iacute; podemos ver c&amp;oacute;mo se utiliza la etiqueta meta para un documento escrito en HTML 4.01:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As&amp;iacute; ser&amp;iacute;a en &lt;strong&gt;HTML5&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;meta charset="UTF-8"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La etiqueta &lt;span style="color: #3366ff;"&gt;&amp;lt;script&amp;gt;&lt;/span&gt; tambi&amp;eacute;n sufri&amp;oacute; algunas simplificaciones. Es com&amp;uacute;n a&amp;ntilde;adir un atributo type con el valor de &amp;ldquo;&lt;span style="color: #3366ff;"&gt;text/javascript&lt;/span&gt;&amp;rdquo; a los elementos script: &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;script type="text/javascript" src="file.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Los navegadores&amp;nbsp; no necesitas ese atributo. Ellos asumen que es script est&amp;aacute; escrito en&amp;nbsp; JavaScript, el lenguaje de programaci&amp;oacute;n m&amp;aacute;s popular&amp;nbsp; the most popular en la web.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;script src="file.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De la misma manera no es necesario especificar el valor type de &amp;ldquo;&lt;span style="color: #3366ff;"&gt;text/css&lt;/span&gt;&amp;rdquo; cada vez que se enlaza a un fichero CSS:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;link rel="stylesheet" type="text/css" href="file.css"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simplemente se escribe:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3366ff;"&gt;&amp;lt;link rel="stylesheet" href="file.css"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estas son algunas de las caracter&amp;iacute;sticas de &lt;strong&gt;HTML5&lt;/strong&gt;, pr&amp;oacute;ximamente seguiremos present&amp;aacute;ndolo.&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/8/20/27733/tutorial-html5-&#8211;-browsers-y-doctype</guid>
      <pubDate>Sat, 20 Aug 2011 00:00:00 +0200</pubDate>
    </item>
    <item>
      <title>Personalizando las alertas javascript</title>
      <link>http://theproc.es/2011/8/20/27734/personalizando-las-alertas-javascript</link>
      <description>&lt;p&gt;En el siguiente art&amp;iacute;culo voy a sobreescribir la funci&amp;oacute;n javascript &lt;code&gt;window.alert()&lt;/code&gt; para mostrar una ventana de dialogo mas atractiva visualmente. Para ello voy a utilizar la librer&amp;iacute;a &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt;, los &lt;a href="http://www.zurb.com/article/266/super-awesome-buttons-with-css3-and-rgba"&gt;awesome buttons&lt;/a&gt; de &lt;a href="http://www.zurb.com/"&gt;Zurb.com&lt;/a&gt; y me voy a basar en el dise&amp;ntilde;o de los dialogos de &lt;a href="http://facebook.com"&gt;Facebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Resultado final" src="/files/7904" width="560" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; En el siguiente tutorial voy a utilizar un &lt;a href="http://www.google.com/chrome?hl=es"&gt;navegador web de verdad&lt;/a&gt; y voy a utilizar propiedades CSS3, por lo el dise&amp;ntilde;o final no va a ser id&amp;eacute;ntico en Internet Explorer 6,7,8. En caso de querer compatibilidad con estas versiones del navegador bastar&amp;iacute;a con crear una hoja de estilos especifica, sin embargo en este tutorial no se va a contemplar esta opci&amp;oacute;n.&lt;/p&gt;
&lt;h2&gt;HTML&lt;/h2&gt;
&lt;p&gt;El c&amp;oacute;digo HTML del di&amp;aacute;logo se generar&amp;aacute; mediante javascript y se insertar&amp;aacute; al final de la etiqueta &lt;code&gt;body&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El c&amp;oacute;digo HTML ser&amp;aacute; el siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div id="dialog"&amp;gt;
  &amp;lt;div id="dialog-wrapper"&amp;gt;

    &amp;lt;h1&amp;gt;Titulo&amp;lt;/h1&amp;gt;

    &amp;lt;div id="dialog-content"&amp;gt;
      &amp;lt;p&amp;gt;Content&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div id="dialog-content"&amp;gt;
      &amp;lt;!-- Bot&amp;oacute;n CSS3 --&amp;gt;
      &amp;lt;a class="awesome small orange"&amp;gt;Aceptar&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;

  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;CSS&lt;/h2&gt;
&lt;p&gt;El elemento con id &lt;code&gt;#dialog&lt;/code&gt; servir&amp;aacute; para posicionar el dialogo en el centro de la ventana respecto al eje Y. As&amp;iacute; pues tendr&amp;aacute; posici&amp;oacute;n &lt;strong&gt;absoluta&lt;/strong&gt; y definir&amp;aacute; la propiedad &lt;code&gt;top&lt;/code&gt; con un valor inicial de 150px.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#dialog{
  position: absolute;
  top: 150px;
  width: 100%;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El elemento con id &lt;code&gt;#dialog-wrapper&lt;/code&gt; servir&amp;aacute; para centrar el dialogo a lo ancho, establecer&amp;aacute; su ancho y mostrar&amp;aacute; el borde semitrasparente.&lt;/p&gt;
&lt;p&gt;Es importante indicar que este elemento no puede tener un &lt;code&gt;background-color&lt;/code&gt; ya que este color quedar&amp;iacute;a por debajo del borde transparente y entonces no se apreciar&amp;iacute;a el efecto.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#dialog-wrapper{
  border: 10px solid rgba(150, 150, 150, 0.7);
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -mox-border-radius: 10px;
  margin: 0 auto;
  width: 500px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Los siguientes elementos &lt;code&gt;h1, #dialog-content y #dialog-footer&lt;/code&gt; no tienen mucho que resaltar.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#dialog h1{
  background-color: #f60;
  border: 1px solid #c30;
  border-bottom: 0;
  color: white;  
  padding: 5px 10px;
}

#dialog-content{
  background-color: white;
  border: 1px solid #666;
  border-width: 0 1px 1px;
  padding: 10px;
}

#dialog-content p{
  margin-bottom: 10px;
}

#dialog-footer{
  background: #ccc;
  border: 1px solid #666;
  border-top: 0;
  padding: 10px;
  text-align: right;  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;jQuery&lt;/h2&gt;
&lt;p&gt;Llega el momento hacerlo funcionar todo. La mayor parte del trabajo va a ser la creaci&amp;oacute;n del HTML anterior.&lt;/p&gt;
&lt;p&gt;La estructura ser&amp;aacute; la siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(function($){
  // Uso: $(document).dialog("Texto");
  //      $(document).dialog({title: "Titulo", content: "Content"});
  $.fn.dialog = function(data){
    // Inicializaci&amp;oacute;n de los datos a mostrar

    // Determinar la posici&amp;oacute;n del dialogo

    // Creaci&amp;oacute;n del dialogo
  }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Primero, debemos comprobar el tipo de objeto recibido como par&amp;aacute;metro. Si &amp;eacute;ste es una cadena entonces lo usaremos como contenido del dialogo. Si por el contrario recibimos un objeto con las propiedades &lt;code&gt;title&lt;/code&gt; y &lt;code&gt;content&lt;/code&gt; utilizaremos esta informaci&amp;oacute;n para mostrar el dialogo.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var title, content;
if(data &amp;amp;&amp;amp; data.title){ title = data.title; }else{ title = "Javascript alert"; }
if(data &amp;amp;&amp;amp; data.content){ content = data.content; }else{ content = data; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obtener la posici&amp;oacute;n donde se mostrar&amp;aacute; el dialog es sencilla. lo vamos a situar siempre a 150 px de la parte superior de la ventana, para ello tenemos que tener el cuenta el scroll de la p&amp;aacute;gina:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var currentTop = $(document).scrollTop();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La creaci&amp;oacute;n del dialogo tendr&amp;aacute; en cuenta este valor:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var $dialog = $('&amp;lt;div&amp;gt;', {id: 'dialog', css:{top: currentTop + 150}}).prependTo('body');

var $title = $('&amp;lt;h1&amp;gt;').text(title).appendTo($wrapper);
var $content = $('&amp;lt;div&amp;gt;', {id: 'dialog-content'}).html("&amp;lt;p&amp;gt;"+content+"&amp;lt;/p&amp;gt;").appendTo($wrapper);
var $footer = $('&amp;lt;div&amp;gt;', {id: 'dialog-footer'}).append(
  $('&amp;lt;a&amp;gt;', {'class': 'awesome small orange'})
    .text("Aceptar")
    .click(function(){
      $dialog.fadeOut(function(){$dialog.remove()});
      return false;
    })
  ).appendTo($wrapper);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Solo destacar la funci&amp;oacute;n del evento &lt;code&gt;click&lt;/code&gt; del bot&amp;oacute;n &lt;em&gt;aceptar&lt;/em&gt;. Esta funci&amp;oacute;n primero hace un &lt;em&gt;fadeOut&lt;/em&gt; del dialogo y al terminar lo elimina del DOM.&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n lo insertamos en el DOM con un efecto &lt;em&gt;fadeIn&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$dialog.hide().appendTo('body').fadeIn();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Y para terminar vamos a a&amp;ntilde;adir funcinalidad extra para poder cerrar el dialogo utilizando la tecla &lt;em&gt;escape&lt;/em&gt; o la tecla &lt;em&gt;enter&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;return $(this).keyup(function(evt){
  if (evt.which == 27 || evt.which == 13){
    $dialog.fadeOut(function(){$dialog.remove()});
  }
}); 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;C&amp;oacute;digo final&lt;/h2&gt;
&lt;p&gt;El c&amp;oacute;digo final es el siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(function($){
  $.fn.dialog = function(data){
    var title, content;
    if(data &amp;amp;&amp;amp; data.title){ title = data.title; }else{ title = "Javascript alert"; }
    if(data &amp;amp;&amp;amp; data.content){ content = data.content; }else{ content = data; }

    var currentTop = $(document).scrollTop();
    var $dialog = $('&amp;lt;div&amp;gt;', {id: 'dialog', css:{top: currentTop + 150}}).prependTo('body');

    var $wrapper = $('&amp;lt;div&amp;gt;', {id: 'dialog-wrapper'}).appendTo($dialog);
    var $title = $('&amp;lt;h1&amp;gt;').text(title).appendTo($wrapper);
    var $content = $('&amp;lt;div&amp;gt;', {id: 'dialog-content'}).html("&amp;lt;p&amp;gt;"+content+"&amp;lt;/p&amp;gt;").appendTo($wrapper);
    var $footer = $('&amp;lt;div&amp;gt;', {id: 'dialog-footer'}).append(
        $('&amp;lt;a&amp;gt;', {'class': 'awesome small orange'})
          .text("Aceptar")
          .click(function(){
            $dialog.fadeOut(function(){$dialog.remove()});
            return false;
          })
      ).appendTo($wrapper);
    $dialog.hide().appendTo('body').fadeIn();

    return $(this).keyup(function(evt){
      if (evt.which == 27 || evt.which == 13){
        $dialog.fadeOut(function(){$dialog.remove()});
      }
    });
  }
})(jQuery);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Probando el dialogo y sobreescribiendo window.alert&lt;/h2&gt;
&lt;p&gt;Ahora podemos invocar este di&amp;aacute;logo tal que as&amp;iacute;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(document).dialog("Texto");
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La idea inicial es que este dialogo sustituya al predefinido en nuestro navegador. Esto es muy sencillo, basta con incluir lo siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;window.alert = $(document).dialog;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puedes probarlo en la p&amp;aacute;gina de demostraci&amp;oacute;n desde el inspector de webkit si estas en chrome o desde firebug si estas en firefox.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://theproc.es/page/demo/demo-20100820-personalizando-las-alertas-javascript?layout=false"&gt;Demo&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://theproc.es/2011/8/20/27734/personalizando-las-alertas-javascript</guid>
      <pubDate>Sat, 20 Aug 2011 00:00:00 +0200</pubDate>
    </item>
  </channel>
</rss>

