<?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>marcis / blog &#187; javascript</title>
	<atom:link href="http://blog.marcis.es/etiqueta/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.marcis.es</link>
	<description>Desarrollo Web</description>
	<lastBuildDate>Fri, 09 Jul 2010 22:43:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Extensiones para desarrollo web</title>
		<link>http://blog.marcis.es/extensiones-para-desarrollo-web/</link>
		<comments>http://blog.marcis.es/extensiones-para-desarrollo-web/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 11:18:38 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=191</guid>
		<description><![CDATA[A raíz de un par de artículos sobre el tema, os dejo unas cuantas extensiones de Chrome y Firefox para desarrolladores web.
Para Firefox:

Firebug: no necesita presentación.
FireQuery: compatibilidad entre jQuery y Firebug.
FirePHP: añade soporte para PHP y Ajax.
Web Developer: herramienta que permite activar/desactivar las hojas de estilos, los plugins, el código javascript, las tablas, las imágenes,&#8230;
Html [...]]]></description>
			<content:encoded><![CDATA[<p>A raíz de un par de artículos sobre el tema, os dejo unas cuantas <strong>extensiones</strong> de <a title="Extensiones de Google Chrome para el desarrollo Web" href="http://www.megadual.com/2010/05/31/extensiones-de-google-chrome-para-el-desarrollo-web/" target="_blank">Chrome</a> y <a title="EXTENSIONES DE FIREFOX RECOMENDADAS PARA EL DESARROLLO WEB" href="http://skatox.com/blog/2010/05/27/mis-extensiones-recomendadas-desarrollo-web-firefox/" target="_blank">Firefox</a> para <strong>desarrolladores web</strong>.</p>
<p><span id="more-191"></span>Para <strong>Firefox</strong>:</p>
<ul>
<li><a title="Firebug" href="https://addons.mozilla.org/es-ES/firefox/addon/1843/" target="_blank">Firebug</a>: no necesita presentación.</li>
<li><a title="FireQuery" href="https://addons.mozilla.org/es-ES/firefox/addon/12632/" target="_blank">FireQuery</a>: compatibilidad entre jQuery y Firebug.</li>
<li><a title="FirePHP" href="https://addons.mozilla.org/es-ES/firefox/addon/6149/" target="_blank">FirePHP</a>: añade soporte para PHP y Ajax.</li>
<li><a title="Web Developer" href="https://addons.mozilla.org/es-ES/firefox/addon/60/" target="_blank">Web Developer</a>: herramienta que permite activar/desactivar las hojas de estilos, los plugins, el código javascript, las tablas, las imágenes,&#8230;</li>
<li><a title="HTML Validator" href="https://addons.mozilla.org/firefox/addon/249" target="_blank">Html Validator</a>: evidentemente, ayuda a comprobar si una página cumplen el estándar.</li>
</ul>
<p>Para <strong>Chrome</strong>:</p>
<ul>
<li><a title="Resolution Test" href="https://chrome.google.com/extensions/detail/idhfcdbheobinplaamokffboaccidbal" target="_blank">Resolution Test</a>: permite redimensionar el navegador para visualizar la página en distintas resoluciones y comprobar que &#8220;todo funciona&#8221;.</li>
<li><a title="Speed Tracer" href="http://www.omeyasweb.com/extensiones-de-google-chrome-para-el-desarrollo-web/Speed%20Tracer" target="_blank">Speed Tracer</a>: <a title="Speed Tracer de Google | marcis / blog" href="http://blog.marcis.es/speed-tracer-de-google/" target="_self">ya hablamos de él</a> en este blog.</li>
<li><a title="Pendule" href="https://chrome.google.com/extensions/detail/gbkffbkamcejhkcaocmkdeiiccpmjfdi" target="_blank">Pendule</a>: permite hacer <em>probatinas</em> con los colorer, hojas de estilo, javascript,&#8230;</li>
</ul>
<p>¿Cuáles son vuestras preferidas?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/extensiones-para-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Speed Tracer de Google</title>
		<link>http://blog.marcis.es/speed-tracer-de-google/</link>
		<comments>http://blog.marcis.es/speed-tracer-de-google/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 17:01:31 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[aplicaciones]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=73</guid>
		<description><![CDATA[Speed Tracer es una herramienta, lanzada por Google recientemente, que sirve para &#8220;identificar y solucionar problemas de rendimiento en las aplicaciones web&#8220;.
Fundamentalmente, su funcionamiento se basa en el tiempo de carga de la página desde que realizas la petición hasta que ésta termina por completo.
Speed Tracer te muestra una gráfica de los tiempos invertidos en [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Speed Tracer</strong> es una herramienta, lanzada por Google recientemente, que sirve para &#8220;identificar y solucionar <strong>problemas de rendimiento en las aplicaciones web</strong>&#8220;.</p>
<p><span><span id="more-73"></span>Fundamentalmente, su funcionamiento se basa en el <strong>tiempo de carga de la página</strong> desde que realizas la petición hasta que ésta termina por completo.</span></p>
<p><span>Speed Tracer te muestra una <strong>gráfica de los tiempos invertidos</strong> en el transporte por la red, la recepción de la página, su carga y <em>renderizado</em>, así como la petición y carga de otros archivos dependientes de la página (imágenes, javascript, códigos externos,&#8230;).</span></p>
<div id="attachment_75" class="wp-caption aligncenter" style="width: 458px"><strong><img class="size-full wp-image-75" title="Speed Tracer" src="http://blog.marcis.es/wp-content/uploads/2009/12/Speed-Tracer.jpg" alt="Captura de un ejemplo de uso de Speed Tracer" width="448" height="271" /></strong><p class="wp-caption-text">Captura de un ejemplo de uso de Speed Tracer</p></div>
<p><span>De esa forma puedes detectar cuáles son los <strong>puntos críticos</strong> de tu aplicación web, es decir aquellos que merece la pena optimizar. La información, que se muestra de una manera muy visual, es bastante completa y te permite ampliar los detalles de cada una de las fases y sus componentes.</span></p>
<p><span>Speed Tracer está diponible como una <strong>extensión de Chrome para desarrolladores web</strong> en sus versiones para Windows y Linux.</span></p>
<p>Más detalles en <a title="Speed Tracer - Google Web Toolkit - Google Code" href="http://code.google.com/intl/es-ES/webtoolkit/speedtracer/" target="_blank">Speed Tracer &#8211; Google Web Toolkit &#8211; Google Code</a> y en <a title="Speed Tracer" href="http://code.google.com/p/speedtracer/" target="_blank">la página del proyecto</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/speed-tracer-de-google/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Acceder al portapapeles desde Javascript</title>
		<link>http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/</link>
		<comments>http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 19:23:44 +0000</pubDate>
		<dc:creator>marcis</dc:creator>
				<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[usabilidad]]></category>

		<guid isPermaLink="false">http://blog.marcis.es/?p=17</guid>
		<description><![CDATA[Estoy trabajando en un proyecto en el que hemos decidido mostrarle al usuario, para facilitarle la tarea, un botón o enlace que le permita copiar un texto al portapapeles. De esa forma puede realizar dos acciones con un solo click: seleccionar y copiar.
Empecé la investigación (léase búsqueda en Google) y obtuve resultados demasiado buenos para [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy trabajando en un proyecto en el que hemos decidido mostrarle al usuario, para facilitarle la tarea, un botón o enlace que le permita <strong>copiar un texto al portapapeles</strong>. De esa forma puede realizar dos acciones con un solo <em>click</em>: seleccionar y copiar.</p>
<p><span id="more-17"></span>Empecé la investigación (léase búsqueda en Google) y obtuve resultados demasiado buenos para ser verdad. Gracias al método &#8220;setData&#8221; del objeto &#8220;clipboardData&#8221; era sencillo cumplir mi objetivo:</p>
<pre style="padding-left: 30px;">clipboardData.setData("Text", s)
// siendo "s" una variable que contiene el texto a copiar</pre>
<p>Pero no podía ser tan fácil. El código anterior sólo funciona en Internet Explorer, así que seguí buscando una solución <em>cross-browser</em> o, como mínimo, <strong>compatible</strong> con Firefox.</p>
<p>Después de <a title="Dynamic Tools - Javascript Copy To Clipboard" href="http://www.dynamic-tools.net/toolbox/copyToClipboard/" target="_blank">algún intento infructuoso</a>, encontré <a title="Javascript copy to Firefox and Mozilla clipboard" href="http://www.febooti.com/support/website-help/website-javascript-copy-clipboard.html" target="_blank">este ejemplo</a> que funcionaba&#8230; con ciertas <strong>restricciones</strong>.</p>
<p>Por lo visto, las <a title="Security Policies - MozillaZine Knowledge Base" href="http://kb.mozillazine.org/Security_Policies" target="_blank">políticas de seguridad de Mozilla</a> impiden la ejecución de dicho código. Y puede que con motivo, ya que de lo contrario <a title="Retrieve Clipboard Text To A Web Page With Javascript - Make Sure You Do Not Allow Someone To Gather This Information, It Is An Exploit In Many Eyes" href="http://www.friendlycanadian.com/applications/clipboard.htm" target="_blank">cualquier página podría tener acceso a tu portapapeles</a> y, por lo tanto, a <strong>información potencialmente delicada</strong> (direcciones de e-mail, teléfonos, números de tarjeta de crédito,&#8230; o cualquier otro dato que hayas copiado).</p>
<p>Llegados a este punto, existían dos opciones para <strong>poder copiar el texto en Firefox</strong>:</p>
<ul>
<li><a title="JavaScript Security: Signed Scripts" href="http://www.mozilla.org/projects/security/components/signed-scripts.html" target="_blank">Firmar el script</a>, demasiado costoso para lo que queremos hacer</li>
<li>Confiar en que el usuario tenga activada la opción &#8220;signed.applets.codebase_principal_support&#8221; en su configuración (<a title="About:config entries - MozillaZine Knowledge Base" href="http://kb.mozillazine.org/Firefox_:_FAQs_:_About:config_Entries" target="_blank">about:config</a>), o bien esté dispuesto a habilitarla</li>
</ul>
<p>Si estamos pensando en hacer la aplicación más fácil de usar, <strong>no podemos pedirle al usuario</strong> que configure su navegador de una forma especial, que además conlleva cierto riesgo.</p>
<p>A todo esto hay que unir por un lado un <a title="Febooti Software" href="http://www.febooti.com/scripts/febooti.js" target="_blank">código fuente</a> bastante &#8220;farragoso&#8221;, lleno de capturas de excepciones y avisos al usuario. Y por otro, las <strong>alertas de seguridad</strong> que tanto IE como FF muestran antes de permitir la copia de contenidos al portapapeles. Seguro, pero poco práctico.</p>
<p>Me estaba replanteando la decisión de incluir esta funcionalidad cuando encontré <strong>una solución algo más limpia</strong>. Inicialmente había descartado la opción de implementarla usando Flash, pero al ver <a title="AddThis - Get Your Button Code" href="http://www.addthis.com/web-button?type=bm&amp;where=website&amp;url=&amp;bm=bn3&amp;analytics=0" target="_blank">la alternativa de AddThis</a> volví a cambiar de opinión.</p>
<p>La propuesta se basa en 4 elementos:</p>
<ol>
<li>La <a title="jQuery: The Write Less, Do More, JavaScript Library" href="http://jquery.com/" target="_blank">librería jQuery</a>, versión 1.3.2 reducida, como apoyo.</li>
<li>Un archivo de Flash, <a title="ZeroClipboard.swf" href="http://www.addthis.com/lib/zeroclipboard/ZeroClipboard.swf" target="_blank">ZeroClipboard.swf</a>, que fundamentalmente consiste en una imagen transparente que &#8220;captura&#8221; los eventos del ratón y copia un texto predefinido al portapapeles. Si teneis curiosidad por saber cómo está implementado, os recomiendo <a title="SWF Decompiler, Flash Decompiler, SWF to Flex,  SWF To FLA Converter, Recover FLA" href="http://www.sothink.com/product/flashdecompiler/" target="_blank">Sothink SWF Decompiler</a>.</li>
<li>Una clase, <a title="Simple Set Clipboard System" href="http://cache.addthis.com/www/q0004/lib/zeroclipboard/ZeroClipboard.js" target="_blank">ZeroClipboard</a>, que sirve de enlace entre el Flash y el Javascript de la página.</li>
<li>El <a title="ZeroClipboard example" href="http://cache.addthis.com/www/q0004/js/web-button.js" target="_blank">código Javascript que se ejecuta en la página</a> y que analizaremos a continuación:</li>
</ol>
<pre style="padding-left: 30px;">// Inicializamos el objeto ZeroClipboard con la ruta del fichero Flash
ZeroClipboard.setMoviePath('/lib/zeroclipboard/ZeroClipboard.swf');
// Usaremos como "disparadores" los elementos con class="copybtn"
$('.copybtn').each(function(){
    // Para diferenciarlos deben llamarse copybtn[X], siendo [X] un entero
    c = this.id.substr(7);
    // Se crea un "cliente" para cada disparador
    clips[c] = new ZeroClipboard.Client();
    // El texto se tomará del elemento con id="txt[X]"
    clips[c].setText($('#txt'+c).val());
    // Al terminar de copiar, ejecutar la función "cplt" (más abajo)
    clips[c].addEventListener('onComplete', cplt);
    // Si no está oculto, "pegar" el Flash al elemento actual
    // (es decir, colocarlo justo encima ocupando toda su extensión)
    if (!$(this).hasClass('hidebtn')) clips[c].glue(this);
}).bind('toggle',function(e){
    // Comportamiento cuando se cambie de un elemento a otro
    ...
});

// Al terminar, selecciona el texto copiado
// y muestra un mensaje de confirmación durante unos segundos
var cplt = function(client, text)
{
    c = client.domElement.id.substr(7);
    // Selecciona el contenido del "textarea"
    // (si usamos otro elemento, habrá que modificar esta línea)
    $('#txt'+c).get(0).select();
    $('#copyfdbk'+c).html('&amp;nbsp;&lt;em&gt;Copied&lt;/em&gt;').show();
    setTimeout("$('#copyfdbk"+c+"').fadeOut()", 2500);
}</pre>
<p>En cuanto al HTML, destacar sólo un par de detalles:</p>
<pre style="padding-left: 30px;">&lt;!-- El contenedor del texto es un textarea con el id adecuado --&gt;
&lt;<span>textarea</span><span> rows</span>=<span>"5" </span><strong><span>id</span>=</strong><span><strong>"txt0"</strong> </span><span>wrap</span>=<span>"off"...</span>
&lt;!-- El disparador es un botón con el id y la clase indicados --&gt;
&lt;<span>input</span><span> <strong>id</strong></span><strong>=</strong><span><strong>"copybtn0"</strong> </span><span>type</span>=<span>"button" </span><span>value</span>=<span>"Copy Code" </span><span>class</span>=<span>"<strong>copybtn</strong> lgbtn" </span><span><span>/</span></span>&gt;
&lt;!-- El elemento donde se mostrará el "feedback" --&gt;
&lt;<span>span</span><span> <strong>id</strong></span><strong>=<span>"copyfdbk0"</span></strong>&gt;&lt;/<span>span</span>&gt;</pre>
<p>Lo único que falta es ejecutar el código Javascript al terminar de cargar la página.</p>
<p>Más información sobre <a title="zeroclipboard - Project Hosting on Google Code" href="http://code.google.com/p/zeroclipboard/" target="_blank">Zero Clipboard en Google Code</a>.</p>
<h3>Seleccionar el contenido de un <em>span</em></h3>
<p>Como comentaba más arriba, si queremos <strong>seleccionar el texto</strong> de un elemento que no sea un <em>textarea</em> tendremos que modificar la llamada:</p>
<pre style="padding-left: 30px;">// $('#txt'+c).get(0).select();
selectElement($('#text_to_copy_'+c).get(0))

// Siendo la función:
function selectElement (element)
{
    if (document.selection) {
        var range = document.body.createTextRange();
        range.moveToElementText(element);
        range.select();
    } else if (window.getSelection) {
        var range = document.createRange();
        range.selectNodeContents(element);
        var selection = window.getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
    }
}</pre>
<p>Os dejo un <a title="FAQTs - Knowledge Base - View Entry - I want to select some span text dynamically using Javascipt. Is there any way to do that?" href="http://www.faqts.com/knowledge_base/view.phtml/aid/37741" target="_blank">enlace a la fuente original</a> con su correspondiente explicación.</p>
<h3>¿Y si el usuario no tiene instalado el plugin de Flash?</h3>
<p>Por último, si no queremos confiar el funcionamiento del <em>script</em> en la carga del Flash podemos hacer una pequeña modificación:</p>
<ul>
<li>Retomamos la función Javascript que <a title="Febooti Software" href="http://www.febooti.com/scripts/febooti.js" target="_blank">copia un texto al portapapeles</a>. Llamémosla &#8220;copyToClipboard&#8221;.</li>
<li>En el bucle que recorre los disparadores, le asignamos a cada uno de ellos un gestor del evento &#8220;click&#8221; que llame a &#8220;copyToClipboard&#8221;.</li>
<li>Hacemos un cambio en el método &#8220;glue&#8221; de la clase &#8220;ZeroClipboard.Client&#8221; para que coloque el Flash fuera de lugar:</li>
</ul>
<pre style="padding-left: 30px;">// style.left = '' + box.left + 'px';
style.left = '0px';
// style.top = '' + box.top + 'px';
style.top = '0px';</pre>
<ul>
<li>Y añadimos otro gestor de eventos al objeto cliente, para comprobar que se carga correctamente:</li>
</ul>
<pre style="padding-left: 30px;">clips[c].addEventListener('onLoad', loaded);</pre>
<pre style="padding-left: 30px;">// Colocar en su sitio si todo va bien
var loaded = function(client) {
    c = client.domElement.id.substr(12);
    clips[c].reposition();
}</pre>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1667px; width: 1px; height: 1px;">
<pre style="padding-left: 30px;">style.top = '' + box.top + 'px';</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.marcis.es/acceder-al-portapapeles-desde-javascript/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
