<?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>Quenerapú &#187; javaScript</title>
	<atom:link href="http://quenerapu.com/categorias/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://quenerapu.com</link>
	<description>Sentado delante de un ordenador desde 1982. ¿De qué voy a hablar, si no?</description>
	<lastBuildDate>Mon, 12 Jul 2010 09:09:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Usa el jQuery de Google, anda</title>
		<link>http://quenerapu.com/javascript/usa-el-jquery-de-google-anda/</link>
		<comments>http://quenerapu.com/javascript/usa-el-jquery-de-google-anda/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 02:11:11 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=127</guid>
		<description><![CDATA[Usar la misma librería jQuery que usa Google tiene muchas ventajas. Por eso recomiendo hacerlo.]]></description>
			<content:encoded><![CDATA[<p>Al programar usando <a href="http://jquery.com/">jQuery</a> es lo común colgarlo de un directorio del proyecto e invocarlo con el clásico:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p>Sin embargo <a href="http://encosia.com/2008/12/10/3-reasons-why-you-should-let-google-host-jquery-for-you/">un artículo que leí hace algún tiempo</a> [Encosia.com] recomienda evitar esa práctica, y utilizar el jQuery que Google cuelga de sus servidores y usa para sus propios sitios web. De esta manera:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p><strong>Dave Ward</strong>, el autor, lo razonaba con tres sólidos argumentos:</p>
<ul>
<li><strong>Tu página cargará antes.</strong> jQuery es una librería pesada y, asúmelo, siempre se cargará antes desde un servidor de Google (un señor servidor) que desde el tuyo.</li>
<li><strong>¿He dicho ya que tu página cargará antes?</strong> Mientras el navegador lee jQuery desde el servidor de Google, puede ir cargando el resto de la web que sí están en tu servidor. Simultáneamente. Eso es un gran ahorro de tiempo.</li>
<li><strong>Tu página (y todas nuestras páginas) cargarán antes.</strong> Cuando forzamos la carga de un jQuery nuevo en cada web, estamos llenando la caché de los navegadores de material redundante. Pero si en vez de eso llamamos siempre al mismo jQuery de Google, si todos los hiciéramos, los navegadores no necesitarían cargar jQuery <strong>porque ya lo tienen.</strong></li>
</ul>
<p>Me convenció aquel artículo así que de un tiempo a esta parte procuro no apuntar hacia un jQuery en mi servidor, sino al que alberga Google en sus servidor de APIs.</p>
<p>No obstante, con un proyecto web en el que uso esta técnica me pasó una cosa curiosa el otro día. Durante un viaje en tren aproveché para programar un rato y al no tener acceso a Internet el jQuery de Google, claro, no cargaba y por consiguiente no podía trabajar.</p>
<p>La solución fue obvia: Temporalmente cambié esa línea, dejando de apuntar al servidor de Google para apuntar a un jQuery local.<br />
Y viendo que esto podía sucederme de nuevo en el futuro, opté por algo también obvio, que es mantener ambas líneas en el código de la página y comentar la que sobra según la situación. Nada del otro mundo.</p>
<p>Pero luego me empeñé en perfeccionar un poco la cosa y salió esto:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;if(typeof jQuery==='undefined'){document.write(unescape(&quot;&lt;scri&quot;+&quot;pt src='js/jquery-1.3.2.min.js' type='text/javascript'&gt;&lt;/scri&quot;+&quot;pt&gt;&quot;));}&lt;/script&gt;
</pre>
<p>Utilizando este código <strong>me despreocupo totalmente del tema</strong>. ¿Que encuentra el jQuery de Google? Lo usa. ¿Que no? Pues usa el jQuery local.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/usa-el-jquery-de-google-anda/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>De checkbox múltiple a lista</title>
		<link>http://quenerapu.com/javascript/de-checkbox-multiple-a-lista/</link>
		<comments>http://quenerapu.com/javascript/de-checkbox-multiple-a-lista/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 13:08:51 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[javaScript]]></category>
		<category><![CDATA[checkbox múltiple]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[lista]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=100</guid>
		<description><![CDATA[Ésta es la técnica que uso cuando quiero llevar los datos de un checkbox múltiple en un formulario web a una tabla de datos.]]></description>
			<content:encoded><![CDATA[<p>No sé si es lo más correcto, pero habitualmente almaceno en las tablas de datos el contenido de un campo checkbox múltiple&#8230;</p>
<div id="attachment_115" class="wp-caption alignnone" style="width: 392px"><img class="size-full wp-image-115" title="Checkbox múltiple" src="http://quenerapu.com/wp-content/uploads/2009/03/checkboxmultiple1.jpg" alt="Checkbox múltiple" width="382" height="111" /><p class="wp-caption-text">Checkbox múltiple</p></div>
<p>&#8230;del siguiente modo:</p>
<div id="attachment_114" class="wp-caption alignnone" style="width: 392px"><img class="size-full wp-image-114" title="Tabla en la base de datos" src="http://quenerapu.com/wp-content/uploads/2009/03/checkboxmultiple2.jpg" alt="Tabla en la base de datos" width="382" height="120" /><p class="wp-caption-text">Tabla en la base de datos</p></div>
<p>Nomalmente uso comas para separarlos pero cuando esto es un problema tiro de caracteres menos frecuentes como la <a href="http://en.wikipedia.org/wiki/Vertical_bar">barra vertical <strong>|</strong></a>, por ejemplo.</p>
<p>Para convertir el contenido de un campo checkbox múltiple en una lista separada por comas utilizo esta función:</p>
<pre class="brush: jscript;">
function chkd2lst(frm,fld)
	{
	var t=&quot;&quot;;var s=&quot;,&quot;;
	for(var i=0;i&lt;document[frm].elements[&quot;_&quot;+fld].length;i++)
		{
		if(document[frm].elements[&quot;_&quot;+fld][i].checked)
			{
			t+=document[frm].elements[&quot;_&quot;+fld][i].value+s;
			}
		}
	document[frm].elements[fld].value=t;
	alert(document[frm].elements[fld].value);
	}
</pre>
<p>La función <strong>chkd2lst</strong> espera el nombre del formulario y el nombre del campo checkbox múltiple. También define que la coma será el separador de los elementos de la lista (<strong>variable s</strong>) pero esto es fácilmente editable. Al final de la función hay un <strong>alert</strong> que puede ser eliminado, por supuesto. Está ahí simplemente para comprobar que la función funciona.</p>
<p>Supongamos que, como en el ejemplo de las imágenes, el campo se llama <strong>diasClase</strong>. El formulario ha de llamar entonces al javaScript de esta manera:</p>
<pre class="brush: xml;">
&lt;form
	name=&quot;ficha&quot;
	method=&quot;post&quot;
	onSubmit=&quot;chkd2lst(this.name,'diasClase');return;&quot;
&gt;
</pre>
<p>Dentro del formulario, divido el tema del checkbox múltiple en dos partes. Por un lado la sucesión de checkboxes:</p>
<pre class="brush: xml;">
&lt;input name=&quot;_diasClase&quot; value=&quot;1&quot; type=&quot;checkbox&quot;&gt;Lunes
&lt;input name=&quot;_diasClase&quot; value=&quot;2&quot; type=&quot;checkbox&quot;&gt;Martes
&lt;input name=&quot;_diasClase&quot; value=&quot;3&quot; type=&quot;checkbox&quot;&gt;Miércoles
&lt;input name=&quot;_diasClase&quot; value=&quot;4&quot; type=&quot;checkbox&quot;&gt;Jueves
&lt;input name=&quot;_diasClase&quot; value=&quot;5&quot; type=&quot;checkbox&quot;&gt;Viernes
&lt;input name=&quot;_diasClase&quot; value=&quot;6&quot; type=&quot;checkbox&quot;&gt;Sábado
</pre>
<p>Y a continuación un campo hidden en el que guardaré la lista generada a partir de los checkboxes.</p>
<pre class="brush: xml;">
&lt;input name=&quot;diasClase&quot; value=&quot;&quot; type=&quot;hidden&quot;&gt;
</pre>
<p>La función espera que el nombre de los campos checkbox y hidden sean el mismo, pero que el nombre de cada <strong>input</strong> del checkbox múltiple vaya precedido de un <a href="http://en.wikipedia.org/wiki/Low_line">guión bajo <strong>_</strong></a> y que el nombre del campo hidden no lo lleve.</p>
<p>Y ya está: antes de enviar el formulario, <strong>chkd2lst</strong> convierte las opciones seleccionadas en <strong>_diasclase</strong> en una lista separada por comas y la lleva a <strong>diasclase</strong>. <a href="http://quenerapu.com/ejemplos/checkboxMultiple.htm">He colgado un ejemplo aquí</a> en el que sustituyo el <strong>campo hidden</strong> por un <strong>campo text</strong> sólo para que se vea el resultado.</p>
<p>Próximamente publicaré otro artículo en el que trataré el proceso inverso, es decir: traigo de la base de datos un campo conteniendo la lista separada por comas y marco como <strong>checked</strong> los elementos correspondientes del checkbox multiple. Imprescindible para poder editar, claro.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/de-checkbox-multiple-a-lista/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Links clicables en texto libre</title>
		<link>http://quenerapu.com/javascript/links-clicables-en-texto-libre/</link>
		<comments>http://quenerapu.com/javascript/links-clicables-en-texto-libre/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 17:22:34 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[función]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=67</guid>
		<description><![CDATA[Una cómoda función que automatiza el código necesario para hacer clicables los enlaces web contenidos en cualquier cadena de texto.]]></description>
			<content:encoded><![CDATA[<p>A menudo facilitamos al usuario de formularios algún cuadro de texto libre que permiten la inclusión de enlaces web. Se me ocurren sólo tres formas de conseguir que esos enlaces sean clicables al volver a volcar la info en pantalla:</p>
<ol>
<li>Dejarlo en manos del usuario, confiando en que use correctamente los tags <strong>&lt;a href=&#8221;&#8230;&#8221;&gt;&lt;/a&gt;</strong></li>
<li>Dejarlo en manos del usuario, confiando en que use correctamente alguna herramienta web que le facilitemos para ello, como <a href="http://www.fckeditor.net/">FCKEditor</a>, <a href="http://tinymce.moxiecode.com/">TinyMCE</a> o similares</li>
<li>Dejarlo en manos de una función.</li>
</ol>
<p>Dejar el HTML en manos del usuario medio es habitualmente una fuente de problemas, así que suelo prescindir de la <strong>opción 1</strong>.</p>
<p>La <strong>opción 2</strong> es muy tentadora pero sólo la utilizo cuando desarrollo paneles de control ya que sus usuarios tienen formación específica o han recibido algún cursillo, así que todo suele ir como la seda.</p>
<p>Así que cuando se trata de dejar formularios al alcance de usuarios desconocidos, me decanto siempre por la <strong>opción 3</strong>.</p>
<p>Ejemplo: Supongamos que el siguiente texto es introducido en un textarea de un formulario web.</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es http://www.cuatro.com, la de Antena 3 es http://antena3.com, la de RTVE es http://rtve..es y la de La Sexta creo que es www.lasexta.com. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Vemos que el mensaje incluye cuatro enlaces:</p>
<ul>
<li><strong>http://www.cuatro.com</strong> es correcto.</li>
<li><strong>http://antena3.com</strong> es correcto aunque no incluya el subdominio &#8216;www&#8217;.</li>
<li><strong>http://rtve..es</strong> presenta una errata (dos puntos entre &#8216;rtve&#8217; y &#8216;es&#8217;) y no es un enlace válido.</li>
<li><strong>www.lasexta.com</strong> sería correcto en la barra de direcciones del navegador pero en principio no es directamente reconocible como enlace al no ir precedido del indicador de protocolo &#8216;http://&#8217;.</li>
</ul>
<p>La función que presento hoy es capaz de reconocer los enlaces y actuar en consecuencia:</p>
<pre class="brush: php;">
&lt;?php
function addLinks($str,$alt=false)
	{
	$com = &quot;[enlace]&quot;;
	$pcl = &quot;((ht|f)tps?:\/\/)&quot;;
	$hst = &quot;([a-z\d][-a-z\d]*[a-z\d]\.)+&quot;.
		   &quot;[a-z][-a-z\d]*[a-z]&quot;;
	$prt = &quot;(:\d{1,})?&quot;;
	$pth = &quot;(\/[^?&lt;&gt;\#\&quot;\s]+)?&quot;;
	$qry = &quot;(\?[^&lt;&gt;\#\&quot;\s]+)?&quot;;
	$str = preg_replace(
			&quot;#({$pcl}{$hst}{$prt}{$pth}{$qry})#&quot;,
			&quot;&lt;a href='$1'&gt;&quot;.($alt?$com:'$1').
			&quot;&lt;/a&gt;&quot;,$str);
	$str = preg_replace(
			&quot;#\s(www.{$hst}{$prt}{$pth}{$qry})#&quot;,
			&quot; &lt;a href='http://$1'&gt;&quot;.($alt?$com:'$1').
			&quot;&lt;/a&gt;&quot;,$str);
	return $str;
	}

$txt = &quot;Hola Juan. La web de Cuatro es http://www.cuatro.com, &quot;.
	   &quot;la de Antena 3 es http://antena3.com, la de RTVE es &quot;.
	   &quot;http://rtve..es y la de La Sexta creo que es &quot;.
	   &quot;www.lasexta.com. A ver si ahí puedes encontrar la info &quot;.
	   &quot;que buscas. Un saludo.&quot;;

echo addLinks($txt);
?&gt;
</pre>
<p>Esta función devuelve el valor de <strong>$txt</strong> como sigue:</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es <a href="http://www.cuatro.com">http://www.cuatro.com</a>, la de Antena 3 es <a href="http://antena3.com">http://antena3.com</a>, la de RTVE es http://rtve..es y la de La Sexta creo que es <a href="http://www.lasexta.com">www.lasexta.com</a>. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Vemos que los tres enlaces válidos son clicables. El enlace a RTVE no lo es porque la función no lo dio por bueno. Pero aparece como parte del texto con la esperanza de que quien lo lea detecte la errata, corrija el enlace y pueda utilizarlo.</p>
<p>¡Ah! Y si queremos que no aparezcan los enlaces escritos (a veces ocupan demasiado espacio), podemos sustituirlos por una palabra comodín simplemente añadiendo &#8216;true&#8217; como segundo parámetro:</p>
<pre class="brush: php; gutter: false;">
&lt;?= addLinks($txt,true); ?&gt;
</pre>
<p>Lo que nos devuelve:</p>
<div class="cita">
<p>Hola Juan. La web de Cuatro es <a href="http://www.cuatro.com">[enlace]</a>, la de Antena 3 es <a href="http://antena3.com">[enlace]</a>, la de RTVE es http://rtve..es y la de La Sexta creo que es <a href="http://www.lasexta.com">[enlace]</a>. A ver si ahí puedes encontrar la info que buscas. Un saludo.</p>
</div>
<p>Muy práctico, ¿verdad?.</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/links-clicables-en-texto-libre/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La clásica función «¿Estás seguro/a?»</title>
		<link>http://quenerapu.com/javascript/la-clasica-funcion-estas-seguro-a/</link>
		<comments>http://quenerapu.com/javascript/la-clasica-funcion-estas-seguro-a/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 02:35:55 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[javaScript]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[minimal]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=36</guid>
		<description><![CDATA[Una función javaScript muy básica, para pedir confirmación al usuario/a sobre lo que va a hacer (como por ejemplo, eliminar un registro).]]></description>
			<content:encoded><![CDATA[<p>Una de esas funciones básicas que no deben faltar en ningún proyecto. Es simple: Se trata de pedir confirmación al usuario antes de acceder al link indicado. Muy útil antes de eliminar un registro, por ejemplo. Incluye algo que me gusta añadir a mi programación en los momentos en que el software se dirige al usuario/a. Texto personalizado según su género.</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
function rUSure(u,g)
	{
	if(!g){var g='o';}
	if(confirm(&quot;¿Estás segur&quot;+g+&quot;?&quot;)){document.location.href=u;}
	}
&lt;/script&gt;
</pre>
<p>Nota: Esta función hace uso de la técnica <a href="2009/02/25/argumentos-por-defecto-en-funciones-javascript/">Argumentos por defecto en funciones javaScript</a> para ajustar el mensaje al género del usuario (¿Estás seguro?|¿Estás segura?)</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/la-clasica-funcion-estas-seguro-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Argumentos por defecto en funciones javaScript</title>
		<link>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/</link>
		<comments>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 02:15:13 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[javaScript]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://quenerapu.local/?p=32</guid>
		<description><![CDATA[En PHP es sencillo declarar parámetros por defecto en las funciones. En javaScript también se puede, aunque de un modo menos directo]]></description>
			<content:encoded><![CDATA[<p>En PHP es posible (y sencillo) declarar parámetros por defecto en las funciones.</p>
<pre class="brush: php;">
&lt;?php
function qq($a,$b=2)
	{
	return $a+$b;
	}

echo qq(3);		// Devuelve 5
echo qq(3,3);	// Devuelve 6
?&gt;
</pre>
<p>Vemos que si no asignamos un valor a <strong>$b</strong>, la función tiene reservado para <strong>$b</strong> un valor por defecto.</p>
<p>Lamentablemente en javaScript no es posible declarar un argumento por defecto en una función de un modo tan directo. El siguiente ejemplo **<strong>no funciona</strong>**:</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
function qq(a,b=2)	// Esto no va a funcionar
	{
	return a+b;
	}
&lt;/script&gt;
</pre>
<p>¿Cómo podemos conseguirlo? Pues con un poco de ingenio es posible expresar la idea de «argumento por defecto en funciones javaScript» de la siguiente manera:</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
function qq(a,b)
	{
	if(!b){var b=2;} // Si no hay b, b=2
	return a+b;
	}

document.write(qq(3));		// Devuelve 5
document.write(qq(3,3));	// Devuelve 6
&lt;/script&gt;
</pre>
<p>¿Fácil, no?</p>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/javascript/argumentos-por-defecto-en-funciones-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
