<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>return(gis);</title>
	
	<link>http://www.returngis.net</link>
	<description>/* HTML 5, JavaScript, CSS, ASP.NET MVC, Windows Azure*/</description>
	<lastBuildDate>Mon, 27 May 2013 15:16:02 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/returngis" /><feedburner:info uri="returngis" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>returngis</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.feedness.com/alta/http://feeds.feedburner.com/returngis" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/returngis" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Freturngis" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>HTML 5 Web Messaging: window.postMessage</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/C3s0n-0yGZU/</link>
		<comments>http://www.returngis.net/2013/05/html-5-web-messaging-window-postmessage/#comments</comments>
		<pubDate>Mon, 27 May 2013 14:53:21 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6586</guid>
		<description><![CDATA[Web Messaging, Cross-origin Messaging o Cross-document messaging son los nombres por los que se reconocen a esta Api de HTML 5, ya en su versión Candidate Recommendation a Mayo del 2012. El objetivo de la misma es proporcionar al desarrollador &#8230; <a href="http://www.returngis.net/2013/05/html-5-web-messaging-window-postmessage/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>Web Messaging</strong>, <strong>Cross-origin Messaging</strong> o <strong>Cross-document messaging</strong> son los nombres por los que se reconocen a esta Api de HTML 5, ya en su versión <a href="http://www.w3.org/TR/webmessaging/" title="HTML5 Web Messaging" target="_blank">Candidate Recommendation a Mayo del 2012</a>. El objetivo de la misma es proporcionar al desarrollador un mecanismo para la comunicación entre dos contextos del navegador, ya sea entre un documento y un iframe o una nueva ventana. Los navegadores web, por razones de seguridad, previenen la interacción a través de script, con el objetivo de no afectar a un sitio web con el contenido, malicioso o no, de nuestro sitio o viceversa.</p>
<h2>¿Cómo funciona?</h2>
<p>El mecanismo de mensajes entre dos contextos es bastante sencillo, donde sólo debemos tener en cuenta dos escenarios: el envío y la recepción de mensajes. Para el primero de los casos actuaremos de la siguiente manera:</p>
<p>En primer lugar, debemos comenzar la comunicación en cualquiera de los dos extremos. Para ello, he creado una página HTML que tiene como único contenido la referencia a mi script source.js:</p>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Cross-origin Communication - Sender&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;script src=&quot;scripts/source.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<pre class="brush: jscript; title: ; notranslate">var domain = 'http://localhost:23907';
var myPopup = window.open(domain + '/listener.html', 'Listener Window');
var counter = 1;

setInterval(function () {
    var message = 'Hello guest number ' + counter + '!';
    console.log('Sending message: ' + message);

    myPopup.postMessage(message, domain);

    counter++;

}, 5000);

window.addEventListener('message', function (event) {
    if (event.origin !== domain) return;
    console.log('Received response: ', event.data);

}, false);
</pre>
<p>El código JavaScript que se presenta es bastante sencillo: se ha almacenado la url de la aplicación en una variable, se crea una nueva ventana donde se muestra la página listener.html (nuestro receptor) y por último se inicializa un contador. Se crea una función anónima dentro de un intervalo de 5 segundos que nos permite mandar a la ventana recientemente creada un mensaje con el número actual del contador. En este punto estaríamos mandando mensajes a nuestra segunda ventana a través de [myPopUp].postMessage.</p>
<div class='alert alert-info'>Como podemos ver en el ejemplo, postMessage recibe dos parámetros: el <strong>mensaje (un string, objeto, array, etcétera)</strong>, el <strong>dominio del receptor</strong> (podría ser un * pero no es recomendable por seguridad) y podría recibir un tercer parámetro opcional reconocido en la especificación como <strong>transfer</strong>, el cual se utiliza para <a href="http://www.w3.org/TR/webmessaging/#channel-messaging" title="Channel messaging" target="_blank">Channel Messaging</a>, no abarcado en este post.</div>
<p>¿Puedo esperar contestación?</strong> Por supuesto <img src='http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  para ello debemos manejar el evento <strong>message</strong> de window y recibiremos como parámetro una serie de valores:</p>
<dl>
<dt>event.data</dt>
<dd>Devuelve la información que se envió a través de postMessage desde el emisor del mensaje.</dd>
<dt>event.origin</dt>
<dd>Se trata de la información relativa al remitente: schema, hostname y puerto. <i>Por ejemplo: http://localhost:23907</i></dd>
<dt>event.source</dt>
<dd>Nos da acceso a la propiedad window de la fuente del evento.</dd>
<dt>event.lastEventId</dt>
<dd>Cadena con un identificador único del mensaje.</dd>
<dt>event.ports</dt>
<dd>Se devuelve un array con los puertos para <a href="http://www.w3.org/TR/webmessaging/#channel-messaging" title="Channel Messaging" target="_blank">channel messaging</a>.</dd>
</dl>
<p>El resultado que podemos esperar como parte del registro en consola es el siguiente:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/05/window.postmessage-source.png"><img src="http://www.returngis.net/wp-content/uploads/2013/05/window.postmessage-source.png" alt="window.postmessage source" width="743" height="640" class="aligncenter size-full wp-image-6592" /></a></p>
<p>Una vez que ya tenemos el emisor estamos listos para implementar al receptor <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Para ello basta con escuchar también el evento <strong>message</strong> en el otro extremo:</p>
<pre class="brush: jscript; title: ; notranslate">//respond to events
window.addEventListener('message', function (event) {
    if (event.origin != 'http://localhost:23907') return;

    console.log('message received: ' + event.data, event);

    event.source.postMessage('hello back!!', event.origin);
}, false);</pre>
<p>Lo que hacemos en primer lugar es comprobar el origen/responsable de la invocación de este evento. Es muy importante validar esta información antes de procesar el contenido por motivos de seguridad. Una vez verificado, mostramos por consola el contenido del mensaje, además de adjuntar el objeto event para poder visualizar un contenido similar al siguiente:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/05/window.postmessage-target.png"><img src="http://www.returngis.net/wp-content/uploads/2013/05/window.postmessage-target.png" alt="window.postmessage target" width="743" height="640" class="aligncenter size-full wp-image-6590" /></a></p>
<h2>Compatibilidad</h2>
<p>A día de hoy podemos disfrutar de esta Api en Internet Explorer 8+, Chrome, Opera, Safari y Maxthon. </p>
<p>Espero que sea de utilidad <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=C3s0n-0yGZU:nol6nJDp3HA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=C3s0n-0yGZU:nol6nJDp3HA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=C3s0n-0yGZU:nol6nJDp3HA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=C3s0n-0yGZU:nol6nJDp3HA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=C3s0n-0yGZU:nol6nJDp3HA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=C3s0n-0yGZU:nol6nJDp3HA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=C3s0n-0yGZU:nol6nJDp3HA:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/C3s0n-0yGZU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/05/html-5-web-messaging-window-postmessage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/05/html-5-web-messaging-window-postmessage/</feedburner:origLink></item>
		<item>
		<title>La etiqueta base de HTML</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/kTc4VcP_-OI/</link>
		<comments>http://www.returngis.net/2013/05/la-etiqueta-base-de-html/#comments</comments>
		<pubDate>Fri, 03 May 2013 10:18:16 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6574</guid>
		<description><![CDATA[Una buena práctica que raramente es aplicada al crear nuestras páginas en HTML es el uso de la etiqueta base, existente desde la versión 4.01 de HTML (y Candidate Recommendation en HTML 5). Este elemento nos va a permitir definir &#8230; <a href="http://www.returngis.net/2013/05/la-etiqueta-base-de-html/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Una buena práctica que raramente es aplicada al crear nuestras páginas en HTML es el uso de la etiqueta <strong>base</strong>, existente desde la versión 4.01 de HTML (y <a href="http://www.w3.org/TR/html5/document-metadata.html#the-base-element" title="W3C - the base element" target="_blank">Candidate Recommendation en HTML 5</a>). Este elemento nos va a permitir definir cuál es la URL absoluta para todos aquellos enlaces que sean relativos en la página, pero no solo eso sino que además nos va a permitir establecer cuál es el comportamiento de forma generalizada para todos los enlaces que se declaren. Sólo es posible tener una etiqueta base por página, por lo que el resto de etiquetas de este tipo a partir de la primera serán ignoradas.</p>
<h2>Atributos</h2>
<p>Los atributos que podemos asignar a la etiqueta base son los mismos que a un anchor: <strong>href</strong> y <strong>target</strong>. Si se especifica href es necesario que esté definido antes que el resto de los enlaces. Se pueden especificar tanto direcciones relativas como absolutas. En cuanto al target podemos asociar los mismos valores que en los propios enlaces:</p>
<dl>
<dt>_self</dt>
<dd>Carga el contenido en el mismo frame/browsing context* donde se encuentra el enlace.</dd>
<dt>_blank</dt>
<dd>Se lanza el contenido en una nueva ventana/browsing context*</dd>
<dt>_parent</dt>
<dd>Se cargaría en la ventana padre del frame que contiene el enlace si la hubiera. De no ser así funcionaría exactamente igual que _self.</dd>
<dt>_top</dt>
<dd>Carga el contenido en la ventana original, anulando todos los demás frames que hubiera contenidos en la misma.</dd>
</dl>
<div class="alert alert-info">
*Respecto a HTML 5. entra en juego el concepto de <strong>browsing context</strong>, lo cual significa que por cada tab, window o iframe hay un contexto asociado, o lo que es lo mismo un nodo Document por el que navegar.
</div>
<p>Para verlo con un ejemplo podemos hacer pruebas con el siguiente código:</p>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;&lt;/title&gt;
    &lt;base href=&quot;http://www.google.com&quot; target=&quot;_blank&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;a href=&quot;/calendar&quot;&gt;Calendar&lt;/a&gt;
    &lt;a href=&quot;/imghp&quot;&gt;Images&lt;/a&gt;
    &lt;a href=&quot;/ig&quot;&gt;iGoogle&lt;/a&gt;
    &lt;a href=&quot;/mobile&quot;&gt;Mobile&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>En este caso, independientemente de dónde esté alojada nuestra página se tomará como referencia la url indicada en la etiqueta base (http://www.google.com) para montar el resto de los enlaces relativos mostrados más abajo. Además, únicamente indicando el target en la etiqueta base de nuestra página definiremos el comportamiento de navegación de todos los enlaces que creemos (en este caso se abrirán en una nueva ventana).</p>
<p>Espero que sea de utilidad.</p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=kTc4VcP_-OI:42QePCWeh9E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=kTc4VcP_-OI:42QePCWeh9E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=kTc4VcP_-OI:42QePCWeh9E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=kTc4VcP_-OI:42QePCWeh9E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=kTc4VcP_-OI:42QePCWeh9E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=kTc4VcP_-OI:42QePCWeh9E:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=kTc4VcP_-OI:42QePCWeh9E:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/kTc4VcP_-OI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/05/la-etiqueta-base-de-html/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/05/la-etiqueta-base-de-html/</feedburner:origLink></item>
		<item>
		<title>Hangout disponible: “Apis que molan un montón”</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/SrVbFP3gRYY/</link>
		<comments>http://www.returngis.net/2013/04/hangout-disponible-apis-que-molan-un-monton/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 09:11:35 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Hangout]]></category>
		<category><![CDATA[HTML 5]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6563</guid>
		<description><![CDATA[Hace justamente una semana tuve la suerte de poder colaborar con HTML 5 Spain en un Hangout, donde pude hablar de algunas de las Apis que nos esperan en el futuro El video ya quedó disponible desde Youtube: Según el &#8230; <a href="http://www.returngis.net/2013/04/hangout-disponible-apis-que-molan-un-monton/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Hace justamente una semana tuve la suerte de poder colaborar con <a href="http://html5spain.wordpress.com/" title="HTML 5 Spain" target="_blank">HTML 5 Spain</a> en un Hangout, donde pude hablar de algunas de las Apis que nos esperan en el futuro <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  El video ya quedó disponible desde Youtube:</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/1KtHM3VuB14" frameborder="0" allowfullscreen></iframe></p>
<p>Según el orden en el que aparecen las Apis, me gustaría hacer referencia a los posts donde traté cada uno de los temas:</p>
<ul>
<li><a href="http://www.returngis.net/2012/11/web-notifications-api-notificaciones-emergentes/" title="Web Notifications API: Notificaciones emergentes" target="_blank">Web Notifications API: Notificaciones emergentes</a></li>
<li><a href="http://www.returngis.net/2012/11/getusermedia-html-5-tambien-se-integra-con-la-webcam/" title="getUserMedia: HTML 5 también se integra con la webcam" target="_blank">getUserMedia: HTML 5 también se integra con la webcam</a></li>
<li><a href="http://www.returngis.net/2012/11/estado-de-la-bateria-con-html-5-battery-status-api/" title="Estado de la batería con HTML 5: Battery Status API" target="_blank">Estado de la batería con HTML 5: Battery Status API</a></li>
<li><a href="http://www.returngis.net/2012/11/page-visibility-api-controla-cuando-tu-usuario-esta-mirando-tu-aplicacion/" title="Page Visibility API: Controla cuándo tu usuario está mirando tu aplicación" target="_blank">Page Visibility API: Controla cuándo tu usuario está mirando tu aplicación</a></li>
<li><a href="http://www.returngis.net/2013/04/html-5-fullscreen-api/" title="HTML 5 Fullscreen API" target="_blank">HTML 5 Fullscreen API</a></li>
<li><a href="http://www.returngis.net/2013/04/html-5-application-cache-aplicaciones-offline/" title="HTML 5 Application Cache: Aplicaciones Offline" target="_blank">HTML 5 Application Cache: Aplicaciones Offline</a></li>
</ul>
<p>Las slides quedaron disponibles a través de este <a href="http://returngis.azurewebsites.net/apis.html" title="slides Apis que molan un montón" target="_blank">enlace</a>.</p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=SrVbFP3gRYY:LVIPS6Ns8rs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=SrVbFP3gRYY:LVIPS6Ns8rs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=SrVbFP3gRYY:LVIPS6Ns8rs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=SrVbFP3gRYY:LVIPS6Ns8rs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=SrVbFP3gRYY:LVIPS6Ns8rs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=SrVbFP3gRYY:LVIPS6Ns8rs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=SrVbFP3gRYY:LVIPS6Ns8rs:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/SrVbFP3gRYY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/hangout-disponible-apis-que-molan-un-monton/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/hangout-disponible-apis-que-molan-un-monton/</feedburner:origLink></item>
		<item>
		<title>HTML 5 Fullscreen API</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/Nc80ursO2lc/</link>
		<comments>http://www.returngis.net/2013/04/html-5-fullscreen-api/#comments</comments>
		<pubDate>Sun, 28 Apr 2013 11:08:47 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[Fullscreen API]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6542</guid>
		<description><![CDATA[Fullscreen API no trata de mostrar una página web a pantalla completa, sino de mostrar un elemento/s de una página en pantalla completa . El efecto que se consigue con esta API es dar mayor énfasis a los elementos que &#8230; <a href="http://www.returngis.net/2013/04/html-5-fullscreen-api/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<style>
#stickercontainer{padding:15px;}#stickercontainer:full-screen{background-color:pink;}#stickercontainer:-webkit-full-screen{background-color: blue;}#stickercontainer:-moz-full-screen{background-color: green;}@media screen and (view-mode: fullscreen) { /*opera*/#stickercontainer {background-color: yellow;}}</style>
<p><a href="https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html" title="Fullscreen API" target="_blank">Fullscreen API</a> no trata de mostrar una página web a pantalla completa, sino de <strong>mostrar un elemento/s de una página en pantalla completa <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</strong> El efecto que se consigue con esta API es dar mayor énfasis a los elementos que solicitaron este modo. A día de hoy la especificación está implementada en Chrome, Opera, Safari y Firefox, quedando fuera Internet Explorer.</p>
<h2>Demo</h2>
<p>Para comprobar el efecto sobre un elemento, he insertado la siguiente imagen:</p>
<div id="stickercontainer">
<img id="sticker" src="/wp-content/uploads/2013/04/HTML5_sticker.svg" />
</div>
<p>Si hacemos doble clic sobre la misma conseguiremos entrar en modo pantalla completa. De hecho, podemos observar incluso un borde coloreado alrededor de la imagen. Veamos cómo conseguirlo <img src='http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h2>Compatibilidad entre navegadores</h2>
<p>Lo primero con lo que tenemos que lidiar es con los prefijos utilizados por cada uno de los navegadores en esta fase temprana de la API. A día de hoy <a href="https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api" title="Fullscreen API: Apartado miembros" target="_blank">la especificación</a> cita los siguientes miembros:</p>
<dl>
<dt>element requestFullscreen
<dt>
<dd>Muestra el elemento que lo invoca (y sus hijos) en pantalla completa.</dd>
<dt>document.fullscreenEnabled</dt>
<dd>Devuelve true si la página tiene la habilidad de mostrar elementos en pantalla completa.</dd>
<dt>document.fullscreenElement</dt>
<dd>Devuelve el elemento que está mostrado en pantalla completa. Si en ese momento no hubiera ninguno mostrándose en este modo se devolvería null.</dd>
<dt>document.exitFullscreen</dt>
<dd>Detiene el modo pantalla completa</dd>
</dl>
<p>Chrome y Firefox han prefijado estos miembros, por lo que es necesario tenerlos en cuenta antes de lanzar cualquier petición a la API:</p>
<pre class="brush: jscript; title: ; notranslate">        var fullScreenChangeEvent = &quot;fullscreenchange&quot;;

        if (container.webkitRequestFullscreen) {
            console.log(&quot;webkit&quot;);
            fullScreenChangeEvent = &quot;webkitfullscreenchange&quot;;
            container.requestFullscreen = container.webkitRequestFullscreen;
            document.fullscreenEnabled = document.webkitFullscreenEnabled;
            document.exitFullscreen = document.webkitCancelFullScreen;
        }
        else if (container.mozRequestFullScreen) {
            console.log(&quot;moz&quot;);
            fullScreenChangeEvent = &quot;mozfullscreenchange&quot;;
            container.requestFullscreen = container.mozRequestFullScreen;
            document.fullscreenEnabled = document.mozFullScreenEnabled;
            document.exitFullscreen = document.mozCancelFullScreen;
        }
</pre>
<p>Por el contrario, Opera sigue el estándar por lo que no será necesario ninguna medida adicional. Internet Explorer por el momento no da soporte a esta característica.</p>
<h2>Implementación</h2>
<p>Una vez que hemos lidiado con las compatibilidades de los distintos navegadores, la implementación es bastante sencilla:</p>
<pre class="brush: jscript; title: ; notranslate">        if (document.fullscreenEnabled) {

            document.addEventListener(fullScreenChangeEvent, function (e) {
                console.log(&quot;fullscreenchange event! &quot;, e);
                if (e.type === &quot;webkitfullscreenchange&quot;)
                    console.log(&quot;document.webkitFullscreenElement:&quot; + document.webkitFullscreenElement);
                else if (e.type === &quot;mozfullscreenchange&quot;)
                    console.log(&quot;document.mozFullScreenElement:&quot; + document.mozFullScreenElement);
                else
                    console.log(&quot;document.fullscreenElement:&quot; + document.fullscreenElement);
            });

            document.addEventListener(&quot;keydown&quot;, function (e) {

                if (e.keyCode == 69) { //e
                    document.exitFullscreen();
                }
            });

            container.requestFullscreen();
        }
</pre>
<p>Para cerciorarnos de que podemos invocar la pantalla completa de un elemento hacemos uso de <strong>document.fullscreenEnabled</strong>. Si queremos realizar ciertas acciones cuando el evento <strong>fullscreenchange</strong> es lanzado basta con añadir un handler a nivel de document (se lanza tanto cuando pasamos a pantalla completa como cuando salimos de ella). En este caso se muestra el valor de <strong>document.fullscreenElement</strong>. Como veis, en este caso he tenido que discernir qué tipo de evento se lanzó para saber de dónde leer esa información. El motivo de hacerlo aquí y no en el apartado anterior es que <strong>los elementos document.webkitFullscreenElement y document.mozFullScreenElement no son funciones sino simples propiedades que se actualizan cuando el evento fullscreenchange se lanza</strong>, por lo que no puedo recoger esta información antes de que el evento ocurra. Por último, he agregado un handler al evento keydown, para capturar en el momento que el usuario/lector <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  pulsa la tecla e, para salir del modo pantalla completa utilizando <strong>document.exitFullscreen</strong></p>
<h2>Estilos CSS</h2>
<p>Por último, comentar que existen pseudo-clases para controlar los estilos del elemento en pantalla completa. Sería necesario contemplar los siguientes:</p>
<pre class="brush: css; title: ; notranslate">        #stickercontainer {
            padding: 15px;
        }

            #stickercontainer:full-screen { /*html*/
                background-color: pink;
            }

            #stickercontainer:-webkit-full-screen { /*webkit*/
                background-color: blue;
            }

            #stickercontainer:-moz-full-screen { /*mozilla*/
                background-color: green;
            }

        @media screen and (view-mode: fullscreen) { /*opera*/
            #stickercontainer {
                background-color: yellow;
            }
        }
</pre>
<p>En el caso de Opera es necesario hacer uso de <a href="http://www.returngis.net/2012/05/css-media-queries-responsive-web-design/" title="CSS Media Queries (Responsive Web Design)" target="_blank">media query</a>, indicando el view-mode fullscreen.</p>
<p>Espero que sea de utilidad <img src='http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>¡Saludos!</p>
<p><script src="/wp-content/uploads/demos/fullscreen.js"></script></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=Nc80ursO2lc:WhaOX9w69Tk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=Nc80ursO2lc:WhaOX9w69Tk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=Nc80ursO2lc:WhaOX9w69Tk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=Nc80ursO2lc:WhaOX9w69Tk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=Nc80ursO2lc:WhaOX9w69Tk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=Nc80ursO2lc:WhaOX9w69Tk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=Nc80ursO2lc:WhaOX9w69Tk:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/Nc80ursO2lc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/html-5-fullscreen-api/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/html-5-fullscreen-api/</feedburner:origLink></item>
		<item>
		<title>dotPeek: El descompilador de JetBrains ¡y gratis!</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/jAHkF-8yJlw/</link>
		<comments>http://www.returngis.net/2013/04/dotpeek-el-descompilador-de-jetbrains-y-gratis/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 09:39:51 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Utilidades]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6520</guid>
		<description><![CDATA[Cuando .NET Reflector dejó de ser gratuito y pasó a manos de Red Gate perdimos una herramienta muy valiosa en el mundo .NET. Sigue siendo una maravillosa utilidad, pero algunos desarrolladores a titulo personal no pueden permitirse un mínimo de &#8230; <a href="http://www.returngis.net/2013/04/dotpeek-el-descompilador-de-jetbrains-y-gratis/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/dotPeek.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/dotPeek.png" alt="dotPeek" width="471" height="196" class="aligncenter size-full wp-image-6521" /></a><br />
Cuando .NET Reflector dejó de ser gratuito y pasó a manos de <a href="http://www.red-gate.com/products/dotnet-development/reflector/" title=".NET Reflector" target="_blank">Red Gate</a> <em>perdimos</em> una herramienta muy valiosa en el mundo .NET. Sigue siendo una maravillosa utilidad, pero algunos desarrolladores a titulo personal no pueden permitirse un mínimo de 69€ en la más barata de <a href="http://www.red-gate.com/products/dotnet-development/reflector/pricing" title=".NET Reflector Pricing and purchasing information" target="_blank">sus licencias</a>. Es por ello que me gustaría presentaros <strong>dotPeek</strong>, el descompilador gratuito de <a href="http://www.jetbrains.com/" title="JetBrains" target="_blank">JetBrains</a>.</p>
<h2>¿Qué ofrece dotPeek?</h2>
<p>dotPeek es capaz de descompilar cualquier assembly en .NET y mostrarlo como código C#. Los tipos soportados son:</p>
<ul>
<li>Librerías (.dll)</li>
<li>Ejecutables (.exe)</li>
<li>Archivos de metadatos de Windows 8 (.winmd)</li>
<li>Archivos comprimidos (.zip)</li>
<li>Paquetes de Nuget</li>
<li>Extensiones de Visual Studio (.vsix)</li>
</ul>
<h2>Cómo usarlo</h2>
<p>doPeek, al igual que otras herramientas de JetBrains, se acoge al EAP (Early Access Program), con el objetivo de conseguir una pronta adopción de la herramienta por los desarrolladores y poder probar las últimas novedades del producto antes de la release final. Para descargar la última versión de dotPeek podemos hacerlo a través del siguiente <a href="http://confluence.jetbrains.com/display/NETPEEK/dotPeek+Early+Access+Program" title="dotPeek Early Access Program" target="_blank">enlace</a> (Si quieres descargar la release oficial haz clic en este <a href="http://www.jetbrains.com/decompiler/download/" title="Download dotPeek" target="_blank">otro sitio</a>). Una vez instalado podemos acceder a la herramienta y visualizar una interfaz como esta:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/dotPeek-1.1-EAP.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/dotPeek-1.1-EAP.png" alt="dotPeek 1.1 EAP" width="1233" height="768" class="aligncenter size-full wp-image-6536" /></a></p>
<p>La forma de trabajar con esta utilidad es muy similar que con Resharper, ya tenemos una serie de accesos rápidos a las distintas funciones que trae la herramienta (Podemos consultarlos a través de este <a href="http://confluence.jetbrains.com/display/NETPEEK/dotPeek+Keyboard+Shortcuts" title="dotPeek Keyboard Shortcuts" target="_blank">enlace</a>).</p>
<p><a href="http://confluence.jetbrains.com/display/NETPEEK/Introducing+JetBrains+dotPeek" title="Introducing JetBrains dotPeek" target="_blank">Más información</a>.</p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=jAHkF-8yJlw:hvCJN7lfVWM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=jAHkF-8yJlw:hvCJN7lfVWM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=jAHkF-8yJlw:hvCJN7lfVWM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=jAHkF-8yJlw:hvCJN7lfVWM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=jAHkF-8yJlw:hvCJN7lfVWM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=jAHkF-8yJlw:hvCJN7lfVWM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=jAHkF-8yJlw:hvCJN7lfVWM:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/jAHkF-8yJlw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/dotpeek-el-descompilador-de-jetbrains-y-gratis/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/dotpeek-el-descompilador-de-jetbrains-y-gratis/</feedburner:origLink></item>
		<item>
		<title>Trazar la carga de módulos en RequireJS</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/lOM8McHtbpQ/</link>
		<comments>http://www.returngis.net/2013/04/trazar-la-carga-de-modulos-en-requirejs/#comments</comments>
		<pubDate>Tue, 16 Apr 2013 15:39:14 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Requirejs]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6503</guid>
		<description><![CDATA[Hace tiempo estuve hablando de la potencia que nos da RequireJS, cargando nuestros archivos/módulos JavaScript bajo demanda. Lo cierto es que, cuando tenemos aplicaciones grandes con muchos módulos, puede ser complicado saber cuántos se han cargado, si tienen correctamente sus &#8230; <a href="http://www.returngis.net/2013/04/trazar-la-carga-de-modulos-en-requirejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Hace tiempo estuve hablando de <a href="http://www.returngis.net/2013/03/requirejs-el-cargador-de-modulos-para-javascript/" title="Requirejs: El cargador de módulos para JavaScript" target="_blank">la potencia que nos da RequireJS</a>, cargando nuestros archivos/módulos JavaScript bajo demanda. Lo cierto es que, cuando tenemos aplicaciones grandes con muchos módulos, puede ser complicado saber cuántos se han cargado, si tienen correctamente sus dependencias, etcétera. Investigando un poco sobre cómo conseguir esta información descubrí el evento <strong>onResourceLoad</strong>.</p>
<h2>onResourceLoad</h2>
<p>Se trata de una <strong>API privada de requirejs</strong> que, <a href="https://github.com/jrburke/requirejs/wiki/Internal-API:-onResourceLoad" title="Internal API: onResourceLoad" target="_blank">tal y como comentan en su espacio en Github</a>, puede estar sujeta a cambio en cualquier momento. De hecho, puedes agregar tu contacto en la propia wiki con el fin de ser informado si se produce algún cambio. Siguiendo el ejemplo del <a href="http://www.returngis.net/2013/03/requirejs-el-cargador-de-modulos-para-javascript/" title="Requirejs: El cargador de módulos para JavaScript" target="_blank">post anterior</a>, he ampliado el mismo para agregar una función que maneje dicho evento antes de comenzar a utilizar require.js en el script app.js.</p>
<pre class="brush: jscript; title: ; notranslate">(function () {

    requirejs.config({
        baseUrl: 'scripts'
    });

    requirejs.onResourceLoad = function (context, map, depArray) {
        console.log([&quot;{0} module loaded; Url {1}; Dependencies&quot;.format(map.name, map.url), depArray]);
    };

    require(['messenger'], function (messenger) {
        messenger.showMessage();
    });

})();</pre>
<div class="alert alert-info">La forma de concatenar el texto de console.log es una extensión de la clase String contada en este <a href="http://www.returngis.net/2013/04/string-format-en-javascript/" title="String.Format en JavaScript" target="_blank">otro post</a>.</div>
<p>Esta función, a día de hoy, recibe tres argumentos:</p>
<dl>
<dt>context</dt>
<dd>Se trata del objeto que utiliza RequireJS para almacenar información relacionada con la carga y exportación de módulos.</dd>
<dt>map</dt>
<dd>Es el argumento más importante para nosotros ya que tiene toda la información relacionada con el módulo que se acaba de cargar. En este ejemplo se han utilizado el nombre del módulo (<strong>map.name</strong>) y la url de dónde está alojado(<strong>map.url</strong>). <a href="https://github.com/jrburke/requirejs/wiki/Internal-API:-onResourceLoad#map" title="argumento map" target="_blank">Más información</a>.</dd>
<dt>depArray</dt>
<dd>Se trata de un array con las dependencias del módulo.</dd>
</dl>
<p>Si arrancamos el ejemplo podremos ver en la consola la información de cada uno de los módulos cargados:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/onResourceLoad.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/onResourceLoad.png" alt="onResourceLoad" width="658" height="362" class="aligncenter size-full wp-image-6506" /></a></p>
<p>Espero que sea de utilidad <img src='http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=lOM8McHtbpQ:LbU47oQ8HeQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=lOM8McHtbpQ:LbU47oQ8HeQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=lOM8McHtbpQ:LbU47oQ8HeQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=lOM8McHtbpQ:LbU47oQ8HeQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=lOM8McHtbpQ:LbU47oQ8HeQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=lOM8McHtbpQ:LbU47oQ8HeQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=lOM8McHtbpQ:LbU47oQ8HeQ:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/lOM8McHtbpQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/trazar-la-carga-de-modulos-en-requirejs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/trazar-la-carga-de-modulos-en-requirejs/</feedburner:origLink></item>
		<item>
		<title>Evento online en HTML 5 Spain: Javascript API’s que molan un montón</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/KeJpFs2IACA/</link>
		<comments>http://www.returngis.net/2013/04/evento-online-html-5-spain-javascript-apis-que-molan-un-monton/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 08:26:52 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[HTML 5]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6500</guid>
		<description><![CDATA[El 22 de Abril (el lunes de la semana que viene) tengo el placer de poder juntarme con la gente de HTML 5 Spain, para realizar un hangout sobre algunas de las Apis de HTML 5 con las que he &#8230; <a href="http://www.returngis.net/2013/04/evento-online-html-5-spain-javascript-apis-que-molan-un-monton/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.returngis.net/wp-content/uploads/2013/04/HTML5-Spain-logo.jpg" alt="HTML5 Spain logo" width="938" height="150" class="aligncenter size-full wp-image-6484" /><br />
El <strong>22 de Abril</strong> (el lunes de la semana que viene) tengo el placer de poder juntarme con la gente de <a href="http://www.meetup.com/HTML5-Spain/" title="HTML 5 Spain" target="_blank">HTML 5 Spain</a>, para realizar un <a href="http://www.google.com/+/learnmore/hangouts/" title="¿Qué es un hangout?" target="_blank">hangout</a> sobre algunas de las Apis de <a href="http://www.returngis.net/tag/html-5/" title="HTML 5 en mi blog" target="_blank">HTML 5</a> con las que he estado jugando <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <strong>El evento será online a las 20:30 (UTC +01:00)</strong>.<br />
Os invito a acompañarnos en este recorrido, para echar un vistazo a un futuro no muy lejano y pensar en todas las posibilidades que nos esperan desde el lado Web. La idea inicial es poder hablaros de las siguientes APIs:</p>
<ul>
<li>Web Notificacions</li>
<li>getUserMedia</li>
<li>Battery Status</li>
<li>Page Visibility</li>
<li>Fullscreen</li>
<li>/*Application cache*/</li>
</ul>
<p>Si estás interesado/a en asistir, puedes suscribirte a través del enlace del evento en meetup: <a href="http://www.meetup.com/HTML5-Spain/events/113984832/" title="Online! Javascript API's que molan un montón" target="_blank">Online! Javascript API&#8217;s que molan un montón</a></p>
<p>¡Os esperamos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=KeJpFs2IACA:elBv7O0l_vg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=KeJpFs2IACA:elBv7O0l_vg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=KeJpFs2IACA:elBv7O0l_vg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=KeJpFs2IACA:elBv7O0l_vg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=KeJpFs2IACA:elBv7O0l_vg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=KeJpFs2IACA:elBv7O0l_vg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=KeJpFs2IACA:elBv7O0l_vg:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/KeJpFs2IACA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/evento-online-html-5-spain-javascript-apis-que-molan-un-monton/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/evento-online-html-5-spain-javascript-apis-que-molan-un-monton/</feedburner:origLink></item>
		<item>
		<title>String.Format en JavaScript</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/hxjKd8jeNJM/</link>
		<comments>http://www.returngis.net/2013/04/string-format-en-javascript/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 10:51:18 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6474</guid>
		<description><![CDATA[Cuando trabajas de una manera más intensiva en el lado del cliente empiezas a echar en falta aquellas utilidades disponibles en servidor y que no tenemos por defecto en JavaScript. Una de ellas es el uso de String.Format para poder &#8230; <a href="http://www.returngis.net/2013/04/string-format-en-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Cuando trabajas de una manera más intensiva en el lado del cliente empiezas a echar en falta aquellas utilidades disponibles en servidor y que no tenemos por defecto en JavaScript. Una de ellas es el uso de <a href="http://msdn.microsoft.com/es-es/library/system.string.format(v=vs.110).aspx" title="String.Format" target="_blank">String.Format</a> para poder trabajar de una forma más eficiente con cadenas.<br />
Normalmente, cuando queremos concatenar variables con literales en nuestros scripts solemos hacerlo de la siguiente manera:</p>
<pre class="brush: jscript; title: ; notranslate">&quot;Hi! I'm &quot; + me + &quot; and you can &lt;a href='&quot; + twitter + &quot;'&gt;follow me on Twitter&lt;/a&gt; or &lt;a href='&quot; + facebook + &quot;'&gt;Facebook&lt;/a&gt;&quot;;</pre>
<p>Una alternativa para mejorar este tipo de concatenaciones sería la simulación de String.Format, <strong>modificando el prototipo de la clase String</strong> de JavaScript, con el fin de poder trabajar de una forma más legible y cómoda:</p>
<pre class="brush: jscript; title: ; notranslate">&quot;Hi! I'm {0} and you can &lt;a href='{1}'&gt;follow me on Twitter&lt;/a&gt; or &lt;a href='{2}'&gt;Facebook&lt;/a&gt; {test}&quot;.format(me, twitter, facebook);</pre>
<p>La implementación de esta extensión podría ser la siguiente:</p>
<pre class="brush: jscript; title: ; notranslate">String.prototype.format = function () {
    var literal = this;

    for (var i = 0; i &lt; arguments.length; i++) {
        var regex = new RegExp('\\{' + i + '\\}', 'g');
        literal = literal.replace(regex, arguments[i]);
    }

    return literal;
};</pre>
<p>Lo único que hacemos en la función format es tomar como literal la cadena que llama a dicho método y recorrer cada uno de los argumentos para poder reemplazar todas las coincidencias con la ayuda de la expresión regular &#8216;\\{posicion del argumento\\}. Con el flag g conseguimos reemplazar todas las coincidencias que encuentre para un mismo argumento, si es que hacemos uso repetido del mismo valor en distintos sitios del literal.</p>
<p>Otra opción es hacer uso de la librería <a href="http://www.diveintojavascript.com/projects/javascript-sprintf" title="JavaScript sprintf()" target="_blank">JavaScript sprintf()</a> la cual es mucho más elaborada <img src='http://www.returngis.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Espero que sea de utilidad.</p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=hxjKd8jeNJM:rpKJ0Ln0h60:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=hxjKd8jeNJM:rpKJ0Ln0h60:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=hxjKd8jeNJM:rpKJ0Ln0h60:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=hxjKd8jeNJM:rpKJ0Ln0h60:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=hxjKd8jeNJM:rpKJ0Ln0h60:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=hxjKd8jeNJM:rpKJ0Ln0h60:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=hxjKd8jeNJM:rpKJ0Ln0h60:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/hxjKd8jeNJM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/string-format-en-javascript/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/string-format-en-javascript/</feedburner:origLink></item>
		<item>
		<title>App cache y los navegadores</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/QH1ZiTVh9tQ/</link>
		<comments>http://www.returngis.net/2013/04/app-cache-y-los-navegadores/#comments</comments>
		<pubDate>Wed, 10 Apr 2013 07:52:02 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Application Cache]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6457</guid>
		<description><![CDATA[En el último post estuve comentando las bondades de trabajar con una de las nuevas APIs que HTML 5 trae bajo su ala: Application Cache. En este post quiero mostrar cuáles son las opciones que nos ofrece cada uno de &#8230; <a href="http://www.returngis.net/2013/04/app-cache-y-los-navegadores/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>En el último post estuve comentando las bondades de trabajar con una de las nuevas APIs que HTML 5 trae bajo su ala: <a href="http://www.returngis.net/2013/04/html-5-application-cache-aplicaciones-offline/" title="HTML 5 Application Cache: Aplicaciones Offline" target="_blank">Application Cache</a>.<br />
En este post quiero mostrar cuáles son las opciones que nos ofrece cada uno de los navegadores:</p>
<h2>Internet Explorer 10</h2>
<p>La última versión del navegador de Microsoft posee un apartado llamado <strong>Cached and Databases</strong>, el cual podemos localizar a través de <strong>Internet Options &#8211;> General &#8211;> Apartado Browsing history &#8211;> Settings &#8211;> Caches and Databases</strong>.</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/Caches-and-databases-settings.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/Caches-and-databases-settings.png" alt="Caches and databases settings" width="824" height="551" class="aligncenter size-full wp-image-6458" /></a></p>
<p>Por defecto, tenemos habilitados los siguientes valores:</p>
<ol>
<li>Se permite el almacenamiento en caché y la creación de bases de datos.</li>
<li>Se lanza una notificación cuando un sitio va a exceder los 10 MB de almacenamiento, aunque es ampliable.</li>
<li>Listado de todos los dominios que han almacenado información. Si seleccionamos cualquiera de ellos, podemos hacer clic en la opción Exceed limit para permitir sobrepasar el valor por defecto o incluso podemos borrar los datos para un sitio en concreto.</li>
</ol>
<h2>Chrome</h2>
<p>.<br />
En el caso del navegador de Google, dispone de un apartado dentro de su configuración llamado <strong>AppCache Internals</strong>, al cual podemos acceder escribiendo en la URL del navegador <strong>chrome://appcache-internals</strong></p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/appcache-internals-chrome.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/appcache-internals-chrome.png" alt="appcache-internals chrome" width="470" height="237" class="aligncenter size-full wp-image-6459" /></a></p>
<p>Lo cierto es que nos aporta mucha más información como el tamaño, la fecha de creación, la última vez que se actualizó, el último acceso e incluso podemos ver, haciendo clic en <strong>View Entries</strong>, todos los recursos que se han descargado, los flags asociados y el peso de cada uno de ellos:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/appcache-internals-chrome-view-entries.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/appcache-internals-chrome-view-entries.png" alt="appcache-internals chrome view entries" width="732" height="464" class="aligncenter size-full wp-image-6460" /></a></p>
<p>Del mismo modo podemos eliminar la caché para un dominio en concreto.</p>
<h2>Firefox</h2>
<p>En el caso de Firefox, cuando accedemos a un sitio web que necesita hacer uso de Application Cache, nos solicita permiso de manera previa. Una vez concedido, podemos ver la información relacionada en las <strong>opciones del navegador &#8211;> Advanced &#8211;> Network</strong>.</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/Firefox-appCache-Options.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/Firefox-appCache-Options.png" alt="Firefox appCache Options" width="534" height="596" class="aligncenter size-full wp-image-6461" /></a></p>
<p>En esta ventana podemos ver únicamente los dominios autorizados y el espacio utilizado por cada uno de ellos, además de borrar todo el contenido o sólo de algunos dominios. Por otro lado, tenemos un apartado de excepciones donde nos permite visualizar todos aquellos sitios a los que se les denegó el uso de Application Cache, con el objetivo además de sacarlo de la <i>lista negra</i>.</p>
<h2>Opera</h2>
<p>En el caso de Opera dispone de un <strong>apartado en la parte avanzada de sus opciones llamado Storage</strong>, donde podemos encontrar las acciones más básicas al respecto:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/Advanced-Storage-AppCache-Opera.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/Advanced-Storage-AppCache-Opera.png" alt="Advanced Storage AppCache Opera" width="645" height="522" class="aligncenter size-full wp-image-6463" /></a></p>
<p>Por defecto está habilitado el uso de la API pero existe la posibilidad de que se nos pregunte antes de aceptar un sitio, al igual que Firefox.</p>
<h2>Safari</h2>
<p>Entre las opciones para Safari, tanto en su versión Windows como Mac, podemos encontrar en el apartado <strong>Privacy</strong> una sección llamada <strong>Cookies and other website data</strong> aunque debemos utilizar un botón llamado <strong>Details&#8230;</strong> para ver la información:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/AppCache-Safari-for-Windows.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/AppCache-Safari-for-Windows.png" alt="AppCache Safari for Windows" width="700" height="559" class="aligncenter size-full wp-image-6464" /></a></p>
<p>Hasta ahora es el navegador que menos información nos da al respecto, ya que ni siquiera puedo saber cuánto es el espacio que ocupa cada uno de los dominios. Únicamente disponemos de un botón para eliminar uno o todos los sitios registrados.</p>
<p>Espero que haya sido de utilidad.</p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=QH1ZiTVh9tQ:lLfMRKMgrA4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=QH1ZiTVh9tQ:lLfMRKMgrA4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=QH1ZiTVh9tQ:lLfMRKMgrA4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=QH1ZiTVh9tQ:lLfMRKMgrA4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=QH1ZiTVh9tQ:lLfMRKMgrA4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=QH1ZiTVh9tQ:lLfMRKMgrA4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=QH1ZiTVh9tQ:lLfMRKMgrA4:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/QH1ZiTVh9tQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/app-cache-y-los-navegadores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/app-cache-y-los-navegadores/</feedburner:origLink></item>
		<item>
		<title>HTML 5 Application Cache: Aplicaciones Offline</title>
		<link>http://feedproxy.google.com/~r/returngis/~3/V5EgbIrH5fQ/</link>
		<comments>http://www.returngis.net/2013/04/html-5-application-cache-aplicaciones-offline/#comments</comments>
		<pubDate>Sun, 07 Apr 2013 09:03:15 +0000</pubDate>
		<dc:creator>Gisela</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Application Cache]]></category>
		<category><![CDATA[Offline]]></category>

		<guid isPermaLink="false">http://www.returngis.net/?p=6403</guid>
		<description><![CDATA[Si bien uno de los grandes motivos de anteponer las aplicaciones nativas sobre las aplicaciones web era la posibilidad de que estas primeras pudieran seguir trabajando a pesar de no disponer de Internet o acceso a un servidor determinado, con &#8230; <a href="http://www.returngis.net/2013/04/html-5-application-cache-aplicaciones-offline/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Si bien uno de los grandes motivos de anteponer las aplicaciones nativas sobre las aplicaciones web era la posibilidad de que estas primeras pudieran seguir trabajando a pesar de no disponer de Internet o acceso a un servidor determinado, con la especificación de HTML 5 que vamos a ver hoy cambia totalmente el panorama: <strong>Application Cache</strong>.</p>
<h2>¿Qué es Application Cache?</h2>
<p>Esta especificación está pensada para escenarios donde podemos experimentar <strong>situaciones en las que no disponemos de conectividad</strong>, como en un avión, zonas con poca cobertura, desconexiones intermitentes, etcétera. Hasta ahora con el modo de caché habitual no eramos capaces de obtener recursos a los que no hubiéramos accedido previamente, ni podíamos indicar a qué páginas era posible navegar aún cuando no disponíamos de acceso al servidor, por falta de Internet o porque el mismo no estuviera disponible en ese momento. Pero no sólo los escenarios relacionados con la conectividad son los candidatos de disfrutar de esta API, sino que también <strong>nos permite mejorar rendimiento del servidor reduciendo las peticiones de recursos en usuarios recurrentes, manteniendo los más estáticos cacheados en el navegador de forma explícita.</strong></p>
<p>Esta característica está siendo muy utilizada en diferentes escenarios como <strong>juegos</strong> (como la aplicación de <a href="http://chrome.angrybirds.com/" title="Angry Birds (Chrome Web Store)" target="_blank">Angry Birds de Chrome Web Store</a>), <strong>aplicaciones offline de acceso al correo electrónico</strong>, <strong>clientes web de música por streaming</strong> como <a href="http://www.deezer.com/" title="Deezer" target="_blank">Deezer</a> y todas aquellas que puedan trabajar en local y sean capaces de sincronizar su contenido más tarde, o necesiten reducir el flujo de peticiones.</p>
<h2>¿Cómo funciona?</h2>
<p>Para poder trabajar con App Cache lo primero que debemos conocer es el archivo llamado <strong>cache manifest</strong>. Se trata de un archivo de texto plano con la siguiente estructura:</p>
<pre class="brush: plain; title: ; notranslate">CACHE MANIFEST
#version 5.9

CACHE:
#This section list all resources that should be downloaded and store locally

#HTML files
index.html

#JavaScript files
/Scripts/appCache.js
/Content/images/glyphicons-halflings.png
/Scripts/bootstrap.min.js
/Scripts/jquery-1.9.1.min.js

#CSS files
/Content/bootstrap.min.css

NETWORK:
#This section list all URLs that may be loaded over Internet.
online.html

FALLBACK:
#Lists replacements for network URLs to be used when the browser is offline or the remote server is unavailable
/home.html /offline.html
/Content/images/glyphicons-halflings-white.png /Content/offline.png</pre>
<p>En primer lugar, todo manifiesto debe comenzar con <strong>CACHE MANIFEST</strong> en la primera línea del archivo, de lo contrario podemos encontrar problemas cuando se intenta procesar por el navegador. </p>
<div class="alert alert-info">También es importante tener cuidado con los códigos de control que inserta Visual Studio al crear este fichero dentro de una solución, por lo que recomiendo guardar el mismo como <strong>Unicode (UTF-8 without signature) &#8211; Codepage 65001</strong> a través de <strong>File &#8211;> Advanced Save Options</strong>.</div>
<p><strong>Todas aquellas líneas que comiencen con una almohadilla (#) se tratan de comentarios</strong>. A continuación revisamos las siguientes secciones del manifiesto:</p>
<dl class="dl-horizontal">
<dt>CACHE</dt>
<dd>Listado de todos aquellos recursos que deben ser descargados y almacenados localmente.</dd>
<dt>NETWORK</dt>
<dd>Lista de todas las URL que necesitan acceso al servidor remoto/Internet. Es posible utilizar el asterisco para indicar que cualquier recurso que no esté listado en el apartado CACHE necesita acceso a la red para acceder a él. Es posible hacer uso de URLs relativasy absolutas.</dd>
<dt>FALLBACK</dt>
<dd>En el caso de no tener acceso al servidor remoto se pueden especificar qué recursos deben responder por aquellos que no pueden ser recuperados. Los mismos pueden ser de cualquier tipo (una página HTML, una imágen, código JavaScript, etcétera). El primer parámetro es el recurso al que nos gustaría acceder y el segundo el que tomará su lugar cuando existan problemas de conectividad.
</dl>
<div class="alert alert-important">¡Nunca almacenes en cache el propio manifiesto!</div>
<p>Para indicar que un sitio tiene un manifiesto relacionado, <strong>basta con asociarlo en la etiqueta html de la página</strong>:</p>
<pre class="brush: xml; title: ; notranslate">&lt;!DOCTYPE html&gt;
&lt;html manifest=&quot;manifest.appcache&quot;&gt;
&lt;head&gt;</pre>
<p>El mismo puede tener el nombre y extensión que se prefiera, pero con convención se sugiere <strong>*.appcache</strong>. Como MIME type del mismo es recomendable servir <strong>text/cache-manifest</strong>. Si trabajamos con aplicaciones .NET podemos establecerlo a nivel del archivo web.config de la siguiente forma:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot;?&gt;

&lt;!--
  For more information on how to configure your ASP.NET application, please visit

http://go.microsoft.com/fwlink/?LinkId=169433

  --&gt;

&lt;configuration&gt;
  &lt;system.web&gt;
    &lt;compilation debug=&quot;true&quot; targetFramework=&quot;4.5&quot; /&gt;
    &lt;httpRuntime targetFramework=&quot;4.5&quot; /&gt;
  &lt;/system.web&gt;
  &lt;system.webServer&gt;
    &lt;staticContent&gt;
      &lt;mimeMap fileExtension=&quot;.appcache&quot; mimeType=&quot;text/cache-manifest&quot;/&gt;
    &lt;/staticContent&gt;
  &lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>
<h2>Ciclo de vida de Application Cache</h2>
<p>Una vez que la página asociada al manifiesto haya cargado, <strong>lo primero que el navegador comprobará es si tiene la versión más reciente del manifiesto para ese sitio</strong>. De no ser así descargará del servidor la última versión. <strong>Una vez obtenida comenzará a descargar todos los recursos nombrados en el apartado CACHE y aquellos que podrían ser utilizados como FALLBACK</strong>, en el caso de que no pudiéramos alcanzar el servidor de destino. A partir de este momento se trabajará con los recursos cacheados y <strong>no volverán a descargarse hasta que el manifiesto vuelva a sufrir una nueva actualización</strong> o limpiemos la datos temporales de nuestro navegador.<br />
Si quisiéramos comprobar su efectividad, basta con desconectar el dispositivo de Internet e intentar navegar a aquellas páginas y recursos que fueron nombrados en el manifiesto. Del mismo modo, si intentáramos acceder a aquellos recursos que poseen un fallback, el navegador nos desviaría directamente a aquellas URL indicadas como segundo parámetro.</p>
<div class="alert alert-error">Es muy importante recordar que aunque alguno de los recursos listados en el manifiesto sufran modificaciones los navegadores de los clientes no dispondrán de esos cambios hasta que la fecha de modificación del manifiesto se vea alterada (Es buena práctica indicar la versión del manifiesto en un comentario para forzar la modificación del archivo si los recursos no varían en número y sólo en forma). App Cache tampoco auto refresca la página y esto hará que los últimos cambios descargados por el navegador no sean aplicados hasta la próxima carga del sitio. Por lo tanto, será necesario forzar la recarga de la página de forma manual o automática basándose en los eventos que producen esta característica.</div>
<h2>Eventos</h2>
<p>En las versiones más recientes de Chrome (En el momento del post Chrome 26) es posible ver los eventos ocurridos a través de la consola de la herramienta de desarrollo:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/App-Cache-Events.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/App-Cache-Events.png" alt="App Cache Events" width="853" height="322" class="aligncenter size-full wp-image-6412" /></a></p>
<p>No obstante, es posible añadir manejadores a cada uno de ellos con el siguiente código JavaScript:</p>
<pre class="brush: jscript; title: ; notranslate">window.onload = function () {

    //App Cache
    if (window.applicationCache) {
        console.log(&quot;Application cache is available&quot;);

        var appCache = window.applicationCache;

        appCache.addEventListener(&quot;checking&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;downloading&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;noupdate&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;obsolete&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;progress&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;error&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;updateready&quot;, appCacheHandler, false);
        appCache.addEventListener(&quot;cached&quot;, appCacheHandler, false);

        function appCacheHandler(event) {
            var status = appCache.status;
            var msg = null;

            switch (status) {
                case appCache.CHECKING:
                    msg = &quot;&lt;span class='label label-warning'&gt;CHECKING&lt;/span&gt;&quot;;
                    break;
                case appCache.DOWNLOADING:
                    msg = &quot;&lt;span class='label label-info'&gt;DOWNLOADING&lt;/span&gt;&quot;;
                    break;
                case appCache.UNCACHED:
                    msg = &quot;&lt;span class='label label-inverse'&gt;UNCACHED&lt;/span&gt;&quot;;
                    break;
                case appCache.OBSOLETE:
                    msg = &quot;&lt;span class='label label-important'&gt;OBSOLETE&lt;/span&gt;&quot;;
                    break;
                case appCache.IDLE:
                    msg = &quot;&lt;span class='label label-info'&gt;IDLE&lt;/span&gt;&quot;;
                    break;
                case appCache.UPDATEREADY:
                    msg = &quot;&lt;span class='label label-success'&gt;UPDATEREADY&lt;/label&gt;&quot;;
                    break;
                default:
                    msg = &quot;UNKNOWN STATUS&quot;;
                    break;
            }

            var log = document.getElementById(&quot;log&quot;);
            log.innerHTML += '&lt;li&gt; Event: &lt;span class=&quot;label label-inverse&quot;&gt;' + event.type + '&lt;/span&gt; Status: ' + msg + &quot;&lt;/li&gt;&quot;;

            if (status === appCache.UPDATEREADY) {
                appCache.swapCache();
                if (window.confirm('App cache was updated, you need refresh this page... May I?'))                  
                    window.location.reload();
                else {
                    log.innerHTML += '&lt;li&gt;&lt;span class=&quot;label label-important&quot;&gt;You need to refresh this page to see the changes!&lt;/span&gt;&lt;/li&gt;';
                }
            }

        }
    }
};
</pre>
<div class="alert alert-info">Las clases CSS que he utilizado para mostrar la información pertenecen al <a href="http://twitter.github.io/bootstrap/" title="Bootstrap" target="_blank">framework Bootstrap de Twitter</a>.</div>
<p>Lo primero que comprobamos en nuestro código es si Application Cache está soportado por nuestro navegador (las últimas versiones de los navegadores más populares ya lo implementan). Para tener una visión más completa de la disponibilidad de esta característica podemos consultar <a href="http://html5test.com/compare/feature/offline-applicationCache.html" title="HTML 5 Test: Application cache" target="_blank">esta tabla</a>.</p>
<p>En cuanto a los eventos tenemos los siguientes:</p>
<dl>
<dt>checking</dt>
<dd>Se lanza cuando el navegador está comprobando la última versión del manifiesto alojada en el servidor remoto.</dd>
<dt>downloading</dt>
<dd>Indica que el manifiesto ha sido descargado y comienza la obtención de los recursos.</dd>
<dt>noupdate</dt>
<dd>Indica que tenemos la última versión del manifiesto y no es necesario descargar ningún recurso.</dd>
<dt>obsolete</dt>
<dd>La versión del servidor está obsoleta.</dd>
<dt>progress</dt>
<dd>Se lanza por cada uno de los recursos incluídos en la sección CACHE</dd>
<dt>error</dt>
<dd>Como su propio nombre indica, se trata del evento reservado para los errores durante la obtención de los recursos indicados en el manifiesto.</dd>
<dt>updateready</dt>
<dd>Nos permite conocer cuándo todos los recursos han sido actualizados con la nueva versión. En este ejemplo, además de mostrar el texto correspondiente, hacemos una comprobación al terminar el switch donde verificamos si hemos llegado a este punto y forzamos el cambio de cache a los nuevos elementos a través de la función <strong>swapCache()</strong>. Si bien esta función nos ahorra una recarga en el sitio, swapCache no nos permite servir los recursos actualizados de manera automática, por lo que debemos preguntar al usuario si podemos refrescar la página para aplicar los nuevos cambios.</dd>
<dt>cached</dt>
<dd>Los recursos han sido descargados y la aplicación ha sido cacheada. Este evento sólo ocurre la primera vez que se cachea el contenido. En las siguientes descargas será updateready el que se lance.</dd>
</dl>
<div class="alert alert-warning">También es posible solicitar la actualización de la cache a través de script (sin tener que refrescar la página) utilizando <strong>window.applicationCache.update()</strong>, aunque será necesario igualmente el swap de la caché y el refresco de la página para poder aplicar los últimos cambios. Suele utilizarse cuando el usuario ha estado trabajando durante mucho tiempo en el sitio sin tener que refrescar la página y recuperar así el nuevo manifiesto durante una recarga.</div>
<p>En este ejemplo la misma función controla todos los eventos posibles y, a través de un switch, muestra además el estado que refleja cada uno de ellos donde curiosamente no tiene por qué coincidir con el nombre del evento. Podemos verlo en la siguiente imagen:</p>
<p><a href="http://www.returngis.net/wp-content/uploads/2013/04/App-Cache-demo.png"><img src="http://www.returngis.net/wp-content/uploads/2013/04/App-Cache-demo.png" alt="App Cache demo" width="780" height="581" class="aligncenter size-full wp-image-6415" /></a></p>
<h2>Eventos Online y Offline</h2>
<p>Por último, aunque no pertenezca a la API de App Cache, me gustaría mostrar la forma de conocer cuándo una aplicación no dispone de acceso a Internet&#8230; ¡Efectivamente! Existe otra API para ello <img src='http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  En este caso debemos hablar de los <strong>eventos online y offline pertenecientes al objeto window.</strong> A través de la <strong>propiedad navigator.onLine</strong> podemos conocer cuál es nuestro estado actual e incluso podemos manejar los eventos online y offline de la siguiente manera:</p>
<pre class="brush: jscript; title: ; notranslate">    //Internet status
    function isOnline() {
        return navigator.onLine;
    }

    function internetStatus() {
        var className = isOnline() ? &quot;badge-success&quot; : &quot;badge-important&quot;;
        var statusName = isOnline() ? &quot;online&quot; : &quot;offline&quot;;

        var internet = document.getElementById(&quot;internet&quot;);
        internet.className = &quot;badge &quot; + className;
        internet.innerText = statusName;
    }

    window.addEventListener(&quot;online&quot;, internetStatus, false);
    window.addEventListener(&quot;offline&quot;, internetStatus, false);

    internetStatus();
</pre>
<p>Como podemos ver en el ejemplo, hemos encapsulado el valor de [window.]navigator.onLine en la función isOnline con el objetivo de comprobar dentro de internetStatus cuál es su valor y asociar una clase y un texto a una etiqueta con id &#8220;internet&#8221; en nuestra página. Además asociamos esta función a los eventos online y offline de window para que, cada vez que ocurran, se vuelta a comprobar el estado de nuestro acceso a Internet. Por último se llama a internetStatus una primera vez al cargar la página para conocer en qué estado nos encontramos inicialmente.</p>
<p>Podéis encontrar más información y demos en la página <a href="http://appcachefacts.info/" title="Appcache facts" target="_blank">Appcache Facts</a>.<br />
Existe una página llamada <a href="http://manifest-validator.com/" title="Cache Manifest Validator" target="_blank">Cache Manifest Validator</a> que nos permite comprobar si hemos creado nuestro manifiesto correctamente. De hecho, también disponemos de una <a href="https://chrome.google.com/webstore/detail/cache-manifest-validator/lomdbpjnhnphfhgmaeedafmnfeikkcfo?utm_source=chrome-ntp-icon" title="Cache Manifest Validator" target="_blank">extensión para Chrome</a> que realiza la misma función.</p>
<p>Espero que haya sido de utilidad <img src='http://www.returngis.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>¡Saludos!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/returngis?a=V5EgbIrH5fQ:wbvoDbSHwpU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/returngis?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=V5EgbIrH5fQ:wbvoDbSHwpU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/returngis?i=V5EgbIrH5fQ:wbvoDbSHwpU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=V5EgbIrH5fQ:wbvoDbSHwpU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/returngis?i=V5EgbIrH5fQ:wbvoDbSHwpU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=V5EgbIrH5fQ:wbvoDbSHwpU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/returngis?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/returngis?a=V5EgbIrH5fQ:wbvoDbSHwpU:tKBiNdHYW3c"><img src="http://feeds.feedburner.com/~ff/returngis?d=tKBiNdHYW3c" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/returngis/~4/V5EgbIrH5fQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.returngis.net/2013/04/html-5-application-cache-aplicaciones-offline/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.returngis.net/2013/04/html-5-application-cache-aplicaciones-offline/</feedburner:origLink></item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

 Served from: www.returngis.net @ 2013-05-27 16:17:11 by W3 Total Cache --><!-- W3 Total Cache: Page cache debug info:
Engine:             disk
Cache key:          6446da9455d059d840d3396315f880df
Caching:            disabled
Reject reason:      Page is feed
Status:             not cached
Creation Time:      1.992s
Header info:
X-Pingback:          http://www.returngis.net/xmlrpc.php
Last-Modified:       Mon, 27 May 2013 15:16:02 GMT
Content-Type:        text/xml; charset=UTF-8
-->
