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

<channel>
	<title>Marcos Fernández &#187; javascript</title>
	<atom:link href="http://www.marcosdev.com/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcosdev.com</link>
	<description>Programación de páginas web</description>
	<lastBuildDate>Thu, 17 Feb 2011 18:31:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Rendimiento: YUI Compressor + ANT = Ficheros comprimidos</title>
		<link>http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/</link>
		<comments>http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 18:31:50 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=117</guid>
		<description><![CDATA[El post anterior trataba sobre la utilización de la herramienta ANT para concatenar varios ficheros y así reducir el número de peticiones que hacía nuestra página web para ser cargada. Otro punto importante, es que la posibilidad de reducir el fichero concatenado a un fichero mucho menor. La reducción puede ser tal, que según que <a href="http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>El post anterior trataba sobre la utilización de la herramienta ANT para concatenar varios ficheros y así reducir el número de peticiones que hacía nuestra página web para ser cargada.</p>
<p>Otro punto importante, es que la posibilidad de reducir el fichero concatenado a un fichero mucho menor. La reducción puede ser tal, que según que librerías pueden llegar a reducirse un 80% del total de su peso. Si estamos de aplicaciones de intranet, podemos estar hablando de reducir la carga de 1 Mb a 300 Kb, lo cual es una mejora sustancial.</p>
<p>En post bastante antiguos expliqué el uso de la compresión de ficheros js mediante el PHP. Esta técnica es muy cómoda para sitios pequeños, pero en el momento que el proyecto reciba muchas peticiones, este sistema se puede volver en nuestra contra ya que estamos sobrecargando el servidor con un trabajo extra que puede ser evitado.</p>
<p>La versión más óptima de enviar ficheros comprimidos es que estos ya lo estén y que el servidor web únicamente se encargue de servir esta petición. Para ello vamos a utilizar gran librería creada por los expertos en optimización web de Yahoo: <a title="Ir a la página de la librería" href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>. Necesitamos descargarnos esta librería y utilizar el fichero jar que tenemos en la carpeta build. Para los que no sepáis Java, tranquilos, no es necesario. Únicamente vamos a configurar nuestro XML de Ant para que utilice dicha librería para comprimir nuestros ficheros javascript (esta técnica también es aplicable a ficheros CSS).</p>
<p>Para ello, agregaremos la siguiente porción de código XML a nuestro fichero creado en el <a title="Ver post anterior" href="http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/">anterior post</a>:</p>
<p>Este grupo de tareas se llama <em>comprimirFicheros</em> y antes de ejecutarse, ejecutará de forma no paralela el grupo de tareas <em>concatenarFicherosJs</em>. Más adentro, se le define la carpeta dónde están ubicados los ficheros js y que ficheros queremos comprimir, en este caso, el fichero que hemos generado después de concatenar los ficheros del grupo de tareas <em>concatenarFicherosJs</em>. Luego aparecen un grupo de líneas que detallan que la ejecución de la librería y algunos argumentos que ésta precisa.  Y por último no menos importante, se define que todos los ficheros js seleccionados para ser comprimidos, tendrán una copia con el mismo nombre pero acabado en -<em>min.js</em>.</p>
<pre class="brush: xml">
&lt;target name=&quot;comprimirFicheros&quot; depends=&quot;concatenarFicherosJs&quot;&gt;
&lt;apply executable=&quot;java&quot; parallel=&quot;false&quot;&gt;
&lt;fileset dir=&quot;js/&quot; includes=&quot;fichero.js&quot;/&gt;
&lt;arg line=&quot;-jar&quot;/&gt;
&lt;arg path=&quot;yuicompressor.jar&quot;/&gt;
&lt;srcfile /&gt;
&lt;arg line=&quot;-o&quot;/&gt;
&lt;mapper type=&quot;glob&quot; from=&quot;*.js&quot; to=&quot;js/*-min.js&quot;/&gt;
&lt;targetfile /&gt;
</pre>
<p>Así, cuando hemos ejecutado este grupo de tareas, se ha ejecutado otro grupo (<em>concatenarFicherosJs</em>) y se ha generado un fichero comprimido del fichero generado por el grupo anterior (f<em>ichero-min.js</em>). En este caso la reducción es mínima ya que son ficheros muy pequeños, pero si hacéis pruebas con ficheros más grandes, podréis comprobar la gran mejora sobre el peso del fichero que provoca la compresión con esta utilidad.</p>
<p>Esto debe ser un <em>MUST</em>, como dicen los anglosajones, dentro de nuestras técnicas para mejorar el rendimiento de nuestro sitio web.</apply></target></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/rendimiento-yui-compressor-ant-ficheros-comprimidos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rendimiento: concatenando ficheros con ANT, reduciendo peticiones</title>
		<link>http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/</link>
		<comments>http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 21:26:27 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=104</guid>
		<description><![CDATA[Uno de los puntos primordiales en el rendimiento de la web es la reducción del número de peticiones que ésta realiza al servidor para cargar todos los elementos. A más peticiones, más tarda la página en cargar. Es cierto que podemos utilizar un CDN para cargar los ficheros necesarios de nuestra web desde diferentes servidores <a href="http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Uno de los puntos primordiales en el rendimiento de la web es la reducción del número de peticiones que ésta realiza al servidor para cargar todos los elementos. A más peticiones, más tarda la página en cargar. Es cierto que podemos utilizar un <a title="Explicación de CDN (En inglés)" href="http://en.wikipedia.org/wiki/Content_delivery_network">CDN</a> para cargar los ficheros necesarios de nuestra web desde diferentes servidores y con ello aumentar el rendimiento, pero esto es un añadido, no una mejora esencial.</p>
<p>Dentro de este tema de reducir las peticiones, aparece un tema recurrente en prácticamente todo proyecto web que se precie: la llamada a múltiples ficheros js para cargar una página web. Normalmente, nuestra página cuenta con algún framework javascript, cómo <a title="Ir al sitio web de jQuery" href="http://www.jquery.com">jQuery</a>, el uso de algún <a title="Directorio de plugins de jQuery" href="http://plugins.jquery.com/">plugin</a> de este framework que estamos utilizando y por último, nuestro propio fichero js con javascript que hemos manufacturado nosotros. Es decir, de inicio, ya tenemos como mínimo tres peticiones. Veamos cómo podemos reducir el número de peticiones de 3 a 1.</p>
<p>Para ello, haremos uso de <a title="Ir a la web del proyecto Apache Ant" href="http://ant.apache.org/">Ant</a>. Para quien no lo conozca, es una herramienta que permite realizar tareas mecánicas, normalmente muy utilizada en proyectos Java. Las tareas se definen en ficheros xml que dicha herramienta interpreta. Entornos de desarrollo como <a title="Ir a la web del proyecto Netbeans" href="http://www.netbeans.org">Netbeans</a> o <a title="Ir a la web del proyecto Eclipse" href="http://www.eclipse.org/">Eclipse</a>, llevan integrado esta utilidad. Veamos el siguiente xml:</p>
<pre class="brush: xml">
&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project name=&quot;DemoJavascript&quot; xmlns:rsel=&quot;antlib:org.apache.tools.ant.types.resources.selectors&quot;&gt;
&lt;target name=&quot;concatenarFicherosJs&quot; description=&quot;Unir varios ficheros js en orden&quot;&gt;
&lt;concat destfile=&quot;js/fichero.js&quot;&gt;
&lt;filelist dir=&quot;js/&quot;&gt;
&lt;file name=&quot;ficheroUno.js&quot; /&gt;
&lt;file name=&quot;ficheroDos.js&quot; /&gt;
&lt;file name=&quot;ficheroTres.js&quot; /&gt;
&lt;/filelist&gt;
&lt;/concat&gt;
&lt;/target&gt;
&lt;/project&gt;
</pre>
<p>Lo primero que se define es un nombre del proyecto más el xlmns de Apache Ant, lo cual nos sirve para validar nuestra sintaxis dentro del fichero xml.</p>
<p>Luego definimos un grupo de tareas &#8211; <em>target</em> (nuestro fichero puede contener más de  un grupo de tareas) y la llamamos <em>concatenarFicherosJs</em>. Este grupo tiene una tarea llamada <em>concat</em> la cual indica que se deben concatenar ficheros. Esta tarea, define un atributo <em>destfile</em> que indica el fichero que contendrá los tres ficheros concatenados. Ya hemos indicado que queremos concatenar y en dónde queremos guardar el fichero generado. Ahora nos queda indicar que ficheros y en que orden queremos que se concatenen. Eso se realiza mediante la definición de una lista de ficheros &#8211; <em>filelist</em>, dónde indicamos la ruta &#8211; <em>dir</em> &#8211; dónde encontrar los ficheros que a continuación definimos. A partir de ahí, definimos cada uno de los ficheros que queremos concatenar y en que orden necesitamos que se concatenen. El orden es importante ya que si primero si intenta cargar un plugin de jQuery sin que el framework se haya cargado antes, nos dará un error.</p>
<p>Para los que no han utilizado nunca Ant, hay muchos ejemplos sencillos en internet de cómo ejecutar tareas de Ant desde Eclipse y Netbeans.</p>
<p>Esto es todo. Ahora ya podemos modificar nuestra página para que en vez de realizar tres solicitudes, cargue un único fichero. En la utilización de proyectos mucho más complejos, esto puede ser una mejora sustancial ya que podemos reducir las peticiones de 8 o 9 a 1 o 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/rendimiento-concatenando-ficheros-con-ant-reduciendo-peticiones/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Javascript &#8211; rendimiento: generación de nuevo contenido</title>
		<link>http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/</link>
		<comments>http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:45:20 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=99</guid>
		<description><![CDATA[Gracias a la mejora que ha sufrido los motores de javascript de los navegadores y de la revolución que ha supuesto Ajax para el mundo del desarrollo web, cada vez se ha optado por generación del contenido sin la necesidad de recargar la página. El problema, es que esta generación al vuelo, si no se <a href="http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Gracias a la mejora que ha sufrido los motores de javascript de los navegadores y de la revolución que ha supuesto Ajax para el mundo del desarrollo web, cada vez se ha optado por generación del contenido sin la necesidad de recargar la página.</p>
<p>El problema, es que esta generación al vuelo, si no se hace bien, puede producir que nuestra página sufra grandes retardos e incluso a mucha gente le aparezca el contenido a golpes. Esto suele ser debido a que el contenido que se está generando, se está inyectando al DOM durante su proceso de creación. Esto provoca que recorramos continuamente al DOM. Veamos un ejemplo:</p>
<pre class="brush: javascript">
var accessDiv = document.getElementById(&#039;access&#039;);
for (var i = 0; i &lt; 50; i++){
accessDiv.innerHTML += &#039;hola&#039;;
}
</pre>
<p>De siguiente forma, generamos el html y una vez generado, entonces lo introducimos en el DOM:</p>
<pre class="brush: javascript">
var html = &#039;&#039;;
for (var i = 0; i &lt; 50; i++){
html += &#039;hola&#039;;
}
document.getElementById(&#039;access&#039;).innerHTML = html;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/javascript-rendimiento-generacion-de-nuevo-contenido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript – rendimiento: array.length</title>
		<link>http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/</link>
		<comments>http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 17:41:36 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=91</guid>
		<description><![CDATA[Seguimos con otro punto a tener en cuenta a la hora de mejorar el rendimiento de nuestro código javascript. Supongamos que queremos recorrer todo los elementos DIV de una determinada página.  Normalmente el código que haríamos sería el siguiente: var elementosDiv = document.getElementsByTagName(&#039;div&#039;); for (var i = 0; i &#60;  elementosDiv.length; i++){ //Trabajar con el <a href="http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seguimos con otro punto a tener en cuenta a la hora de mejorar el rendimiento de nuestro código javascript. Supongamos que queremos recorrer todo los elementos DIV de una determinada página.  Normalmente el código que haríamos sería el siguiente:</p>
<pre class="brush: javascript">
var elementosDiv = document.getElementsByTagName(&#039;div&#039;);
for (var i = 0; i &lt;  elementosDiv.length; i++){
//Trabajar con el array elementosDiv[i]
}
</pre>
<p>En la variable elementosDiv guardamos un array con todos los elementos DIV que contiene en nuestra página. Después, vamos iterando sobre este array trabajamos con cada uno de los elementos que componen este array. El problema que tiene este código, es que la variable elementosDiv contiene un array de elementos vivos, es decir, contiene una referencia directa al objeto DOM de nuestra página. Si durante la ejecución del bucle se agrega un nuevo elemento DIV a la página, automáticamente elementosDiv.length valdrá lo que valía antes más uno. Esto nos indica que para cada iteración del bucle, nuestro código solicita que se cuenten cuantos elementos DIV tiene el objeto DOM, lo cual produce una gran carga al navegador.</p>
<p>Para evitar este comportamiento, es tan sencillo como guardar cuantos elementos DIV hay justo antes de comenzar con la iteración.</p>
<pre class="brush: javascript">
var elementosDiv = document.getElementsByTagName(&#039;div&#039;);
for (var i = 0, count = elementosDiv.length; i &lt; count; i++){
//Trabajar con el array elementosDiv[i]
}
</pre>
<p>En este código, justo cuando se inicializa el bucle, se guarda en la variable count el número de elementos del array. De esta forma, ya no es necesario que en cada iteración del bucle se tenga que ir a contar el número de elementos DIV al objeto DOM.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/javascript-%e2%80%93-rendimiento-array-length/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript &#8211; rendimiento: reduciendo los accesos al DOM</title>
		<link>http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/</link>
		<comments>http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 18:44:37 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=84</guid>
		<description><![CDATA[Programar aplicaciones fiables debe ser el objetivo de cualquier profesional dedicado a este mundo. El problema, es que a veces nos centramos tanto en la fiabilidad que perdemos de vista otros elementos como pueden ser la usabilidad, accesibilidad, y en el caso que tratamos en este post, el rendimiento. En la actualidad, el rendimiento, y <a href="http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Programar aplicaciones fiables debe ser el objetivo de cualquier profesional dedicado a este mundo. El problema, es que a veces nos centramos tanto en la fiabilidad que perdemos de vista otros elementos como pueden ser la usabilidad, accesibilidad, y en el caso que tratamos en este post, el rendimiento. En la actualidad, el rendimiento, y sobretodo en internet, es un factor clave para que un proyecto pueda tener éxito.</p>
<p>En este primer post, vamos a ver un truco  muy sencillo para optimizar el rendimiento de nuestro código javascript y así conseguir una respuesta más rápida de nuestro navegador.</p>
<p>Suponemos el siguiente código:</p>
<pre>
<pre class="brush: javascript">

   var start = new Date().getTime();
   for (var i = 0; i &lt; 5000; i++){
      document.getElementById(&#039;s&#039;).value = i;
   }
   var elapsed = new Date().getTime() - start;
   console.log(elapsed);
</pre>
</pre>
<p>Este código accederá 5000 veces a un objeto y le cambiará su valor. Si ejecutáis este código con el firebug, podréis el tiempo en milisegundos que tarda en ejecutar dicho código. Cada vez que itera en el bucle, debe acceder al DOM y recorrerlo buscando un elemento que tenga un identificador igual a &#8216;s&#8217;.</p>
<p>Optimizar este código es muy sencillo y únicamente debemos acceder una vez al dom y guardar el objeto en una variable.
</pre>
<pre>
<pre class="brush: javascript">

   var start = new Date().getTime();
   var s = document.getElementById(&#039;s&#039;);
   for (var i = 0; i &lt; 5000; i++){
      s.value = i;
   }
   var elapsed = new Date().getTime() - start;
   console.log(elapsed);
</pre>
</pre>
<p>Y aún mejor, si no queremos realizar ningún tipo de animación, únicamente mostrar un valor después de un bucle, podemos asignarlo al final del proceso
</pre>
<pre>
<pre class="brush: javascript">

  var start = new Date().getTime();
  var j;
  for (var i = 0; i &lt; 5000; i++){
   //Aquí haríamos nuestro cálculo
   j = i;
  }
  document.getElementById(&#039;s&#039;).value = j;
  console.log(end.getTime() - start);
</pre>
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/javascript-rendimiento-reduciendo-accesos-do/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cargar Google Maps de forma asíncrona</title>
		<link>http://www.marcosdev.com/cargar-google-maps-de-forma-asincrona/</link>
		<comments>http://www.marcosdev.com/cargar-google-maps-de-forma-asincrona/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 18:07:20 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[asíncrona]]></category>
		<category><![CDATA[carga]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[maps]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=31</guid>
		<description><![CDATA[Google Maps ha sido uno de los grandes inventos que se sacó Google de la manga. Normalmente para cargar Google Maps situamos una etiqueta &#60;script&#62; dentro de nuestra página con nuestra id del api de Google Maps. Luego modificamos la etiqueta &#60;body&#62; para que cuando se cargue el documento, ejecute una función para inicializar el <a href="http://www.marcosdev.com/cargar-google-maps-de-forma-asincrona/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Google Maps ha sido uno de los grandes inventos que se sacó Google de la manga. Normalmente para cargar Google Maps situamos una etiqueta &lt;script&gt; dentro de nuestra página con nuestra id del api de Google Maps. Luego modificamos la etiqueta &lt;body&gt; para que cuando se cargue el documento, ejecute una función para inicializar el mapa.</p>
<p>El problema que ya comenté en un post anterior (Cargar Google Analytics una vez se haya cargado la página), es que esto, en según que momentos, puede enlentecer de una forma muy grave nuestra página, o por ejemplo, el mapa lo tenemos en una pestaña que por defecto no es visible. Por ello, podemos obtar por una solución que incrementará sustancialmente la velocidad de carga de nuestra página y que se encargará de que, una vez se haya cargado la página, proceder a la descarga y la inicialización del nuestro Google Map.</p>
<p>Esta no es la única utilidad, también podríamos cargar nuestro Google Map a voluntad mediante la pulsación de cualquier elemento. Esto nos permitiría que en una página no cargásemos el Google Map hasta que el usuario decidiese utilizaro, aliviando la carga de nuestra página.</p>
<p><span id="more-31"></span></p>
<p>Veamos un ejemplo práctico llamando a Google Maps una vez se ha terminado la carga de nuestra página:<br />
<a title="Cargar Google Maps al finalizar la carga del resto de la página" href="http://www.marcosdev.com/ejemplos/googlemaps_async/">http://www.marcosdev.com/ejemplos/googlemaps_async/</a></p>
<p>Lo primero de todo, veamos la estructura de nuestros ficheros:</p>
<p><a href="http://www.marcosdev.com/wp-content/imagen-1.png"><img class="aligncenter size-full wp-image-32" title="Estructura de ficheros" src="http://www.marcosdev.com/wp-content/imagen-1.png" alt="" width="160" height="77" /></a></p>
<p>Por un lado tenemos un fichero html en el cual hay una capa que utilizaremos para insertar nuestro Google Maps y las llamadas a los ficheros googleMaps.js y jquery.js.</p>
<pre>
<pre class="brush: html">
&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
   &lt;title&gt;Ejemplo de carga de forma asíncrona de Google Maps&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
   &lt;div id=&quot;mapa&quot; style=&quot;width:300px;height: 300px&quot;&gt;
      &lt;p style=&quot;text-align:center&quot;&gt;&lt;strong&gt;Cargando&lt;/strong&gt;&lt;/p&gt;
   &lt;/div&gt;
   &lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; src=&quot;googleMaps.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
</pre>
<p>Cómo podemos ver, el div con id &#8220;<em>mapa</em>&#8221; tiene un texto interior que pone &#8220;Cargando&#8221;. Esto es para que mientras se carga nuestro Google Maps el visitante pueda saber que el navegador está trabajando. Después del div, insertamos las dos llamadas a nuestros ficheros javascript. El primero es la librería jQuery que nos ayudará realizar la petición de carga del conjunto de ficheros necesarios para cargar Google Maps.</p>
<p>En el fichero googleMaps.js tenemos el código necesario para realizar la carga del mapa:</p>
<pre>
<pre class="brush: jscript">
function cargarMapa(){
   if (GBrowserIsCompatible()) {
      var map = new GMap2(document.getElementById(&quot;mapa&quot;));
      map.setCenter(new GLatLng(39.578678,2.646021), 16);
   }
};

$(document).ready(function(){
   var api=&#039;ABQIAAAAOxTvdJxbyGuGB8_UUEe52xRHT0E5MDpBZnfhvo0jhLIefK70hRTYIol4_Lr75EWTtT9VjcaZzY2QWg&#039;;
   $.getScript(&#039;http://maps.google.com/maps?file=api&amp;v=2.x&amp;key=&#039;+api+&#039;&amp;async=2&amp;callback=cargarMapa&#039;);
});
</pre>
</pre>
<p>Lo primero que vemos es una función llamada &#8220;<em>cargarMapa</em>&#8221; la cual será llamada una vez tengamos cargada la librería de Google Maps. Esta función únicamente se encarga de mostrar nuestro Google Maps en un determinado div (en nuestro caso el div llamado &#8220;<em>mapa</em>&#8220;) y situarlo en una coordenada (<em>new GLatLng(39.578678,2.646021)</em>) con un determinado zoom (<em>16</em>).</p>
<p>La parte interesante viene justo después. Vemos el comienzo típico de cualquier fichero js que jQuery ( <em>$(document).ready(function(){</em> ) y justo después dos líneas de código; la primera es una variable en la cual, por cuestiones de tener un código más legible, guardo el clave del api de Google Maps. Y en el segundo realizo la petición, que a simple vista, es la misma url que normalmente nos da google para poner en las etiquetas <em>&lt;script&gt;</em>. Pero si nos fijamos, existe dos diferencias. Justo al final de la línea vemos que hay dos parámetros de url nuevos: <em>&amp;asyn=2&amp;callback=cargarMapa</em>. El primero (<em>async=2</em>) permite llamara de forma asíncrona (cuando nosotros queramos y no siempre cuando se carga el documento al completo), y el segundo (<em>callback=cargarMapa</em>) es el parámetro que le dice a Google Maps que función debe ejecutar una vez tenga todo lo necesario cargado para ser ejecutado.</p>
<p>Ponerlo en práctica es tremendamente sencillo y podemos sacarle mucha utilidad al tema, como por ejemplo, la siguiente demostración dónde cargamos el mapa cuando alguien hace clic sobre un botón:</p>
<p><a title="Cargar Google Maps al hacer clic" href="http://www.marcosdev.com/ejemplos/googlemaps_async/index2.html">http://www.marcosdev.com/ejemplos/googlemaps_async/index2.html</a></p>
<p>La diferencia entre el primer ejemplo y este segundo, reside en que la capa &#8220;mapa&#8221; la tengo escondida y que en vez de cargar el mapa directamente, le agrego una funcionalidad al botón para que este lo carge cuando hagan clic sobre él, y además, haga visible la capa:</p>
<pre>
<pre class="brush: html">
&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
   &lt;title&gt;Ejemplo de carga de forma asíncrona de Google Maps&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
   &lt;div id=&quot;mapa&quot; style=&quot;width:300px;height:300px;display:none;&quot;&gt;
      &lt;p style=&quot;text-align:center&quot;&gt;&lt;strong&gt;Cargando&lt;/strong&gt;&lt;/p&gt;
   &lt;/div&gt;
   &lt;input type=&quot;button&quot; name=&quot;bCargar&quot; id=&quot;bCargar&quot; value=&quot;Cargar Mapa&quot; /&gt;
   &lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; src=&quot;googleMaps.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
</pre>
<pre>
<pre class="brush: jscript">
function cargarMapa(){
   if (GBrowserIsCompatible()) {
      var map = new GMap2(document.getElementById(&quot;mapa&quot;));
      map.setCenter(new GLatLng(39.578678,2.646021), 16);
  }
};

$(document).ready(function(){

   //Agregamos evento click al botón
   $(&#039;#bCargar&#039;).click(function(){
      //Mostramos la capa mapa
      $(&#039;#mapa&#039;).show();
      var api=&#039;ABQIAAAAOxTvdJxbyGuGB8_UUEe52xRHT0E5MDpBZnfhvo0jhLIefK70hRTYIol4_Lr75EWTtT9VjcaZzY2QWg&#039;;
      $.getScript(&#039;http://maps.google.com/maps?file=api&amp;v=2.x&amp;key=&#039;+api+&#039;&amp;async=2&amp;callback=cargarMapa&#039;);
   });
});
</pre>
</pre>
<p>Espero que les sea útil</p>
<p>P.D.: Los estilos de la capa &#8220;mapa&#8221; están escritos utilizando el atributo style. Esto no es una buena práctica; hay que utilizar ficheros CSS de estilos. Lo he hecho así para hacerlo más visible para todos.</p>
<p>P.D2.: En el segundo ejemplo se podría insertar la capa &#8220;mapa&#8221; en tiempo real sin necesidad de que esté en el código, pero sería menos didácticos para aquellas personas que tengan un nivel bajo de Javascript.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/cargar-google-maps-de-forma-asincrona/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Cargar Google Analytics una vez se haya cargado la página</title>
		<link>http://www.marcosdev.com/cargar-google-analytics-una-vez-se-haya-cargado-la-pagina/</link>
		<comments>http://www.marcosdev.com/cargar-google-analytics-una-vez-se-haya-cargado-la-pagina/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 07:31:05 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[google analytics]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=27</guid>
		<description><![CDATA[Muchas veces nos encontramos con la situación de que a una página le cuesta terminar de cargar por culpa del Google Analytics. Yo lo he sufrido en mis propias carnes con proyectos de cierto tamaño. A pesar de la granja inmensa y poderosísima de servidores de Google, muchas veces por razones varias, este caso se <a href="http://www.marcosdev.com/cargar-google-analytics-una-vez-se-haya-cargado-la-pagina/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Muchas veces nos encontramos con la situación de que a una página le cuesta terminar de cargar por culpa del Google Analytics. Yo lo he sufrido en mis propias carnes con proyectos de cierto tamaño. A pesar de la granja inmensa y poderosísima de servidores de Google, muchas veces por razones varias, este caso se da. También afecta a la situación de que si utilizas frameworks de Javascript como jQuery, el Google Analytics te para la carga del resto de elementos hasta que él no haya terminado su carga. El problema es que no podemos guardar en nuestro servidor el fichero ga.js o el fichero urchin.js que solicitamos a Google.</p>
<p>Podemos solventar el problema de una manera muy sencilla, cargar Google Analytics una vez se haya cargado el resto de las páginas. Esta situación tiene una ventaja muy grande, si Google Analytics se pone tontito, el resto de la página puede vivir en paz. A pesar de que lo voy a explicar a continuación se puede realizar de otras formas, voy a utilizar el framework jQuery por su sencillez y potencia.</p>
<p><span id="more-27"></span></p>
<p>Lo primero que debemos hacer es incluir la librería jquery. Yo todas las inclusiones de ficheros js las hago al final, justo antes de la etiqueta de cierre de body (Norma de aceleración de velocidad de carga de páginas web de YSlow).</p>
<pre id="line255">
<pre class="brush: html">
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
</pre>
</pre>
<p>Y justo debajo introducimos el siguiente código</p>
<pre id="line255">
<pre class="brush: html">
&lt;script type=&quot;text/javascript&quot;&gt;
   $(document).ready(function(){
      $.getScript(&#039;http://www.google-analytics.com/ga.js&#039;,function(){
         if (typeof(_gat) == &#039;object&#039;){
            var pageTracker = _gat._getTracker(&#039;UA-1806963-8&#039;);
            pageTracker._initData();
            pageTracker._trackPageView();
         }
      });
   });
&lt;/script&gt;
</pre>
</pre>
<p>Dentro del segundo bloque de código debes substituir UA-1806963-8 por tu ID de Google Analytics. Si queréis ver un ejemplo funcionando podéis visitar la siguiente página: <a title="Página de oferta turística complementaria" href="http://www.holjoy.com">http://www.holjoy.com</a></p>
<p>Un saludo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/cargar-google-analytics-una-vez-se-haya-cargado-la-pagina/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Videotutorial &#8211; Reducir javascript con PHP</title>
		<link>http://www.marcosdev.com/videotutorial-reducir-javascript-con-php/</link>
		<comments>http://www.marcosdev.com/videotutorial-reducir-javascript-con-php/#comments</comments>
		<pubDate>Fri, 02 May 2008 19:34:50 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[videotutoriales]]></category>
		<category><![CDATA[optimizar]]></category>
		<category><![CDATA[reducir]]></category>
		<category><![CDATA[screecast]]></category>
		<category><![CDATA[videotutorial]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=8</guid>
		<description><![CDATA[Videotutorial sobre el tutorial para reducir ficheros javascript con PHP. Duración: 13:03 Descarga en formato QuickTime]]></description>
			<content:encoded><![CDATA[<p>Videotutorial  sobre el tutorial para reducir ficheros javascript con PHP.</p>
<p>Duración: 13:03</p>
<p><span id="more-8"></span></p>
<p><code><img src="http://www.marcosdev.com/wp-content/plugins/flash-video-player/default_video_player.gif" /></code></p>
<p><a href="http://www.marcosdev.com/videos/reducir-js-php.mov">Descarga en formato QuickTime </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/videotutorial-reducir-javascript-con-php/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
<enclosure url="http://www.marcosdev.com/videos/reducir-js-php.mov" length="19057131" type="video/quicktime" />
<enclosure url="http://www.marcosdev.com/videos/reducir-js-php.flv" length="49532051" type="video/x-flv" />
		</item>
		<item>
		<title>Reducir ficheros javascript con PHP</title>
		<link>http://www.marcosdev.com/reducir-ficheros-javascript-con-php/</link>
		<comments>http://www.marcosdev.com/reducir-ficheros-javascript-con-php/#comments</comments>
		<pubDate>Fri, 02 May 2008 14:01:46 +0000</pubDate>
		<dc:creator>Marcos Fernández</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[optimizar]]></category>
		<category><![CDATA[reducir]]></category>

		<guid isPermaLink="false">http://www.marcosdev.com/?p=5</guid>
		<description><![CDATA[Uno de los problemas más habituales hoy en día en el desarrollo de páginas web es la utilización de múltiples ficheros Javascript. Estos ficheros a la mínima que la página sea algo grande, toman un peso muy significativo. Una de las premisas que siempre debemos tener en la cabeza es hacer que nuestra página cargue <a href="http://www.marcosdev.com/reducir-ficheros-javascript-con-php/"> leer más <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Uno de los problemas más habituales hoy en día en el desarrollo de páginas web es la utilización de múltiples ficheros Javascript. Estos ficheros a la mínima que la página sea algo grande, toman un peso muy significativo. Una de las premisas que siempre debemos tener en la cabeza es hacer que nuestra página cargue lo más rápido posible. (El addon para <a title="Página oficial de navegador Firefox" href="http://www.mozilla-europe.org/es/products/firefox/">Firefox</a> llamado <a title="Página oficial de YSlow" href="http://developer.yahoo.com/yslow/">YSlow</a> que se integra con <a title="Página oficial del addon Firebug" href="http://www.getfirebug.com/">Firebug</a> es muy útil para optimizar nuestra página).</p>
<p>Como toda buena práctica de programación, nuestro código incluye sangrías y comentarios. Si no ponemos sangrías nuestro código se hace incomprensible, y si le quitamos los comentarios, dentro de unos meses nos acordaremos de aquel día que decidimos no escribir una frase aclaratoria de que hacía aquella función.</p>
<p><span id="more-5"></span></p>
<p>Por ello, existen multitud de herramientas que permite que a partir de un fichero javascript nuestro, se genere un fichero javascript reducido, es decir, sin espacios, sin comentarios, e incluso ofuscado (cambia nombre a las variables por letras o números y trata de reducir la comprensión del código por alguien que quiera copiarnos o analizarnos para un ataque).</p>
<p>Estas herramientas el problema que tienen es que debes tener un fichero para el desarrollo y luego de haber hecho los cambios oportunos, debes generar el fichero reducido.</p>
<p>En este tutorial veremos como podemos reducir en tiempo real los ficheros Javascript que precise nuestro documento mediante PHP (es necesario tener la versión 5). Además, si nuestra página utiliza más de un fichero js (javascript), lograremos reducir las peticiones al mínimo. Por ejemplo, nuestra página utiliza tres ficheros js nuestros, son tres peticiones. Lograremos reducirlo a únicamente una petición. Caso aparte es cuando debes realizar la inclusión de un fichero js como el de Google Maps, con el cual no puedes utilizar esta técnica.</p>
<p>Vamos manos a la obra.</p>
<p>Lo primero que necesitamos es descargar una librería llamada Jsmin-php. Podéis encontrarlo en su <a title="Página web Jsmin-php" href="http://code.google.com/p/jsmin-php/">página web</a>, y justo en la derecha hay un botón para accionar la <a title="Descarga directa de Jsmin-php" href="http://jsmin-php.googlecode.com/files/jsmin-1.1.1.php">descarga</a>.</p>
<p>Descargamos el dichero jsmin-1.1.1.php (esta era la versión al momento de hacer este tutorial).</p>
<p>Supongamos que tenemos la siguiente estructura de ficheros:</p>
<p style="text-align: center;"><a href="http://www.marcosdev.com/wp-content/imagen-2.png"><img class="alignnone size-medium wp-image-6 aligncenter" title="Estructura de ficheros" src="http://www.marcosdev.com/wp-content/imagen-2.png" alt="" width="143" height="87" /></a></p>
<p style="text-align: left;">En la imagen podemos observar que tenemos un fichero index.php en el cual hay el siguiente código:</p>
<pre class="brush: html">
&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/meta&gt;&lt;/head&gt;
&lt;body&gt;
&lt;p id=&#039;parrafo&#039;&gt;Hola&lt;/p&gt;

&lt;script type=&#039;text/javascript&#039; src=&#039;test.js&#039;&gt;&lt;/script&gt;
&lt;script type=&#039;text/javascript&#039; src=&#039;test2.js&#039;&gt;&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Cómo se puede observar es un documento en blanco con un párrafo en el cual está escrito la palabra Hola. Este párrafo tiene como identificador único el id &#8216;parrafo&#8217;.</p>
<p>Más adelante podemos ver la llamada a dos ficheros js externos al documento. Cómo se puede apreciar, he puesto las inclusiones al final del documento, justo antes del final del body. Esto es una de las pautas a la hora de optimizar el rendimiento de una página web. En otro tutorial trataremos de una manera más profunda este tema.</p>
<p>El contenido de los ficheros js es el siguiente</p>
<p>Fichero test.js</p>
<pre class="brush: jscript">
/*
Esto es un fichero de prueba js
Conjunto de comentarios que explican el funcionamiento de este js
El código siguiente sustuirá el texto interior del párrafo identificado con el id parrafo
*/

document.getElementById(&#039;parrafo&#039;).innerHTML=&#039;esto funciona&#039;;
</pre>
<p>Fichero test2.js</p>
<pre class="brush: jscript">
//Comentario: esto va a mostrar un mensaje de alerta
alert(&#039;hola mundo&#039;);
</pre>
<p>El código del fichero test.js lo que hace es buscar dentro del documento un elemento que tenga como identificador &#8216;parrafo&#8217; y le sustituye su contenido por un texto &#8216;esto funciona&#8217;.</p>
<p>El código del fichero test2.js lo que hace es mostrar un mensaje.</p>
<p>En ambos documentos se pueden ver muchos comentarios. Estos comentarios están bien para nosotros pero  lo que hacen es hacer más lenta la carga de la página ya que el fichero tiene un mayor fichero.</p>
<p>Vamos a comenzar a solucionar este problema.</p>
<p>Para ello, lo primero que debemos hacer es crear un fichero php al cual le podemos llamar scripts.php. Este fichero tiene la función de solicitar los ficheros js que necesitemos, reducirlos y generar un documento único.</p>
<p>Para que el contenido final del documento sea entendido por el navegador como código javascript y no otro tipo de lenguaje debemos incluir como primera línea de nuestro fichero scripts.php el siguiente código:</p>
<pre class="brush: php">

header(&quot;content-type: application/x-javascript&#039;);
</pre>
<p>Ahora debemos incluir la librería jsmin que hemos descargado y la cual se encargará de optimizar el código:</p>
<pre class="brush: php">

require_once &#039;jsmin-1.1.1php&#039;;
</pre>
<p>La parte que viene ahora es muy sencilla. Debemos ejecutar la siguiente línea por cada fichero js que queramos llamar. En nuestro caso será dos veces:</p>
<pre class="brush: php">

echo JSMin::minify(file_get_contents(&#039;test.js&#039;));

echo JSMin::minify(file_get_contents(&#039;test2.js&#039;));
</pre>
<p><em><strong>JSMin:minify</strong></em> es la orden que se encarga de reducir un determinado código. <em><strong>file_get_contents</strong></em> lo que hace es obtener el contenido de un determinado fichero. Por lo tanto esta orden lo que hace es obtiene el código de nuestros ficheros js, lo reduce y mediante la orden echo lo vuelca en pantalla, en nuestro caso, produciendo un nuevo fichero js.</p>
<p>El resultado es el siguiente:</p>
<pre class="brush: jscript">

document.getElementById(&#039;parrafo&#039;).innerHTML=&#039;esto funciona&#039;;
alert(&#039;hola mundo&#039;);
</pre>
<p>Cómo se puede observar ya no hay comentarios. Si el código tuviese sangrías o fuera más complejo, se podría observar muchas más diferencias.</p>
<p>Ahora ya sólo nos queda retocar el fichero index.php. Vamos a decirle que en vez de utilizar los dos ficheros js, utilice únicamente el fichero php que hemos generado. Con ello matamos dos pájaros de un tiro: reducimos las peticiones de 2 ficheros a 1, y generamos código reducido. Para ello sustituimos las siguientes líneas:</p>
<pre class="brush: html">

&lt;script type=&#039;text/javascript&#039; src=&#039;test.js&#039;&gt;&lt;/script&gt;

&lt;script type=&#039;text/javascript&#039; src=&#039;test2.js&#039;&gt;&lt;/script&gt;
</pre>
<p>Por esta</p>
<pre class="brush: html">

&lt;script type=&#039;text/javascript&#039; src=&#039;scripts.php&#039;&gt;&lt;/script&gt;
</pre>
<p>Listo. Ya tenemos nuestra página web con el js reducido y además hemos reducido el número de peticiones.</p>
<p>Espero que esto os pueda ser útil.</p>
<p><a href="http://www.marcosdev.com/wp-content/reducir-js-php.zip">Ficheros del tutorial Reducir Js con PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcosdev.com/reducir-ficheros-javascript-con-php/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

