<?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>Claudio&#039;s Hideout &#187; javascript</title>
	<atom:link href="http://claudio.cicali.name/post/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://claudio.cicali.name</link>
	<description>Claudio Cicali web hub</description>
	<lastBuildDate>Sun, 25 Sep 2011 11:29:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Modialog, a jQuery plugin for modal dialogs</title>
		<link>http://claudio.cicali.name/post/2011/06/modialog-a-jquery-plugin-for-modal-dialogs/</link>
		<comments>http://claudio.cicali.name/post/2011/06/modialog-a-jquery-plugin-for-modal-dialogs/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 17:15:40 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Annunci]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=1023</guid>
		<description><![CDATA[I&#8217;ve just released a very small plugin for jQuery. It&#8217;s called Modialog and it aims to be the smallest &#8220;modal dialog boxes&#8221; plugin (there are already a lot of them out there). It weights only 2KB and works with every recent browser. You can take a look at its bare bone demo page.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released a very small plugin for jQuery. It&#8217;s called <a href="https://github.com/claudioc/modialog">Modialog</a> and it aims to be the smallest &#8220;modal dialog boxes&#8221; plugin (there are already a lot of them <a href="https://itswadesh.wordpress.com/2011/04/13/15-jquery-popup-modal-dialog-plugins-and-tutorials/">out there</a>). It weights only 2KB and works with every recent browser. You can take a look at its bare bone <a href="http://claudioc.github.com/modialog/demo.html">demo page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2011/06/modialog-a-jquery-plugin-for-modal-dialogs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mio screencast su Thinkcode.tv</title>
		<link>http://claudio.cicali.name/post/2010/02/mio-screencast-su-thinkcode-tv/</link>
		<comments>http://claudio.cicali.name/post/2010/02/mio-screencast-su-thinkcode-tv/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:28:12 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Annunci]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[lezione]]></category>
		<category><![CDATA[promozione]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[thinkcode]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=718</guid>
		<description><![CDATA[È online da qualche giorno il mio primo screencast pubblicato per thinkcode.tv. L&#8217;argomento è jQuery e nella lezioncina di un&#8217;oretta cerco di affrontare la maggior parte dei temi che possono interessare chi si avvicina per la prima volta a questa libreria. Sul sito è disponibile una preview di 5 minuti (presa circa ad un terzo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://thinkcode.tv"><img class="alignleft size-medium wp-image-720" title="thinkcode" src="http://claudio.cicali.name/wp-content/uploads/2010/02/thinkcode1-300x116.gif" alt="" width="300" height="116" /></a>È online da qualche giorno il mio <a href="http://it.thinkcode.tv/catalogo/introduzione-a-jquery/">primo screencast</a> pubblicato per <a href="http://it.thinkcode.tv">thinkcode.tv</a>. L&#8217;argomento è jQuery e nella lezioncina di un&#8217;oretta cerco di affrontare la maggior parte dei temi che possono interessare chi si avvicina per la prima volta a questa libreria. Sul sito è disponibile una preview di 5 minuti (presa circa ad un terzo della lunghezza totale del video).</p>
<p>Voglio ringraziare thinkcode per l&#8217;opportunità offertami e spero davvero di poter collaborare ancora con loro :)</p>
<blockquote><div>
jQuery sta rapidamente diventando la libreria JavaScript più usata al mondo, per lo sviluppo di applicazioni web interattive e dinamiche. In questo screencast di poco più di un&#8217;ora, Claudio Cicali ci guida nell&#8217;apprendimento dei concetti di base, mostrando il come e il perché dell&#8217;uso della libreria, a partire dalla sua storia, per finire a parlare delle best practice, passando per la manipolazione del DOM, la gestione degli eventi e Ajax. Si tratta di uno screencast indispensabile per lo sviluppatore moderno.
</div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2010/02/mio-screencast-su-thinkcode-tv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery vs document.getElementById</title>
		<link>http://claudio.cicali.name/post/2010/01/jquery-vs-document-getelementbyid/</link>
		<comments>http://claudio.cicali.name/post/2010/01/jquery-vs-document-getelementbyid/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 16:55:30 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=601</guid>
		<description><![CDATA[With the first post of the year, I&#8217;d like to present the results of a (very) simple and unreliable performance benchmark. The question I would like to give an answer to was: giving the selector of an HTML ID, how much the document.getElementById is faster than the jQuery selection? Well &#8211; as it tourned out [...]]]></description>
			<content:encoded><![CDATA[<p>With the first post of the year, I&#8217;d like to present the results of a (very) simple and unreliable performance benchmark.</p>
<p>The question I would like to give an answer to was: giving the selector of an HTML ID, how much the document.getElementById is faster than the jQuery selection? Well &#8211; as it tourned out &#8211; it is astonishingly faster.</p>
<p>The test run over 100000 calls to the same minimal function and then collect the result in millisecond. For each test, 8 runs were made and the greatest and lowest value were dropped before the average time was computed. Every test was ran against Firefox 3.5.6, Firefox 3.6b5, Chrome 4, Safari 4, IE 8 and Opera 10.10.</p>
<p>&#8220;Why don&#8217;t run the test also against the soon to be released jQuery 1.4.0?&#8221;, I asked myself. So I did.</p>
<p>The test code itself goes along these lines:</p>
<pre class="brush: jscript; title: ; notranslate">
function benchmark(f, result) {
  var start = new Date();
  f();
  var stop = new Date();
  document.getElementById(result).innerHTML = stop - start;
}

$(&quot;#start&quot;).click(function() {
    benchmark(function() {
      var e;
      for(n=0; n &lt; 100000; n++) {
        e = $('#testID');
// or  e = document.getElementById('#testID');
      }
    }, &quot;result&quot;);
    return false;
});
</pre>
<p>And here comes the whole picture:</p>
<p style="text-align: center;"><a href="http://claudio.cicali.name/wp-content/uploads/2010/01/jqueryspeed.jpg"><img class="aligncenter size-medium wp-image-602" title="jqueryspeed" src="http://claudio.cicali.name/wp-content/uploads/2010/01/jqueryspeed.jpg" alt="" /></a></p>
<p style="text-align: left;">What did I learn?</p>
<ul>
<li>when possible, use the document.getElementById() native function (or a simple helper wrapper) instead of the jQuery method</li>
<li>IE and Firefox 3.5 are embarassingly slow</li>
<li>Chrome and Safari are embarassingly fast</li>
<li>Firefox 3.6 is gaining a lot of performance points, but still&#8230;</li>
<li>Opera 10.10 is good, but the gEBI performances are very bad</li>
<li>Chrome is loosing something with jQuery 1.4. Well, it seems so. I don&#8217;t think this is real.</li>
<li>The best performance gain with jQuery 1.4 would be for IE8</li>
</ul>
<p>Remember that this test is extremely unreliable and of indicative quality only. Do not take any assumption for granted :)</p>
<p><strong>ADDENDUM</strong>: as a follow up to a <a href="http://friendfeed.com/caludio/ef460e48/jquery-vs-document-getelementbyid">discussion on Friendfeed</a>, I ran one more test. This time I&#8217;ve used a wrapper like this one:</p>
<pre class="brush: jscript; title: ; notranslate">

function $getId(id) {
  $(document.getElementById(id));
}

$(&quot;#startWRAPPER&quot;).click(function() {
    benchmark(function() {
      var e;
      for(n=0; n &lt; 100000; n++) {
        e = $getId('testID');
      }
    }, &quot;result&quot;);
    return false;
});
</pre>
<p>When you need an ID, as a jQuery object, using the wrapper can certainly give you same benefits. The test has been ran with the latest jQuery 1.4 version.</p>
<p><a href="http://claudio.cicali.name/wp-content/uploads/2010/01/jqueryspeed22.jpg"><img class="aligncenter size-full wp-image-613" title="jqueryspeed2" src="http://claudio.cicali.name/wp-content/uploads/2010/01/jqueryspeed22.jpg" alt="" width="428" height="168" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2010/01/jquery-vs-document-getelementbyid/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Upload progressivo in PHP con APC e JavaScript &#8211; Parte 1</title>
		<link>http://claudio.cicali.name/post/2009/10/upload-progressivo-in-php-con-apc-e-javascript-parte-1/</link>
		<comments>http://claudio.cicali.name/post/2009/10/upload-progressivo-in-php-con-apc-e-javascript-parte-1/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 16:03:55 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=525</guid>
		<description><![CDATA[Prima parte (leggi la seconda parte, leggi la terza parte) In questo articolo, suddiviso per motivi di lunghezza in più parti, cercherò di  spiegare il sistema tramite il quale sia possibile monitorare l&#8217;upload di un file in modo da visualizzare all&#8217;utente lo stato di avanzamento dell&#8217;operazione. Questi articoli non sono vogliono essere un semplice how [...]]]></description>
			<content:encoded><![CDATA[<p>Prima parte (<a href="../post/2009/10/upload-progressivo-in-php-con-apc-e-javascript-parte-2/">leggi la seconda parte</a>, <a href="../post/2009/10/upload-progressivo-in-php-con-apc-e-javascript-parte-3/">leggi la terza parte</a>)</p>
<p>In questo articolo, suddiviso per motivi di lunghezza in più parti, cercherò di  spiegare il sistema tramite il quale sia possibile monitorare l&#8217;upload di un file in modo da visualizzare all&#8217;utente lo stato di avanzamento dell&#8217;operazione.</p>
<p>Questi articoli non sono vogliono essere un semplice how to, quando invece una dettagliata analisi delle problematiche inerenti a questo sistema diventato ormai di sempre più comune utilizzo sui siti web.</p>
<p>La complessità di tutto questo &#8220;giochino&#8221; è da imputare principalmente al linguaggio  server side che utilizzerò in questi articoli: il PHP.</p>
<p>Vediamo subito il perché.</p>
<p>A grandi linee, l&#8217;upload di un file dal browser al server funziona semplicemente così: l&#8217;utente seleziona il file dal proprio computer e poi invia la form. In quel momento il browser inizia una trasmissione dati con lo script che riceve i dati della form, inviandogli senza soluzione di continuità i byte che compongono il file in fase di trasmissione.</p>
<p>Lato server il PHP dal momento che inizia la ricezione del file, &#8220;appoggia&#8221; su un file temporaneo i dati che stanno arrivando finché la trasmissione non sarà terminata o cancellata. Nel secondo caso il PHP provvederà a cancellare il file temporaneo e tutto finisce lì. Nel caso di ricezione avvenuta, lo script riprenderà il controllo e sarà in grado di copiare il file temporaneo dove meglio crede (move_uploaded_file(), non dico certo niente di nuovo.)</p>
<p>Non esistono sistema &#8220;nativi&#8221; da parte del browser per capire quanti byte ha al momento trasmesso. È possibile utilizzare dei trucchetti lato client che prevedono l&#8217;utilizzo di un piccolo Flash movie che fa da &#8220;gateway&#8221; usando Flash stesso per aprire il socket di trasmissione dati verso il server. In tal caso sarà lo stesso Flash a fornire le indicazioni che ci interessano e la gestione è assai più semplice. Tuttavia l&#8217;approccio (usato in tantissime soluzioni di alto livello) non è scevro da problemi e in questa sede non ci interessa.</p>
<p>Senza usare Flash, dunque, quello che occorre fare è chiedere al server continuamente a che punto è arrivato leggendo il file temporaneo che sta crescendo man mano che la trasmissione procede.</p>
<p>Questa richiesta verrà fatta dunque via Ajax, chiedendo ad un altro script PHP lo stato di avanzamento del file xxxyyyzzz&#8230;</p>
<p>Sembra facile, ma non è.</p>
<p>Il problema nasce dal fatto, come dicevo poco fa, che stiamo usando PHP. Soltanto dalla versione 5.2 in poi è possibile infatti usare un sistema per chiedere al PHP a che punto è con l&#8217;upload. Prima, non esisteva modo&#8230; impossibile sapere il nome del file temporaneo da un altro processo, né tantomeno dal processo PHP che lo sta generando.</p>
<p>Dalla versione 5.2 è stato introdotto un &#8220;hook&#8221; che permette alle estensioni PECL del php di <a href="http://www.ibm.com/developerworks/library/os-php-v525/index.html">intercettare le fasi di upload</a> di un file (no, non si può fare direttamente da PHP). Ovviamente non è che adesso ci mettiamo lì, con il nostro compilatore C a scrivere la nostra fantastica estensione che usa quell&#8217;hook. Questo lavoro, fortunatamente, è già stato fatto da qualcuno.</p>
<p>Credo che la maggior parte degli sviluppatori in PHP siano a conoscenza di <a title="Alternative PHP Cache" href="http://www.php.net/apc/">APC</a>. Il suo mestiere è duplice. In primis è un cosidetto sistema di &#8220;opcache&#8221;, ovvero permette al PHP di salvarsi i nostri script &#8220;precompilati&#8221; (passatemi il termine), in modo da velocizzarne le esecuzioni successive (stessa cosa di eAccelerator o xcache, se conoscete già queste alternative). In secundis, mette a disposizione agli script PHP un buffer di memoria ad accesso rapido, per salvare al suo interno delle informazioni magari lette da un sottostitema più lento (dbms, per esempio). È più o meno quello che fa memcache, solo che in questo caso non c&#8217;è bisogno di un servizio esterno che giri. APC infatti è un&#8217;estensione del PHP e come tale, una volta che questa sia stata compilata e caricata dal PHP, è disponibile da subito.</p>
<p>Fin qui &#8211; credo &#8211; nessuna grossa novità.</p>
<p>La cosa interessante è che, dalla versione PHP 5.2, APC implementa appunto la gestione di quel famoso &#8220;hook&#8221; per il monitoraggio dell&#8217;upload, offrendo un sistema ai normali script PHP per interrogare l&#8217;andamento della creazione del nostro file. Non solo: tramite il servizio di APC sarà così possibile controllare se il nostro file ha terminato il caricamento, se il caricamento è stato annullato dall&#8217;utente o da un problema di rete e fare dei semplici calcoli per sapere anche il &#8220;rate&#8221; di trasmissione in kbyte.</p>
<p>Nella seconda parte dell&#8217;articolo vedremo come fare ad implementare un sistema del genere, usando &#8220;solo&#8221; HTML, PHP e un po&#8217; di sano JavaScript.</p>
<p>Nel frattempo, assicuratevi di avere a disposizione APC (perlomeno) sulla vostra macchina di sviluppo. In Ubuntu è questione di &#8220;sudo apt-get install php-apc&#8221; e far ripartire Apache. La configurazione, eventualmente, la troverete in<br />
/etc/php5/apache2/conf.d/apc.ini</p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2009/10/upload-progressivo-in-php-con-apc-e-javascript-parte-1/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Quello che si impara da una linea di codice</title>
		<link>http://claudio.cicali.name/post/2009/07/quello-che-si-impara-da-una-linea-di-codice/</link>
		<comments>http://claudio.cicali.name/post/2009/07/quello-che-si-impara-da-una-linea-di-codice/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 08:28:24 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[How to & Tips]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=478</guid>
		<description><![CDATA[Ieri ho avuto necessità di mettere il cursore sul primo campo di una form, automaticamente all&#8217;apertura della pagina. Il primo campo però che non contenesse la classe &#8220;hasDatepicker&#8221; (un widget di jQueryUI). Tagliando qui e là alla fine credo di aver risolto con una sola riga di codice che, aldilà del suo scopo, contiene diverse [...]]]></description>
			<content:encoded><![CDATA[<p>Ieri ho avuto necessità di mettere il cursore sul primo campo di una form, automaticamente all&#8217;apertura della pagina. Il primo campo però che non contenesse la classe &#8220;hasDatepicker&#8221; (un widget di <a href="http://jqueryui.com">jQueryUI</a>). Tagliando qui e là alla fine credo di aver risolto con una sola riga di codice che, aldilà del suo scopo, contiene diverse cosette che vorrei condividere. Il codice (che usa jQuery) è questo:</p>
<p><pre class="code">
var fi;
(fi = $('form :input').not(".hasDatepicker")) &#038;&#038; fi.length &#038;&#038; fi[0].focus();
</pre>
<p>
In italiano si legge così: prendi tutti gli elementi input della form, elimina quelli che hanno classe &#8220;hasDatepicker&#8221;. Dei risultanti (se esistono) prendi il primo e rendilo attivo.</p>
<p>
(se hai in mente un modo per ottimizzare ancora, ti prego di leggere la nota alla fine del post)
</p>
<p>Cosa possiamo rilevare, di interessante, da una sola righetta di codice?</p>
<ul>
<li>Il one liner usa la tecnica del &#8220;corto circuito&#8221;, visto che JavaScript ce lo permette: un&#8217;espressione viene valutata da sinistra verso destra e l&#8217;elaborazione viene interrotta appena si raggiunge un valore che non può cambiare. In questo caso, la sequenza di &#8220;&#038;&#038;&#8221; fa sì che appena una delle tre espressioni è falsa, la valutazione viene interrotta (in questo caso quella che ci interessa in particolare è la seconda, che in pratica verifica se è stato trovato almeno un elemento).</li>
<li>La prima parte dell&#8217;espressione (l&#8217;assegnamento) deve essere racchiusa tra parentesi perché altrimenti non sarebbe sintatticamente valida. In questo modo invece si forza l&#8217;interprete a valutarla in maniera <em>atomica</em>, so to speak. Le parentesi come &#8220;aiutino&#8221; sintattico si trovano spesso, in JavaScript.</li>
<li>jQuery oltre ai selettori standard e quelli usabili anche tramite <a href="http://www.w3.org/TR/selectors-api/">querySelectorAll</a>, ne ha <a href="http://docs.jquery.com/Selectors">alcuni suoi</a> molto comodi. Uno di questi è appunto &#8220;:input&#8221; che permette di selezionare tutti gli elementi input di una form ma anche select e textarea in un colpo solo.</li>
<li>Ottenuta una selezione di elementi (sempre assimilabile ad un array anche se la selezione è vuota, come si vede dalla seconda e terza parte dell&#8217;espressione), è possibile filtrare via degli elementi non voluti tramite il metodo &#8220;not&#8221;. Esiste anche il metodo controparte filter(), che permette di elminare gli elementi che NON hanno corrispondenza con il suo parametro/i.</li>
</ul>
<p>Nota: probabilmente c&#8217;è un modo ancora più corto per fare questa operazione&#8230; la prima cosa che mi viene in mente è usare l&#8217;attribute selector, in modo da scrivere qualcosa come $(&#8220;form :input[class!=hasDatepicker]:first&#8221;). Quello che non mi piace molto, in questo contesto, è che l&#8217;operatore &#8220;!=&#8221; di quel selettore, <em>ritorna true</em> anche quando l&#8217;attributo &#8220;class&#8221; dell&#8217;elemento non è presente del tutto, per cui la selezione potrebbe essere &#8220;prendi il primo input della form che non ha una classe&#8221; che non è esattamente quello che volevo (dovrei fare delle prove, in effetti). Inoltre, probabilmente, questo articoletto non sarebbe mai nato ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2009/07/quello-che-si-impara-da-una-linea-di-codice/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Namespace anonimi in JavaScript</title>
		<link>http://claudio.cicali.name/post/2009/07/namespace-anonimi-in-javascript/</link>
		<comments>http://claudio.cicali.name/post/2009/07/namespace-anonimi-in-javascript/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 13:08:44 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[How to & Tips]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=469</guid>
		<description><![CDATA[Questo brevissimo articolo potrebbe essere sicuramente un addendum ad un mio precedente articolo. La tecnica dei &#8220;namespace anonimi&#8221; (il nome credo di averlo appena inventato e mi scuso se non fosse formalmente correttissimo) è utile nel caso si volesse aggiungere uno snippet di codice JavaScript all&#8217;interno di un template per fare una cosa molto specifica [...]]]></description>
			<content:encoded><![CDATA[<p>
Questo brevissimo articolo potrebbe essere sicuramente un addendum ad <a href="http://claudio.cicali.name/post/2009/03/javascript-module-pattern/">un mio precedente articolo</a>.
</p>
<p>La tecnica dei &#8220;namespace anonimi&#8221; (il nome credo di averlo appena inventato e mi scuso se non fosse formalmente correttissimo) è utile nel caso si volesse aggiungere uno snippet di codice JavaScript all&#8217;interno di un template per fare una cosa molto specifica che non merita di essere inserita all&#8217;interno dei file JavaScript di tutta l&#8217;applicazione. Ne ho avuto bisogno recentemente quando ho dovuto far scomparire un campo di una form se il valore di una certa SELECT non fosse impostato. Avevo bisogno di una variable di appoggio, ma ovviamente non volevo che questa finisse nell&#8217;oggetto globale.
</p>
<p>
Senza indugiare oltre, ecco il codice (l&#8217;ho diviso in tre passi per chiarezza espositiva):
</p>
<pre class="code">
/* Passo 1.
   Definiamo una funzione anonima per creare un namespace;
   è necessario racchiudere la definizione all'interno di una coppia
   di parentesi, o il parser JavaScript darebbe errore */

(function() {
});

/* Passo 2.
   Inseriamo all'interno del nostro "namespace" il codice che ci
   interessa eseguire. Si noti che la variable $s in questo modo
   non è globale ma rimane chiusa nel namespace (che era quello
   che volevamo ottenere) */

(function() {
  var $s = $('#generatingActionId');
  if ($s.val() == '') {
    $('#generatingActionRef-label').hide();
  }
});

/* Passo 3.
   Infine "attiviamo" il nostro codice, eseguendo la funzione anonima;
   notare la coppia di parentesi direttamente alla fine della definizione
   della funzione */

(function() {
  var $s = $('#generatingActionId');
  if ($s.val() == '') {
    $('#generatingActionRef-label').hide();
  }
})();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2009/07/namespace-anonimi-in-javascript/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lisearch: un plugin jquery per una diversa usabilità delle form di ricerca</title>
		<link>http://claudio.cicali.name/post/2009/03/lisearch-un-plugin-jquery-per-una-diversa-usabilita-delle-form-di-ricerca/</link>
		<comments>http://claudio.cicali.name/post/2009/03/lisearch-un-plugin-jquery-per-una-diversa-usabilita-delle-form-di-ricerca/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 18:32:36 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Annunci]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[hth]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=369</guid>
		<description><![CDATA[Ammetto che trovare il titolo mi è costato quasi di più che scrivere il plugin; comunque: questo plugin per jQuery permette di trasformare una form di ricerca (o qualsiasi altra form simile) in modo da renderla di più immediato ed agile utilizzo secondo un paradigma che, lo ammetto, mi sono un po' inventato io.]]></description>
			<content:encoded><![CDATA[<p>Ammetto che trovare il titolo mi è costato quasi di più che scrivere il plugin; comunque: questo plugin per jQuery permette di trasformare una form di ricerca (o qualsiasi altra form simile) in modo da renderla di più immediato ed agile utilizzo secondo un paradigma che, lo ammetto, mi sono un po&#8217; inventato io.</p>
<p>Il sistema parte dal presupposto che una form da modificare sia composta da:</p>
<ul>
<li>un campo di testo</li>
<li>una lista di opzioni entro le quali cercare (devono essere <strong>radio button</strong>)</li>
<li>un tasto di invio.</li>
</ul>
<p>L&#8217;utente, normalmente, scrive il testo da cercare, seleziona tramite radio button dove vuole effettuare la ricerca (lo <em>scope</em> della stessa) e preme il pulsante. Questo plugin trasforma i radio button in una lista che apparirà direttamente sotto il campo di ricerca non appena il campo di input prenderà il focus. Una volta scritto il testo da cercare, l&#8217;utente potrà cliccare direttamente lo scope dentro la lista per effettuare la ricerca. Il plugin crea la lista in modo da essere anche navigabile da tastiera, tramite tab, in quanto tutti gli item sono costituiti da elementi A; così, per una massima velocità di utilizzo, si scrive il testo da cercare, si preme tab e poi invio.</p>
<p>Un paio di immagini dovrebbero chiarire meglio il concetto.</p>
<p>Questa è la form di &#8220;partenza&#8221;, senza il plugin attivo:</p>
<p><img class="aligncenter size-full wp-image-370" title="lisearch0" src="http://claudio.cicali.name/wp-content/uploads/2009/03/lisearch0.png" alt="lisearch0" width="382" height="140" />Una volta attivato il plugin, la form viene &#8220;collassata&#8221; in questa:</p>
<p><img class="aligncenter size-full wp-image-371" title="lisearch1" src="http://claudio.cicali.name/wp-content/uploads/2009/03/lisearch1.png" alt="lisearch1" width="389" height="100" />Una volta che il cursore di sia portato nel campo di ricerca, ecco cosa succederà:</p>
<p><img class="aligncenter size-full wp-image-372" title="lisearch2" src="http://claudio.cicali.name/wp-content/uploads/2009/03/lisearch2.png" alt="lisearch2" width="383" height="155" /></p>
<p>I radio button sono stati trasformati in una pseudo select box a discesa, navigabile tramite tab o mouse (non sono attivi i tasti cursore, perché l&#8217;impegno necessario è forse troppo rispetto all&#8217;effettiva utilità del plugin).</p>
<p>La form di esempio è questa; si può osservare come si usa il plugin:</p>
<pre>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;&lt;/title&gt;
&lt;link rel="stylesheet" href="lisearch.css"&gt;
&lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="lisearch.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
$(function() {
  $('.scopes').lisearch();
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form&gt;
  &lt;ul&gt;
    &lt;li&gt;
      &lt;label&gt;Frase da cercare&lt;/label&gt;
      &lt;input type="text" id="q" name="q"&gt;
    &lt;/li&gt;
    &lt;li id="scopes" class="scopes"&gt;
      &lt;input type="radio" name="scope" value="italia"&gt;&lt;label&gt;In italia&lt;/label&gt;
      &lt;input type="radio" name="scope" value="europa"&gt;&lt;label&gt;In europa&lt;/label&gt;
      &lt;input type="radio" name="scope" value="mondo"&gt;&lt;label&gt;Nel mondo&lt;/label&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;input type="submit" value="Cerca"&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Insieme al plugin viene fornito un file CSS minimale che può servire per capire meglio gli elementi che vengono creati e dunque per poterli stilare. Ovviamente niente può sostituire Firebug, in questo contesto.</p>
<p>I test di funzionamento sono stati effettuati con jQuery 1.3.2 (l&#8217;ultimissima versione al momento in cui scrivo), ma credo che possa funzionare anche con versioni più vecchie.</p>
<p><a href="http://web20.it/misc/lisearch/lisearch.tar.gz">Scarica il plugin</a> oppure <a href="http://web20.it/misc/lisearch">prova una demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2009/03/lisearch-un-plugin-jquery-per-una-diversa-usabilita-delle-form-di-ricerca/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Inizializzazione delle variabili JavaScript con l&#8217;operatore &#124;&#124;</title>
		<link>http://claudio.cicali.name/post/2009/01/inizializzazione-delle-variabili-javascript-con-loperatore/</link>
		<comments>http://claudio.cicali.name/post/2009/01/inizializzazione-delle-variabili-javascript-con-loperatore/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 00:13:34 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=5</guid>
		<description><![CDATA[Il JavaScript permette l’operazione di inizializzazione delle variabili utilizzando l’operatore logico &#124;&#124;. Pur essendo molto comodo, occorre prestare molta attenzione a come lo si usa. Vediamo qualche esempio. Questa sintassi è utilizzata talvolta in concomitanza con un’altra caratteristica del linguaggio, ovvero quella di non avere una sintassi esplicita per i valori di default dei parametri [...]]]></description>
			<content:encoded><![CDATA[<p>Il JavaScript permette l’operazione di inizializzazione delle variabili utilizzando l’operatore logico ||. Pur essendo molto comodo, occorre prestare molta attenzione a come lo si usa. Vediamo qualche esempio.</p>
<p>Questa sintassi è utilizzata talvolta in concomitanza con un’altra caratteristica del linguaggio, ovvero quella di non avere una sintassi esplicita per i valori di default dei parametri delle funzioni; in JavaScript, infatti, TUTTE le funzioni sono a numero di argomenti variabile.</p>
<p>In tale contesto il test che si può effettuare è il seguente</p>
<pre class="code">foo();

function foo(bar) {
  bar = bar || "test";
  alert(bar);
}</pre>
<p>In tal caso vedremo ovviamente un bel alert con “test”.</p>
<p>Purtroppo, e qui sta l’inghippo, l’operatore || è sensibile a tutto ciò che in JavaScript è <em>falsy</em> o <em>truthy</em>, ovvero a tutti quei valori che l’inteprete in fase di test di un’espressione riduce al valore booleano true o false.</p>
<pre class="code">foo();
foo(false);
foo(0);
foo(null);
foo("");
function foo(bar) {
  bar = bar || "test";
  alert(bar);
}</pre>
<p>In tutti questi casi vedremo spuntare un bel “test” nel messaggio di alert, e probabilmente non è esattamente quello che intuitivamente ci saremmo aspettati.</p>
<p>Se vogliamo fare un test robusto per la presenza o meno del nostro parametro, allora occorre ricorrere al classico (meno elegante e un po’ cervellotico):</p>
<pre class="code">function foo(bar) {
  if (typeof bar == 'undefined') {
    bar = "test";
  }
  console.log(test);
}</pre>
<p>Da notare una piccola perversione: nel caso in cui “bar” non venga passato (e sia dunque “undefined”), l’inteprete avrà comunque definito il simbolo “bar” per lo <strong>scope locale della funzione</strong> e non come simbolo globale</p>
<p>Test effettuati su FF 3</p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2009/01/inizializzazione-delle-variabili-javascript-con-loperatore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un articolo sulle closure JavaScript</title>
		<link>http://claudio.cicali.name/post/2007/12/un-articolo-sulle-closure-javascript/</link>
		<comments>http://claudio.cicali.name/post/2007/12/un-articolo-sulle-closure-javascript/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 14:43:43 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[articolo]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pubblicazione]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=131</guid>
		<description><![CDATA[Stacktrace has just published one article of mine about JavaScript Closures.]]></description>
			<content:encoded><![CDATA[<p><a href="http://stacktrace.it/">Stacktrace</a> has just published <a href="http://stacktrace.it/articoli/2007/12/javascript-closures/">one article of mine about JavaScript Closures</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2007/12/un-articolo-sulle-closure-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An introduction to the JavaScript Object Model</title>
		<link>http://claudio.cicali.name/post/2007/07/an-introduction-to-the-javascript-object-model/</link>
		<comments>http://claudio.cicali.name/post/2007/07/an-introduction-to-the-javascript-object-model/#comments</comments>
		<pubDate>Sun, 15 Jul 2007 14:48:12 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=133</guid>
		<description><![CDATA[JavaScript has no “Class” concept in the mainstream OOP point of view. You don’t define a “class” and instance objects that are a “phisical” representation of that. Technically, JavaScript is a “prototype based” language. This brings some nice things but also makes all the “object programming” experience in JavaScript full of traps, misunderstandings and weirdness… [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>JavaScript has no “Class” concept in the mainstream OOP point of view. You don’t define a “class” and instance objects that are a “phisical” representation of that. Technically, JavaScript is a <a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Class-Based_vs._Prototype-Based_Languages">“prototype based” language</a>. This brings some nice things but also makes all the “object programming” experience in JavaScript full of traps, misunderstandings and weirdness…</p>
<p>This little series of articles (2 or 3) is my personal attempt to clear this mess a little. A lot of other “JavaScript object programming tutorial” yet exist, and surely many of them are more technically accurate then mine. I only hope to put this problem into a more “human friendly” point of view.</p></div>
<div>
<p>Let me begin with a very simple example: from one point of view, you can think of objects in JavaScript as they were simple “containers”. You aggregate functions (methods), and variables (properties) under the same umbrella. You may or MAY NOT give that umbrella a real handle (name) to work with it. Let’s walk through this:</p>
<pre class="source">var one_object = {};</pre>
<p>This creates an “anonymous” empty object and assigns it to the “one_object” variable.</p>
<p>Now “one_object” can really behave like an object. As you may know, you can for example brutally add properties to it:</p>
<pre class="source">var one_object = {};
one_object.property_one="Hello";
one_object.property_two="World";</pre>
<p>You can even add methods:</p>
<pre class="source">one_object.method_one = function() {
  alert(this.property_one)
}
one_object.method_two = function() {
  alert(this.property_two)
}</pre>
<p>Very simple and straightforward. You have the “one_object” umbrella that you can use as a… NAMESPACE. Put everything into it, without the fear of potential name clashes (and you always should).</p>
<p>What I’d like to note here is that “one_object” is the one and only representative of its species… There’re no other way to instantiate another object with the same characteristics (yes, you could COPY the object itself; but it is not a creational process the way OO learned to us). We have USED and MODIFIED/extended a real object, not a “class”.</p>
<p>By the way, you should know that just another syntax exists to create an object that way:</p>
<pre class="source">var one_object = {
  property_one: "Hello",
  property_one: "World",
  method_one: function() {
    alert(this.property_one)
  },
  method_two: function() {
    alert(this.property_two)
  }
};</pre>
<p>You can pass “anonymous” objects as a parameter to a function:</p>
<pre class="source">killZombies({weapon: "flame thrower", power_level: 4});</pre>
<h2>A step further</h2>
<p>But, what is exactly a “{}”?</p>
<p>{} is a shortcut for “new Object()” and…</p>
<p>“Wait wait wait!”, I hear you, “there’s a NEW construct there! So, Object is CLASS, ah-ah!”</p>
<p>OK, spotted… the “new” construct it’s really something that could confuse.  Let me start from the beginning…</p>
<p>As I said, objects are elements that are ready to use with no big fuss (a pair of {}), but this is true only when you need the more generic object possible (a container, remember?).  But you might need to create a MODEL for an object so that you can create instances of it,  at your will. Do you need many Cars? Build a generic Car object and then replicate it for  every Car you’ll need.</p>
<p>We have then to move away from the simple “objects are containers surrounded by {}” model, and think of a way to build a generic, specialized model to replicate at our will. The key, here, is the word CONSTRUCTOR. For every custom objects you’re about to create, you have to FIRST create the constructor. In a Class oriented object model, the constructor is part of the class… in JavaScript, the constructor IS the object.</p>
<p>Sintactically, a constructor is only a function, and its name will name the object too.</p>
<p>Speaking of cars, we could write the simplest constructor ever:</p>
<pre class="source">function Car() {
}</pre>
<p>(I use the capital C just for convention: JavaScript give no meaning to the case of variable names; but it’s case sensitive)</p>
<p>OK. So how can I create an object that is a copy of a Car? Use the “new” keyword and call the constructor:</p>
<pre class="source">function Car() {
}
var car = new Car();</pre>
<p>In this oversimplified and useless example, we are telling JavaScript: “Listen, I need an object that I’d like to name ‘car’. Build it calling the Car() function”.</p>
<p>But isn’t Car() a “normal” function? Yes, it is. Indeed, it’s the context in which you use it that differentiate its… function. Let’s see:</p>
<p>Everyone knows that in an OOP world, “this” (or “self”) represents the current instance of a class, inside its definition. Let’s use “this” to show the aforementioned behaviour:</p>
<pre class="source">function Car() {
  alert(this);
}

var car = new Car()
Car();</pre>
<p>In this example, we try to see what “this” is, first calling the function as the constructor of a car, then calling the function by itself. If you run this example, you’ll see first an “object Object” and then an “object Window”.</p>
<p>If you use Car() as a constructor “this” is an instance of an Object (namely Car), while calling it by itself it will be an instance of a Window object.</p>
<p>Interesting. This experiment will lead us to the following conclusion (so far):</p>
<ul>
<li>every object YOU create, will always descend from the root object “Object”</li>
<li>JavaScript is not aware of the name of the object YOU create, and will say it’s simply an Object copy</li>
<li>every function belongs to an outer, big object that is a copy of a Window object (that is the “window” object itself, of course, and it will descend from the Object too)</li>
</ul>
<p>Let’s do something more useful, adding a property and a method to our simple Car:</p>
<pre class="source">function Car(color) {
  this.color = color;
  this.run = function() {
    alert("Global warming++");
  }
}

var car1 = new Car('red')
var car2 = new Car('blu')
var car3 = new Car('green')</pre>
<p>Nothing really strange here; you can see how to pass a parameter to the contructor and using it. We then create 3 object all of the same type. In the constructor we are defining the characteristics of the Car model, adding something to “this”…</p>
<p>And this is enough for this first part of the discussion about JavaScript model. What we’ll see next will be a more seriuos definition of the “descend” word I used, and some advanced tecnique you may have sometimes seen but you were too afraid to ask :)</p></div>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2007/07/an-introduction-to-the-javascript-object-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

