<?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"
	>

<channel>
	<title>jmocana</title>
	<atom:link href="http://www.jmocana.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jmocana.eu</link>
	<description>Otro blog más de WordPress</description>
	<pubDate>Thu, 05 Nov 2009 13:41:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Consejos para maquetar una newsletter</title>
		<link>http://www.jmocana.eu/2009/05/06/como-maquetar-una-newsletter/</link>
		<comments>http://www.jmocana.eu/2009/05/06/como-maquetar-una-newsletter/#commentlist</comments>
		<pubDate>Wed, 06 May 2009 10:24:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[newsletter]]></category>

		<guid isPermaLink="false">http://www.jmocana.eu/?p=214</guid>
		<description><![CDATA[   

A la hora de maquetar una newsletter lo primero es hacerse con una buena chuleta sobre el soporte CSS de los clientes de correo. Una bastante buena y completa sería esta: Guide to CSS support in email clients (2008)
Si echáis un vistazo veréis que juntando todas las limitaciones CSS de cada cliente [...]]]></description>
			<content:encoded><![CDATA[<div class="p-mod-img">
   <img src="/wp-content/themes/jmocana/images/newsletter/newsletter.jpg" alt="periódico" />
</div>
<p>A la hora de <strong>maquetar una newsletter</strong> lo primero es hacerse con una buena chuleta sobre el soporte <abbr title="Cascading Style Sheets">CSS</abbr> de los clientes de correo. Una bastante buena y completa sería esta: <a href="http://www.campaignmonitor.com/css/" title="ver soporte CSS de los clientes de correo">Guide to CSS support in email clients (2008)</a></p>
<p>Si echáis un vistazo veréis que juntando todas las limitaciones CSS de cada cliente los recursos que nos quedan son bastante escasos. Debido a esto al maquetar tendremos que dejar a un lado la accesibilidad si queremos que la newsletter se visualice correctamente en todos los clientes</p>
<p>Debido a lo comentado anteriormente podéis suponer lo coñazo que resulta maquetar una newsletter, así que os dejo a continuación un par de consejos para conseguir visulizarla correctamente a la primera sin tener que realizar infinidad de pruebas.</p>
<ul>
   <li>Maquetar la newsletter mediante tablas utilizando estas y sus celdas a modo de contenedores</li>
   <li>Insertar todas las imágenes con URL absolutas (http://www.tuweb.com/im/tu-img.jpg)</li>
   <li>Meter los estilos en línea ya que hotmail y GMAIL crean sus propios Ids</li>
   <li>Insertar las imágenes como HTML y no como fondos por CSS ya que outlook 2007 no los reconoce</li> 
   <li>No insertar <abbr title="Document Type Definition">DTD</abbr> ni <abbr title="Search engine optimization">SEO</abbr></li>
   <li>No utilizar width ni height como propiedad css sino como <abbr title="HyperText Markup Language">HTML</abbr> (Ej. &lt;table width=&#8221;200&#8243; height=300&gt;)</li>
   <li>Para alinear las tablas y sus celdas utilizar align y valign</li>
   <li>No utilizar márgenes</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jmocana.eu/2009/05/06/como-maquetar-una-newsletter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Errores CSS : wiki-css</title>
		<link>http://www.jmocana.eu/2009/03/22/errores-css-wiki-css/</link>
		<comments>http://www.jmocana.eu/2009/03/22/errores-css-wiki-css/#commentlist</comments>
		<pubDate>Sat, 21 Mar 2009 23:13:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.jmocana.eu/?p=211</guid>
		<description><![CDATA[¿Que es wiki-css?
				wiki-css es un simple software diseñado para disponer de una rápida referencia acerca de cualquier problema relacionado con el maravilloso mundo de las css :d. Cada vez que tengamos un problemilla en cualquier navegador con alguno de nuestros estilos, en vez de darnos cabezazos contra la mesa solo habrá que abrir wiki-css y [...]]]></description>
			<content:encoded><![CDATA[<h3>¿Que es wiki-css?</h3>
				<p><strong>wiki-css</strong> es un simple software diseñado para disponer de una <strong>rápida referencia acerca de</strong> cualquier problema relacionado con el maravilloso mundo de las <strong>css</strong> :d. Cada vez que tengamos un problemilla en cualquier navegador con alguno de nuestros estilos, en vez de darnos cabezazos contra la mesa solo habrá que abrir wiki-css y hacer una busqueda lo mas específica posible.</p>                
                <p> Espero que os sirva de gran ayuda y que participeis dejando vuestros problemas y soluciones. Os agradezco de antemano la participación y esperemos que IE6 y sus errores no peten la wiki :).</p>
<p>Podeis probar wiki-css y obtener mas información pinchando <a href="http://www.jmocana.eu/wiki-css/" title="Probar wiki-css">aqui</a></p>
<a href="http://www.jmocana.eu/wiki-css/" title="Visitar wiki-css"><img src="/wp-content/themes/jmocana/images/wiki-css.jpg" alt="wiki-css" /></a>]]></content:encoded>
			<wfw:commentRss>http://www.jmocana.eu/2009/03/22/errores-css-wiki-css/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Movimiento Ondulatorio con JavaScript</title>
		<link>http://www.jmocana.eu/2009/02/17/movimiento-ondulatorio-con-javascript/</link>
		<comments>http://www.jmocana.eu/2009/02/17/movimiento-ondulatorio-con-javascript/#commentlist</comments>
		<pubDate>Mon, 16 Feb 2009 22:53:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.jmocana.eu/?p=201</guid>
		<description><![CDATA[Hace ya unas semanas mi compañero de fatigas y uno de mis grandes comentaristas del blog XD Alberto, me metió en la cabeza la fricada de representar el movimiento ondulatorio con JavaScript. En un principio pensé que estaría jodidillo el asunto pero como veréis a continuación es bastante sencillo. 
Onda vaaaaaaaaaaaaaaaa!:



Lanzar la onda!
Para conseguir pintar [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript" src="http://www.jmocana.eu/pruebas/onda/js/funciones.js"></script>
<p>Hace ya unas semanas mi compañero de fatigas y uno de mis grandes comentaristas del blog XD Alberto, me metió en la cabeza la fricada de representar el <strong>movimiento ondulatorio con JavaScript</strong>. En un principio pensé que estaría jodidillo el asunto pero como veréis a continuación es bastante sencillo. </p>
<p>Onda vaaaaaaaaaaaaaaaa!:</p>
<div id="onda">

</div>
<a class="btn btnonda" href="#" title="Ver movimiento ondulatorio">Lanzar la onda!</a>
<p>Para conseguir pintar nuestra <a href="http://es.wikipedia.org/wiki/Onda_(f%C3%ADsica)" title="mas información sobre ondas"><strong>onda</strong></a> simplemente nos servimos de la <strong>ecuación del movimiento ondulatorio</strong>:</p>
<p class="ecuacion">y(x, t) = A * cos(wt - kx)</p>
<p>donde:</p>
<dl>
    <dt>A =</dt>
    <dd>Amplitud</dd>
    <dt>w =</dt>
    <dd>frecuencia angular
                
    </dd>
    <dt>t =</dt>
    <dd>tiempo</dd>
    <dt>k =</dt>
    <dd>Número de onda</dd>
    <dt>x =</dt>
    <dd>Posición sobre el eje x</dd>
</dl>

<p>A continuación os pongo el codiguillo JavaScript que utilizo para pintar la onda por si os sirve de ayuda</p>
<div class="codigo"><p class="lenguaje js"><strong>Código <abbr title="JavaScript">JS</abbr></strong></p><pre><code>var movimiento = "";
var n_posicion = 0;
var j = 0;
var longitud = 36;

/* CONFIGURACION DE LA ONDA */
var caracter = "*"; //caracter con el que se representa la onda
var xo = 0 // valor inicial de la posición de la onda sobre el eje x
var yo = 80; // valor inicial de la posición de la onda sobre el eje y
var v = 400; // velocidad de la onda
var A = 60; // Amplitud
var T = 18; // Periodo
var longitud_onda = 10; // Longitud de onda
/* FIN CONFIGURACION DE LA ONDA */


var w = ( 2 * 3.14 ) / T;
var k = ( 2 * 3.14 ) / longitud_onda;
$("li#pos0").css({ left: yo + "px" });

function movimiento_armonico(){
	$(document).ready(function(){
		movimiento = movimiento + "&lt;li id='pos"+ n_posicion + "'&gt;" + caracter + "&lt;/li&gt;";
		$("#onda").html(movimiento);		
		
		for (i=0; i &lt; n_posicion; i++)
		{
			x = xo + i
			t = i;
			y = yo + (A * Math.cos((k * x) - (w * t)))			
	
			$("li#pos" + i).css({ top: y + "px" });
			$("li#pos" + i).css({ left: x + "px" });
		}
		n_posicion++;
		j++;
		if(j == longitud + 1)
			clearInterval(onda);
		});
		$("#onda li:last").hide();	
}

onda = setInterval("movimiento_armonico()", v);
	</code></pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.jmocana.eu/2009/02/17/movimiento-ondulatorio-con-javascript/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Validaciones con jQuery</title>
		<link>http://www.jmocana.eu/2009/02/09/validaciones-con-jquery/</link>
		<comments>http://www.jmocana.eu/2009/02/09/validaciones-con-jquery/#commentlist</comments>
		<pubDate>Mon, 09 Feb 2009 00:39:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.jmocana.eu/?p=160</guid>
		<description><![CDATA[Después de 120 días sin escribir :X, por fin me he dignado a escribir un post que espero que le pueda servir a alguien de ayuda, por lo menos a un eulalio que yo me se XD. Voy a escribir un post sobre como hacer validaciones en tiempo real, es decir, no esperaremos a que [...]]]></description>
			<content:encoded><![CDATA[<p>Después de 120 días sin escribir :X, por fin me he dignado a escribir un <span lang="en">post</span> que espero que le pueda servir a alguien de ayuda, por lo menos a un eulalio que yo me se XD. Voy a escribir un post sobre como hacer <strong>validaciones en tiempo real</strong>, es decir, no esperaremos a que el usuario envíe el formulario sino que iremos validando cada uno de los campos según se vaya introduciendo la información. Para ver esto hare una demo apoyándome en la librería jQuery, que no solo nos da la posibilidad de realizar fáciles validaciones al momento sino que además nos permite jugar con una gran variedad de atractivos efectos.</p>
<h3>Ejemplo de validaciones con jQuery</h3>
<p>Como ya he dicho en la introducción queremos conseguir una validación de formulario en tiempo real, es decir cada vez que un campo del formulario pierda el foco, automáticamente comprobaremos que el campo modificado es correcto, además comprobaremos que todos los campos que preceden a este no se encuentran vacios y que la información es correcta. Con esto mejoraremos la experiencia de usuario ya que avisamos en el mismo momento de cada uno de los errores que está cometiendo al introducir los datos en los campos del formulario y estaremos evitando el tener que realizar varios envíos del form ya que se produjeron fallos en la validación de campos obligatorios.</p>

<p>Dentro de un formulario podemos fijar una serie de campos que sean de tipo obligatorio y sin los cuales el envío del formulario no es posible, pues bien en el ejemplo además de definir campos de tipo obligatorios y mostrar los errores producidos por los mismos, mantendremos informado al usuario con avisos de que la información introducida en un campo no obligatorio no es del todo correcta. En el ejemplo el usuario podrá enviar el formulario en caso de tener avisos pero no en el caso de que el formulario cuente con errores en campos de tipo obligatorio. En todo momento tendremos visible un listado de errores que mostrará al usuario el estado en el que se encuentra cada uno de los campos del formulario.</p>

<p>Este es un ejemplo de referencia y no aplicable a cualquier tipo de formulario ya que según vaya variando el código <abbr title="HyperText Markup Language">HTML</abbr> del formulario habrá que realizar adaptaciones en el código JavaScript, de todas formas podréis ver que gracias a la sencillez de jQuery la adaptación de código según el formulario no es tan complicada.
A continuación os muestro como quedaría el formulario con las validaciones:</p>
<script type="text/javascript" src="/wp-content/themes/jmocana/js/colors.js"></script>
<script src="/wp-content/themes/jmocana/js/validaciones/funciones.js?update=200902112355" type="text/javascript"></script>
<div id="cont_mail">
<div id="prueba_mail" class="estirar">
<div id="form_mail"><form enctype="multipart/form-data" method="post" action="?x=1">
                                       <fieldset>
                                          <legend id="titulo_formulario">Formulario de contacto</legend>
                                          <p class="obligatorios">* Campos obligatorios</p>
                                          <fieldset>
                                             <legend>Datos personales</legend>
                                             <label for="nombre" accesskey="1">* Nombre
                                    <input type="text" name="nombre" id="nombre" class="obligatorio" tabindex="1"/></label>
                                             <label for="apellidos" accesskey="2" >* Apellidos
                                    
                                    <input type="text" name="apellidos" id="apellidos" class="obligatorio" tabindex="2"/></label>
                                             <label for="provincia" accesskey="3">Provincia
                                    <input type="text" name="provincia" id="provincia" tabindex="3" /></label>
                                             <label for="telefono" accesskey="4">Teléfono
                                    <input type="text" name="telefono" id="telefono" tabindex="4" /></label>
                                             <label for="mail" accesskey="5">* Email
                                    <input type="text" name="mail" id="mail" class="obligatorio" tabindex="5" /></label>
                                             <fieldset id="datos_sexo">
                                                 <p>* Sexo</p>                                
                                                 <label class="radio" for="mujer" accesskey="6">Mujer
                                    <input type="radio" name="sexo" id="mujer" class="obligatorio" tabindex="6" value="mujer"/></label>
                                                 <label class="radio" for="hombre" accesskey="7">Hombre
                                    <input type="radio" name="sexo" id="hombre" class="obligatorio" tabindex="7" value="hombre"/></label>
                                             </fieldset>
                                          </fieldset>
                                          <fieldset id="otros_datos">
                                              <legend>Otros datos</legend>
                                    
                                                                           
                                              <label for="comentario" id="lb_comentario" accesskey="8">* Comentario<textarea id="comentario" class="obligatorio" rows="10" cols="4" name="comentario" tabindex="8"></textarea></label>
                                               <label for="importancia" id="lb_importancia" accesskey="9">Importancia
                                    <select name="importancia" id="importancia" tabindex="9">
                                                    <option value="alta">alta</option>
                                                    <option value="media">media</option>
                                                    <option value="baja">baja</option>
                                                </select>
                                              </label>
                                              <label for="adjunto" id="lb_adjunto" accesskey="A">Adjuntar archivo
                                    <input type="file" id="adjunto" name="adjunto" tabindex="10"/></label>
                                              <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> 
                                              <label for="boletin" id="lb_boletin" accesskey="B">Deseo recibir boletín informativo
                                    <input type="checkbox" id="boletin" name="boletin" tabindex="11" value="si" /></label>
                                          </fieldset>
                                          <input type="submit" name="enviar" id="envio" value="Enviar" />
                                       </fieldset>
                                    
                                    
                                    </form></div>
<div id="listado_errores">
   <h4>:: Listado de errores ::</h4>
   <ol>
          <li style="display: none">&nbsp;</li>
   </ol>
</div>
</div>
</div>
<a class="zip" href="http://www.jmocana.eu/wp-content/themes/jmocana/descargas/validaciones/demo_validaciones.zip" title="Descargar ejemplo">Descargar ejemplo: demo_validaciones.js (39,52kb) </a>
<span id="more-160"></span>
<h4>Ejemplo Validaciones con jQuery: El Formulario HTML</h4>
<div class="codigo_big"><p class="lenguaje html"><strong>Código HTML</strong></p><pre><code>&lt;form enctype="multipart/form-data" method="post" action="&lt;?=$PHP_SELF?&gt;?x=1"&gt;
   &lt;fieldset&gt;
      &lt;legend id="titulo_formulario"&gt;Formulario de contacto&lt;/legend&gt;
      &lt;p class="obligatorios"&gt;* Campos obligatorios&lt;/p&gt;
      &lt;fieldset&gt;
         &lt;legend&gt;Datos personales&lt;/legend&gt;
         &lt;label for="nombre" accesskey="1"&gt;* Nombre
&lt;input type="text" name="nombre" id="nombre" class="obligatorio" tabindex="1"/&gt;&lt;/label&gt;
         &lt;label for="apellidos" accesskey="2" &gt;* Apellidos

&lt;input type="text" name="apellidos" id="apellidos" class="obligatorio" tabindex="2"/&gt;&lt;/label&gt;
         &lt;label for="provincia" accesskey="3"&gt;Provincia
&lt;input type="text" name="provincia" id="provincia" tabindex="3" /&gt;&lt;/label&gt;
         &lt;label for="telefono" accesskey="4"&gt;Teléfono
&lt;input type="text" name="telefono" id="telefono" tabindex="4" /&gt;&lt;/label&gt;
         &lt;label for="email" accesskey="5"&gt;* Email
&lt;input type="text" name="email" id="email" class="obligatorio" tabindex="5" /&gt;&lt;/label&gt;
         &lt;fieldset id="datos_sexo"&gt;
             &lt;p&gt;Sexo&lt;/p&gt;                                
             &lt;label class="radio" for="mujer" accesskey="6"&gt;Mujer
&lt;input type="radio" name="sexo" id="mujer" class="obligatorio" tabindex="6" value="mujer"/&gt;&lt;/label&gt;
             &lt;label class="radio" for="hombre" accesskey="7"&gt;Hombre
&lt;input type="radio" name="sexo" id="hombre" class="obligatorio" tabindex="7" value="hombre"/&gt;&lt;/label&gt;
         &lt;/fieldset&gt;
      &lt;/fieldset&gt;
      &lt;fieldset id="otros_datos"&gt;
          &lt;legend&gt;Otros datos&lt;/legend&gt;                                       
          &lt;label for="comentario" id="lb_comentario" accesskey="8"&gt;* Comentario&lt;textarea id="comentario" class="obligatorio" rows="10" cols="4" name="comentario" tabindex="8"&gt;&lt;/textarea&gt;&lt;/label&gt;
           &lt;label for="importancia" id="lb_importancia" accesskey="9"&gt;Importancia
&lt;select name="importancia" id="importancia" tabindex="9"&gt;
                &lt;option value="alta"&gt;alta&lt;/option&gt;
                &lt;option value="media"&gt;media&lt;/option&gt;
                &lt;option value="baja"&gt;baja&lt;/option&gt;
            &lt;/select&gt;
          &lt;/label&gt;
          &lt;label for="adjunto" id="lb_adjunto" accesskey="A"&gt;Adjuntar archivo
&lt;input type="file" id="adjunto" name="adjunto" tabindex="10"/&gt;&lt;/label&gt;
          &lt;input type="hidden" name="MAX_FILE_SIZE" value="100000"&gt; 
          &lt;label for="boletin" id="lb_boletin" accesskey="B"&gt;Deseo recibir boletín informativo
&lt;input type="checkbox" id="boletin" name="boletin" tabindex="11" value="si" /&gt;&lt;/label&gt;
      &lt;/fieldset&gt;
      &lt;input type="submit" name="enviar" id="envio" value="Enviar" /&gt;
   &lt;/fieldset&gt;
&lt;/form&gt;
</code></pre></div>
<p>A la hora de hacer el formulario HTML hay tres puntos a resaltar:</p>
<ol>
   <li>El form deberá llevar un <strong>enctype=&#8221;multipart/form-data&#8221;</strong> ya que en nuestro ejemplo queremos dar la posibilidad al usuario de enviar archivos adjuntos</li>
   <li>Todos los campos (input, select, textarea) deberán estar englobados por su respectivo label:<br />Ejemplo <pre><code> &lt;label for="nombre" accesskey="1"&gt;* Nombre
&lt;input type="text" name="nombre" id="nombre" class="obligatorio" tabindex="1"/&gt;&lt;/label&gt;</code></pre></li>
   <li>Cada campo llevará un tabindex, cuyo valor indicará el orden en que debe ser rellenado dicho campo.</li>
</ol>
<h4>Ejemplo Validaciones con jQuery: Validación <abbr title="JavaScript">JS</abbr></h4>
<h5>Eventos</h5>
Como dije al principio, el objetivo es conseguir realizar unas validaciones en tiempo real, para ello necesitamos que cada vez que el usuario rellene algún campo se haga una llamada a la función JavaScript encargada de comprobar que los datos introducidos son correctos. Para conseguir esto utilizamos el <a href="http://docs.jquery.com/Events/blur" title="Ver documentación del evento blur"><strong>evento blur de jQuery</strong></a>.

<div class="codigo"><p class="lenguaje js"><strong>Código JS</strong></p><pre><code>array_campos = $("#form_mail label");
	array_sexo = $("#datos_sexo label");
	var aviso_sexo = true;
	var errores_validacion = false;
	
	$("#form_mail input, #form_mail select, #form_mail textarea")
		.blur(function (event) {
        	 comprobar_campo($(this), array_campos, array_sexo, false);
			 event.preventDefault();
    });
	
	$("#envio")	
		.click(function (event) {
         	var errores_validacion = comprobar_campo($(this), array_campos, array_sexo, true);
			if(errores_validacion)
				event.preventDefault();
	});</code></pre></div>

<p>Tenemos dos eventos, por un lado el <strong>blur</strong> que como ya hemos dicho llamará a la función comprobar_campo() cada vez que se produzca un cambio en alguno de los campos del formulario y por otro lado el <strong><a href="http://docs.jquery.com/Events/click" title="Ver documentación del evento click">evento click de jQuery</a></strong> que llamará a la función comprobar_campo() al pinchar sobre el boton &#8220;enviar&#8221;</p>
<p>La función comprobar_campo() será la encargada de comprobar que los datos introducidos por el usuario son correctos y recibira 4 parametros: </p>
<ul>
   <li><strong>$(this)</strong>: El elemento que recibe el evento</li>
   <li><strong>array_campos</strong>: Array que contiene todo el conjunto de labels con sus correspondientes campos.</li>
    <li><strong>array_sexo</strong>: Contiene el label y los radiobuttons del apartado sexo. Para este caso hay que hacer una comprobación especial por lo que lo almacenaremos en una variable a parte. Hablaré mas adelante de este caso.</li>
    <li>Valor booleno (<strong>true, false</strong>) que tomara el valor true para el caso del evento click y false para el evento blur. </li>
</ul>
<p>Mediante <a href="http://docs.jquery.com/Events/jQuery.Event#event.preventDefault.28.29" title="Ver documentacion completa"><strong>event.preventDefault();</strong></a> evitamos que el formulario sea enviado para el caso del evento .blur y para el evento click en caso de que se produzcan errores. </p>
<pre><code>if(errores_validacion)
event.preventDefault();</code></pre>

<h5>Comprobar valores introducidos: <strong>function comprobar_campo()</strong></h5>
<div class="codigo_big"><p class="lenguaje js"><strong>Código <abbr title="JavaScript">JS</abbr></strong></p><pre><code>function comprobar_campo(campo, array_campos, array_sexo, enviar){
		
		if(enviar)
			var orden = $(array_campos).length - 1;
		else	
			var orden = campo.attr("tabindex");
		var j = 0;
		
		
		for(i=0; i &lt; orden; i++)
		{
			var valor = $(array_campos[i]).children().attr("value");
			var nombre_campo = $(array_campos[i]).children().attr("name");
			var tipo = $(array_campos[i]).children().attr("class");
			
			if(valor == undefined)
			{				
				if(tipo == "obligatorio" || tipo == "obligatorio marcado")
					form_error($(array_campos[i]).children(), "vacio")
				else
					form_aviso($(array_campos[i]).children(), "vacio")									
			}
			else{
				if(nombre_campo == "apellidos")
					comprobar_apellidos($(array_campos[i]).children())
					
				else if(nombre_campo == "telefono")
					comprobar_telefono($(array_campos[i]).children())
			
				else if(nombre_campo == "email")
					comprobar_email($(array_campos[i]).children())
				
				else{
					var estado_campo = $(array_campos[i]).children().attr("class")
					if(estado_campo == "obligatorio marcado" || estado_campo == "marcado" )
					{
						$(array_campos[i]).children().removeClass("marcado")	
						form_correcto($(array_campos[i]).children(), tipo)
					}
				}
			}
						
			if(nombre_campo == "sexo")
			{					
				var marcado_sexo = $(array_sexo[j]).children().attr("checked");
				if(marcado_sexo)
					aviso_sexo = false;
				j++;				
			}			
		}
		if(aviso_sexo &#038;&#038; j==2)
		{
			form_error($(array_campos[5]).children(), "sexo")
		}
		if($("#listado_errores ol li.error").length == 0)
			return false
		else
			return true
		
	}</code></pre></div>

<p>La función <strong>comprobar_campo</strong> será la encargada de decir si los datos introducidos por el usuario son correctos o no y en caso de que no lo sean que tipo de error mostrar.</p>
<p>Lo primero que hace la función es comprobar que campos son los que tiene que validar. Si por un lado el usuario a pulsado el botón enviar esta tendrá que comprobar todos los campos del formulario.</p>
 <pre>if(enviar)
       var orden = $(array_campos).length - 1;</pre>
<p> por el contrario si el usuario simplemente acaba de rellenar un campo tomaremos el tabindex del campo modificado y realizaremos las comprobaciones sobre este y los campos anteriores al mismo para evitar que el usuario se deje campos vacios por el camino.</p>
<pre>else	
	var orden = campo.attr("tabindex");</pre>
<p>mediante un bucle recorremos los campos que nos interesan y capturamos tres atributos que nos serán de gran ayuda:</p>
<ul>
   <li><strong>El valor del campo:</strong><pre><code>var valor = $(array_campos[i]).children().attr("value");</code></pre></li>
   <li><strong>El nombre del campo:</strong><pre><code>var nombre_campo = $(array_campos[i]).children().attr("name");</code></pre></li>
    <li><strong>La clase del campo:</strong><pre><code>var tipo = $(array_campos[i]).children().attr("class");</code></pre></li>
</ul>
<p>El primer valor contendrá el dato introducido por el usuario y por la tanto será el valor a validar, el segundo nos servirá para crear el listado de errores y el tercero lo utilizaremos para marcar los campos con un tipo de error determinado y asignarle los estilos de este tipo de error.</p>
<p>La primera y más sencilla comprobación es testear que el campo a validar no se encuentre vacio</p>
<pre><code>if(valor == undefined)
{				
	if(tipo == "obligatorio" || tipo == "obligatorio marcado")
		form_error($(array_campos[i]).children(), "vacio")
	else
		form_aviso($(array_campos[i]).children(), "vacio")									
}</code></pre>

<p>Si el campo se encuentra vacío comprobamos si este es de tipo obligatorio y si lo es llamamos a la función encargada de gestionar los errores (<strong>form_error()</strong>), en caso contrario simplemente avisaremos al usuario mediante la función (<strong>form_aviso()</strong>).<br />Los parámetros que pasaremos a estas funciones serán el campo que ha producido el error o aviso y el tipo de error que se ha producido, en este caso el aviso de campo vacío (&#8221;vacio&#8221;).</p>
<p>En caso de que el campo no este vacío pasaremos a comprobar que el valor introducido es válido para ese caso concreto.</p>
<pre><code>else{
	if(nombre_campo == "apellidos")
		comprobar_apellidos($(array_campos[i]).children())
					
	else if(nombre_campo == "telefono")
		comprobar_telefono($(array_campos[i]).children())
			
	else if(nombre_campo == "email")
		comprobar_email($(array_campos[i]).children())</code></pre>
<p>Según el nombre del campo que sea llamamos a su función asignada para validar su valor.</p>
<p>Por último si el valor introducido es correcto llamaremos a la función encargada de marcar el campo como valido.</p>
<pre><code>else{
	var estado_campo = $(array_campos[i]).children().attr("class")
	if(estado_campo == "obligatorio marcado" || estado_campo == "marcado" )
	{
		$(array_campos[i]).children().removeClass("marcado")	
		form_correcto($(array_campos[i]).children(), tipo)
	}
}</code></pre>

<p>Como comente antes para el caso del tipo de sexo tenemos que hacer una validación específica ya que dentro del label no tenemos un único campo sino que tenemos dos. Este procedimiento de validación habría que hacerlo en caso de que tuviéramos otro caso de campos múltiples como puede ser por ejemplo un conjunto de checkbox que utilizamos para solicitar las preferencias de un usuario.</p>
<pre><code>if(nombre_campo == "sexo")
{					
	var marcado_sexo = $(array_sexo[j]).children().attr("checked");
	if(marcado_sexo)
		aviso_sexo = false;
       		j++;				
}			
}
if(aviso_sexo &#038;&#038; j==2)
{
	form_error($(array_campos[5]).children(), "sexo")
}
if($("#listado_errores ol li.error").length == 0)
	return false
else
	return true</code></pre>

<p>Lo primero que hago es comprobar si alguno de los radio se encuentran marcados y si es así pongo la variable de control(aviso_sexo) a false. En caso de que hayamos comprobado todos los radio (en nuestro caso j=2) y aviso_sexo siga con su valor inicial(true) llamaremos a la función de error.</p>

<h5>Funciones de validación especifica</h5>
<h6>Validación de apellidos</h6>
<pre><code>function comprobar_apellidos(apellidos){
		$("#e_apellidos").remove();
		
		v_apellidos = $(apellidos).attr("value");
		var er_apellidos = / /
		 if(!er_apellidos.test(v_apellidos))
		 	form_aviso(apellidos, "apellidos")	
		 else
		 {
			var estado_campo = $(apellidos).attr("class") 
			if(estado_campo == "obligatorio marcado" || estado_campo == "marcado" )
			{
				$(apellidos).removeClass("marcado")
		 		form_correcto(apellidos, "apellidos")
			}
		 }
	}</code></pre>
<p>Mediante esta función comprobaremos que por lo menos se han introducido dos apellidos y en caso de no ser así simplemente lanzaremos un aviso</p>
<p>La primera línea de la función se encarga simplemente de eliminar el error del listado de errores. A continuación nos apoyamos en una expresión regular para comprobar que el valor introducido contenga por lo menos un espacio.</p> 

<div class="codigo"><p class="lenguaje js"><strong>Código Js</strong></p><pre><code>var er_apellidos = / /</code></pre></div>

<p>En caso de no ser así llamamos a form_aviso, por el contrarió en caso de existir y estar marcado con la clase &#8220;marcado&#8221; la función llamada sería form_correcto() y el marcado sería eliminado.</p>

<h6>Validacion de telefono</h6>
<pre><code>function comprobar_telefono(telefono){
		$("#a_telefono").remove();
		
		v_telefono = $(telefono).attr("value");
		var er_tlfono = /^([0-9\s\+\-])+$/
		 var num_telefono = v_telefono.length
		 if(!er_tlfono.test(v_telefono))
		 	form_aviso(telefono, "no-num")
		 else if(num_telefono &lt; 9)
		 	form_aviso(telefono, "corto")
		 else
		 {
		 	var estado_campo = $(telefono).attr("class") 
			if(estado_campo == "obligatorio marcado" || estado_campo == "marcado" )
			{
				$(telefono).removeClass("marcado")
		 		form_correcto(telefono)
			}
		 }
	}</code></pre>
En este caso comprobaremos que solo se introduzcan números y determinados símbolos como +,- y un mínimo de 9 dígitos. Para el caso de los nueve dígitos simplemente comprobamos que v_telefono.length &lt; 9 y si es así lanzamos un aviso de tipo &#8220;corto&#8221;. Para el caso de los símbolos el funcionamiento vuelve a ser el mismo que hemos visto para los apellidos, utilizamos una expresión regular y según sea el resultado lanzamos el aviso de tipo &#8220;no-num&#8221; o no. La expresión regular utilizada:

<div class="codigo"><p class="lenguaje js"><strong>Código Js</strong></p><pre><code>var er_tlfono = /^([0-9\s\+\-])+$/</code></pre></div>

<p>Con esta expresión estamos diciendo que queremos que el valor empiece por un número del 0 al 9, espacio en blanco, símbolo + o menos y se repita una o mas veces hasta el final.</p>
		
<h6>Validación de email</h6>
<pre><code>function comprobar_email(email){
		 $("#e_email").remove();
		 
		 v_email = $(email).attr("value");
		 var er_email = /^(.+\@.+\..+)$/		
		 if(!er_email.test(v_email))
		 	form_error(email, "email")
		else
		{
			var estado_campo = $(email).attr("class") 
			if(estado_campo == "obligatorio marcado" || estado_campo == "marcado" )
			{
				$(email).removeClass("marcado")
		 		form_correcto(email)
			}
		}
	}</code></pre>
<p>Volvemos a utilizar una nueva expresión regular:</p>
<div class="codigo"><p class="lenguaje js"><strong>Código Js</strong></p><pre><code>var er_email = /^(.+\@.+\..+)$/</code></pre></div>

<p>Empezamos con un caracter como mínimo seguido de una @, seguida de uno o mas caracteres, un punto y uno o mas caracteres hasta el final.</p>
<p>Todas estas funciones vistas se podrían modificar para hacerlas más estrictas pero para este caso ya sería liarse demasiado :).</p>

<h5>Salida de error y aviso</h5>
<p>Voy a comentar solo la función de error ya que la de aviso tiene prácticamente el mismo funcionamiento</p>
<pre><code>function form_error(campo, error)
	{	
	    $(campo).animate({ 
  			backgroundColor: "#FFE8E8",
			color: "#000"
        }, 1500 );
		
		$(campo).addClass("marcado")
		var id_error = "#e_" + $(campo).attr("name")
		
		switch(error)
		{
		case "vacio": 
			
			if($(id_error).attr("class") == undefined)
			{
				$("#listado_errores ol").append("&lt;li id='e_" + $(campo).attr("name") + "' class='error'&gt;&lt;span&gt;El campo obligatorio &lt;strong&gt;" + $(campo).attr("name") + "&lt;/strong&gt; se encuentra vacio&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;")
			}
		break;
			
		case "email": 
			if($(id_error).attr("class") == undefined)
			{
				$("#listado_errores ol").append("&lt;li id='e_" + $(campo).attr("name") + "' class='error'&gt;&lt;span&gt;El &lt;strong&gt;e-mail&lt;/strong&gt; introducido es incorrecto&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;")
			}
		break;
		
		case "sexo": 
			
			if($(id_error).attr("class") == undefined)
			{	
				$("#listado_errores ol").append("&lt;li id='e_" + $(campo).attr("name") + "' class='error'&gt;&lt;span&gt;Debe seleccionar su &lt;strong&gt;sexo&lt;/strong&gt;: Mujer, Hombre&lt;/a&gt;&lt;/li&gt;")
			}
		break;
		}		
	}</code></pre> 

<p>Lo primero que hacemos es utilizar el <a href="http://docs.jquery.com/Effects/animate#paramsdurationeasingcallback" title="Ver documentación completa del método animate"><strong>método animate de jQuery</strong></a> para conseguir cambiar el color de fondo y de fuente progresivamente durante un tiempo de 1,5 segundos.</p>
<pre><code> $(campo).animate({ 
  			backgroundColor: "#FFE8E8",
			color: "#000"
        }, 1500 );</code></pre>
<p><strong><a href="http://dev.jquery.com/browser/trunk/plugins/color/jquery.color.js?rev=5768" title="Ver mas sobre este plugin">jquery.color.js</a></strong>: El método animate de jQuery no es capaz por si solo de producir una animación sobre el color de fondo de un elemento. Para poder hacer esto necesitamos apoyarnos en el plugin de jQuery: jquery.color.js. Podéis encontrarlo en la carpeta &#8220;js&#8221; del ejemplo bajo el nombre de colors.js.</p>
<p>Siguiendo con la explicación de la función de error, asignaremos la clase &#8220;marcado&#8221; al campo para saber que ese campo está produciendo un error o aviso y creamos el identificador de error (id_error) utilizando el <span lang="en">name</span> del campo. Este id lo utilizaremos para asignarlo al li del listado de errores.</p>
<pre><code>$(campo).addClass("marcado")
		var id_error = "#e_" + $(campo).attr("name")</code></pre>

<p>Para finalizar nos fijamos en el segundo parámetro que recibe la función (error) que nos dará el tipo de error que se esta produciendo y según su valor mostraremos un tipo de error determinado en el listado de errores, que estará formado por un li con un id: e_[nombre_del_campo] un class &#8220;error&#8221; y el mensaje. Para el caso de la función aviso el id será del tipo: a_[nombre_del_campo] y utilizara un class &#8220;aviso&#8221;.</p>

<h5>Salida correcta</h5>
<p>Está función se encargará de marcar los campos que contenían fallos como válidos y producirá una determinada animación gracias al método animate.</p>
 <pre><code>$(campo).addClass("marcado")
		function form_correcto(campo, tipo)
	{		
		$(campo).animate({ 
  			backgroundColor: "#CDEFB4",
			color: "#000"
        }, 800 );
		
		$(campo).animate({ 
  			backgroundColor: "#FFF",
			color: "#999"
        }, 800 );
		
		$(campo).removeClass("marcado")	
		
		c_correcto = $(campo).attr("name");
				
		if(tipo == "obligatorio" || tipo == "obligatorio marcado")
		{
			e_correcto = "#e_" + c_correcto;
			$(e_correcto).remove();			
		}
		else
		{
			a_correcto = "#a_" + c_correcto;
			$(a_correcto).remove();			
		}
	}	</code></pre>

<p>En esta función volvemos a utilizar el mismo método animate que utilizamos para la función de error y aviso pero con otros valores para los estilos. Eliminamos la clase marcado para avisar de que el campo es válido y por último creamos la variable c_correcto con el nombre del campo para eliminar el mensaje de error o aviso según sea el tipo del campo.</p>

<h4>Ejemplo Validaciones con jQuery: Envío del formulario con PHP</h4>

<div class="codigo_big"><p class="lenguaje php"><strong>Código <abbr title="Hypertext Pre-processor">PHP</abbr></strong></p><pre><code>&lt;?php
  if($_GET["x"] == 1)
  {	

	  // primero hay que incluir la clase phpmailer para poder instanciar
	  //un objeto de la misma
	  require "includes/class.phpmailer.php";
	
	  //instanciamos un objeto de la clase phpmailer al que llamamos 
	  //por ejemplo mail
	  $mail = new phpmailer();
	
	  //Definimos las propiedades y llamamos a los mtodos 
	  //correspondientes del objeto mail
	
	  //Con PluginDir le indicamos a la clase phpmailer donde se 
	  //encuentra la clase smtp que como he comentado al principio de 
	  //este ejemplo va a estar en el subdirectorio includes
	  $mail-&gt;PluginDir = "includes/";
	
	  //Con la propiedad Mailer le indicamos que vamos a usar un 
	  //servidor smtp
	  $mail-&gt;Mailer = "smtp";
	
	  //Asignamos a Host el nombre de nuestro servidor smtp
	  $mail-&gt;Host = "nombre_host";
	
	  //Le indicamos que el servidor smtp requiere autenticacin
	  $mail-&gt;SMTPAuth = false;
	  
	   //Le decimos cual es nuestro nombre de usuario y password
	   //$mail-&gt;Username = "usuario";
	   //$mail-&gt;Password = "contraseña";
	  
	  //Indicamos cual es nuestra direccin de correo y el nombre que 
	  //queremos que vea el usuario que lee nuestro correo
	  $mail-&gt;From = "prueba@jmocana.eu";
	  $mail-&gt;FromName = "nombre";
	
	  //el valor por defecto 10 de Timeout es un poco escaso dado que voy a usar 
	  //una cuenta gratuita, por tanto lo pongo a 30  
	  $mail-&gt;Timeout=30;
	
	  $nombre_archivo = $HTTP_POST_FILES['adjunto']['name']; 
	  $tamano_archivo = $HTTP_POST_FILES['adjunto']['size']; 
	  echo $tamano_archivo;
	   if($tamano_archivo &lt; 1000)
	   { 		  
		   if (move_uploaded_file($HTTP_POST_FILES['adjunto']['tmp_name'], "adjuntos/".$nombre_archivo) == false){
				echo "Ocurrió algún error al subir el fichero al servidor. El fichero adjunto no pudo ser enviado";
		   } 
		   else
		   {
			  $mail-&gt;AddAttachment("adjuntos/".$nombre_archivo,$nombre_archivo);		
			  $subido = true;	
			}    
	   }
	   else
	   		echo "El tamaño del archivo es demasiado elevado. Maximo tamaño de ficheros permitido: 100Kb";
	   
	   //Indicamos cual es la direccin de destino del correo
	  $mail-&gt;AddAddress("prueba@hotmail.com");
	
	  //Asignamos asunto y cuerpo del mensaje
	  //El cuerpo del mensaje lo ponemos en formato html, haciendo 
	  //que se vea en negrita
	  $mail-&gt;Subject = "Prueba de phpmailer";
	  
	  $mail-&gt;Body = "&lt;h1&gt;Nuevo contacto&lt;/h1&gt;";	
	  
	  foreach($_POST as $nombre_campo =&gt; $valor){
	  		if($nombre_campo != "enviar" &#038;&#038; $nombre_campo != "MAX_FILE_SIZE")
				$mail-&gt;Body = $mail-&gt;Body."&lt;p&gt;&lt;strong&gt;".$nombre_campo.": &lt;/strong&gt;".$valor."&lt;/p&gt;"; 			
		} 	  
	
	  //Definimos AltBody por si el destinatario del correo no admite email con formato html 
	  $mail-&gt;AltBody = "Mensaje de prueba mandado con phpmailer en formato solo texto";
	
	  //se envia el mensaje, si no ha habido problemas 
	  //la variable $exito tendra el valor true
	  $exito = $mail-&gt;Send();
	
	  //Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas como mucho 
	  //para intentar enviar el mensaje, cada intento se hara 5 segundos despues 
	  //del anterior, para ello se usa la funcion sleep	
	  $intentos=1; 
	  while ((!$exito) &#038;&#038; ($intentos &lt; 5)) {
		sleep(5);
			//echo $mail-&gt;ErrorInfo;
			$exito = $mail-&gt;Send();
			$intentos=$intentos+1;	
		
	   }
	 
			
	   if(!$exito)
	   {
		echo "Problemas enviando correo electrnico a ".$valor;
		echo "&lt;br&gt;".$mail-&gt;ErrorInfo;			
	   }
	   else
	   {
		echo "Mensaje enviado correctamente";
	   }       
	   if($subido)
	   	unlink("adjuntos/".$nombre_archivo);
  } 
?&gt;</code></pre></div>

<p>Respecto al código PHP que utilizamos para enviar nuestro formulario HTML lo mas importante a recalcar es que utilizamos la <a href="http://phpmailer.codeworxtech.com/" title="Ver mas sobre la clase PHPMailer"><strong>clase PHPMailer</strong></a> que nos permite enviar archivos adjuntos en nuestros correos. Para saber más acerca de esta clase os recomiendo que le echeis un vistazo un tutorial en español bastante bueno: <a href="http://www.programacion.com/php/articulo/phpmailer/" title="Ir al tutorial de PHPMailer">Tutorial PHPMailer en programacion.com</a></p>
<p>En el código que estoy utilizando tengo configurado a false el SMTPAuth con lo que estoy diciendo que el servidor smtp no requiere autentificación. En el caso de que vuestro servidor smtp requiera autentificación tendréis que poner a true la variable SMTPAuth y descomentar y configurar el username y password tal que asi:</p>
<pre><code>//Le indicamos que el servidor smtp requiere autenticacin
	  $mail->SMTPAuth = true;
	  
	   //Le decimos cual es nuestro nombre de usuario y password
	   $mail->Username = "usuario";
	   $mail->Password = "contraseña";</code></pre>

<h5>Enviar archivo adjunto con PHPMailer</h5>
<p>Para el envio de un archivo adjunto utilizaremos el siguiente código</p>

<pre><code>$nombre_archivo = $HTTP_POST_FILES['adjunto']['name']; 
	  $tamano_archivo = $HTTP_POST_FILES['adjunto']['size']; 
	
	   if($tamano_archivo &lt; 1000)
	   { 		  
		   if (move_uploaded_file($HTTP_POST_FILES['adjunto']['tmp_name'], "adjuntos/".$nombre_archivo) == false){
				echo "Ocurrió algún error al subir el fichero al servidor. El fichero adjunto no pudo ser enviado";
		   } 
		   else
		   {
			  $mail-&gt;AddAttachment("adjuntos/".$nombre_archivo,$nombre_archivo);		
			  $subido = true;	
			}    
	   }
	   else
	   		echo "El tamaño del archivo es demasiado elevado. Maximo tamaño de ficheros permitido: 100Kb";</code></pre>

<p>Para poder enviar un archivo adjunto por correo lo primero que tenemos que hacer es subirlo a una ubicación determinada en nuestro servidor, asi que empezaremos cojiendo el nombre y tamaño del archivo que el usuario a seleccionado en el campo de tipo fichero y si el tamaño del mismo es inferior a 1kb subimos el archivo a nuestra carpeta adjuntos.</p>
<pre><code>move_uploaded_file($HTTP_POST_FILES['adjunto']['tmp_name'], "adjuntos/".$nombre_archivo)</code></pre>

<p>Una vez que hayamos subido con exito el archivo al servidor utilizaremos el <strong>método AddAttachment</strong> para adjuntar el archivo en el correo.</p>

<p>Con esto tendriamos listo nuestro formulario con sus validaciones jQuey. Tengo que decir que para que este código estuviera completo habría que realizar unas validaciones de lado servidor ya que las validaciones por javascript no resultan seguras. Si queréis echar un vistazo a algún tutorial donde se hable de validaciones del lado servidor os recomiendo <a href="http://www.desarrolloweb.com/scripts/php/validacion-php.php" title="Ir al tutorial">http://www.desarrolloweb.com/scripts/php/validacion-php.php</a> para PHP y <a href="http://www.desarrolloweb.com/scripts/asp/validaciones-formularios-asp.php" title="Ir al tutorial">http://www.desarrolloweb.com/scripts/asp/validaciones-formularios-asp.php</a> para ASP.</p>

<p>Para cualquier duda dejar un comentario y listo :).</p>
<p>Hasta el proximo post dentro de 200 días :d.</p>]]></content:encoded>
			<wfw:commentRss>http://www.jmocana.eu/2009/02/09/validaciones-con-jquery/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IE6 e IE7 juntos y fallo con PNG</title>
		<link>http://www.jmocana.eu/2008/10/12/ie6-e-ie7-standalone-juntos-y-fallo-con-png/</link>
		<comments>http://www.jmocana.eu/2008/10/12/ie6-e-ie7-standalone-juntos-y-fallo-con-png/#commentlist</comments>
		<pubDate>Sat, 11 Oct 2008 22:58:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Navegadores]]></category>

		<category><![CDATA[IE6]]></category>

		<category><![CDATA[IE7]]></category>

		<category><![CDATA[Multiple IE]]></category>

		<category><![CDATA[PNG]]></category>

		<guid isPermaLink="false">http://www.jmocana.eu/?p=106</guid>
		<description><![CDATA[¿Por qué IE6 e IE7 juntos?
En un principio puede parecer una tontería el querer instalar dos versiones de un mismo navegador a la vez y mas si estamos hablando del navegador de Microsoft: Internet Explorer, pero claro si tu profesión es la de Desarrollador Web y aproximadamente un 50% de los usuarios de Internet utilizan [...]]]></description>
			<content:encoded><![CDATA[<div class="tema">
<h3>¿Por qué <abbr title="Internet Explorer 6">IE6</abbr> e <abbr title="Internet Explorer 7">IE7</abbr> juntos?</h3>
<p>En un principio puede parecer una tontería el querer instalar dos versiones de un mismo navegador a la vez y mas si estamos hablando del navegador de Microsoft: Internet Explorer, pero claro si tu profesión es la de Desarrollador Web y aproximadamente un 50% de los usuarios de Internet utilizan IE6 o IE7 no te queda otra que instalártelos y comprobar que tus páginas se ven correctamente en los mismos, eso o buscarte otra profesión.</p>
<p>Para todos aquellos que no seáis Desarrolladores Web, un consejo, pasar de IE  y bajaros cuanto antes la ultima versión de alguno de estos navegadores:</p>
<ul>
	<li><a title="Ir a la página de descarga" href="http://www.mozilla-europe.org/es/firefox/">Firefox</a></li>
	<li><a title="Ir a la página de descarga" href="http://www.opera.com/">Ópera</a></li>
</ul>
</div>
<div class="tema">
<h3>Multiple IE.  Así no</h3>
<p>Multiple IE es un simple software que nos permitirá <strong>instalar varias versiones de IE</strong> Standalone en nuestro ordenador. Podremos instalar las siguientes:</p>
<ul>
	<li><a title="Descargar" href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie3_9x.zip">IE3</a></li>
	<li><a title="Descargar" href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie401_nt.zip">IE4.01</a></li>
	<li><a title="Descargar" href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie501sp2_nt.zip">IE5.01</a></li>
	<li><a title="Descargar" href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie55sp2_nt.zip">IE5.5</a></li>
	<li><a title="Descargar" href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie6eolas_nt.zip">IE6</a></li>
</ul>
<p>Dicho esto habría que preguntarse si es realmente útil este multiple IE. Teniendo en cuenta como he comentado en el apartado anterior que son IE6 e IE7 los que suman un 50% aproximadamente del uso de navegadores, que las demás versiones están prácticamente obsoletas (<em>&#8220;Alabado sea el señor&#8221;</em>) y que no nos da la posibilidad de instalar IE7 en nuestro ordenador&#8230; no tiene mucho sentido instalar todos esos IE cuando realmente solo uno nos sirve. Además de todo esto nos topamos con que la Web Developer de IE no funcionará si instalamos nuestros IE con este software y no es que la Web Developer de IE sea una maravilla pero ayudará bastante si no queremos estar poniendo cada dos por tres un borde o un background en nuestro <abbr title="Cascading Style Sheets">CSS</abbr> para comprobar las dimensiones de los distintos elementos.</p>
<p><a title="Descargar" href="http://www.microsoft.com/downloadS/details.aspx?familyid=E59C3964-672D-4511-BB3E-2D5E1DB91038&amp;displaylang=en">Web Developer IE</a></p></div>
<div class="tema">
<h3>Descargando IE6 e IE7 Standalone. Así si</h3>
<p>A la hora de <strong>instalar IE6 e IE7 conjuntamente</strong> lo mejor es optar por instalar cada una de las versiones Standalone por separado, para ello muy sencillo, respecto a IE6 simplemente nos tendremos que descargar un zip y descomprimirlo y con IE7 disponéis de un instalador en la página de Tredosoft.</p>
<ul>
	<li><a title="Descargar" href="http://browsers.evolt.org/download.php?/ie/32bit/standalone/ie6eolas_nt.zip">IE6 Standalone</a></li>
	<li><a title="Descargar" href="http://tredosoft.com/IE7_standalone">IE7 Standalone</a></li>
</ul>
</div>
<div class="tema">
<h3>Problemas con los <abbr title="Portable Network Graphics">PNG</abbr> en IE6</h3>
<p>Es bien sabido de las dificultades de IE6 para trabajar con imágenes png. Para poder <strong>ver un PNG transparente en IE6</strong> necesitaremos apoyarnos en el filtro AlphaImageLoader. Por ejemplo, si queremos meter un fondo transparente a uno de nuestros contenedores insertaremos el siguiente código css:</p>
<div class="codigo"><p class="lenguaje css"><strong>Código CSS</strong></p><pre><code>.contenedor { background:url('../img/fndo_contenedor.png'); }
* html .contenedor { background-image: none;
<span class="larga">filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src=' img/fndo_contenedor.png '); }</span></code></pre></div>
En la primera linea insertamos el fondo para los navegadores que hacen las cosas bien y a continuación insertamos la línea ñapa con el filtro AlphaImageLoader. Es importante meter en el filtro la ruta de la imagen con posicionamiento absoluto o relativo al archivo HTML para que podamos ver el PNG.</div>
<div class="tema">
<h3>Problemas con los PNG en IE6 Standalone</h3><p>
Actualmente la versión descargable de <strong>IE6 Standalone viene dando problemas con los PNG</strong> transparentes. El problema consiste en que se han perdido archivos <abbr title="Dynamic Linking Library">DLL</abbr> por el camino, necesarios para el funcionamiento del filtro AlphaImageLoader que vimos anteriormente (<a href="http://es.wikipedia.org/wiki/DLL_Hell" title="¿Que es esto?">infierno de las DLLs</a>). Estos archivos son:</p>
<ul>
	<li>dxtmsft.dll</li>
	<li>dxtrans.dll</li>
</ul>
<p><a class="zip" href="/wp-content/zip/IE6Eolas_dll.zip">Descargar DLLs</a></p>
<p>Para poder ver los PNG tendremos que descargarnos estos dos archivos y copiarlos en la carpeta raíz donde tenemos nuestro Internet Explorer 6 Stanalone.</p>
<p>Siguiendo todos estos pasos no deberíamos volver a tener problemas para ver los PNG en IE6.</p>
<p>Para más información visitar: <a title="Visitar sitio web" href="http://tredosoft.com/Multiple_IE#comment-2318">http://tredosoft.com/Multiple_IE#comment-2318</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://www.jmocana.eu/2008/10/12/ie6-e-ie7-standalone-juntos-y-fallo-con-png/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
