<?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>Consulenza-Web.com &#187; jQuery</title>
	<atom:link href="http://www.consulenza-web.com/category/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.consulenza-web.com</link>
	<description>Blog di Marco Pegoraro su Consulenza Web ed Informatica, Programmazione Web e realizzazione di Siti Web Accessibili.</description>
	<lastBuildDate>Mon, 30 Jan 2012 08:39:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MediaTable jQuery Plugin</title>
		<link>http://www.consulenza-web.com/2012/01/mediatable-jquery-plugin/</link>
		<comments>http://www.consulenza-web.com/2012/01/mediatable-jquery-plugin/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 14:24:17 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Usabilità]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[media query]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[tabella]]></category>
		<category><![CDATA[table]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=559</guid>
		<description><![CDATA[Oggi mi sono imbattuto in un ottimo articolo di FilamentGroup riguardante l&#8217;usabilità di una tabella dati su schermi di piccole dimensioni. (link articolo) La soluzione proposta consiste nel definire due o più gruppi di colonne assegnando varie classi (Es: essential, optional, etc..) quindi utilizzare delle media-query CSS per visualizzare e nascondere gruppi di colonne in [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi mi sono imbattuto in un ottimo articolo di <a title="Filament Group WebSite" href="http://filamentgroup.com/" class="aga aga_4" target="_blank">FilamentGroup</a> riguardante l&#8217;<strong>usabilità di una tabella</strong> dati su <strong>schermi di piccole dimensioni</strong>. (<a title="Responsive table solution by Filament Group" href="http://filamentgroup.com/lab/responsive_design_approach_for_complex_multicolumn_data_tables/" class="aga aga_5" target="_blank">link articolo</a>)</p>
<p>La soluzione proposta consiste nel definire due o più <strong>gruppi di colonne</strong> assegnando varie classi (Es: essential, optional, etc..) quindi utilizzare delle <strong>media-query CSS</strong> per <strong>visualizzare e nascondere</strong> gruppi di colonne in base alle dimensioni del display.</p>
<p>Si tratta dunque di un esempio di <a title="Web Design Responsivo e Adattivo" href="http://www.consulenza-web.com/2011/07/compromesso-vincente/"  target="_blank">design responsivo</a>.</p>
<p>Trovando la soluzione molto interessante ho costruito un <strong>plugin jQuery</strong> che rende <strong>estremamente semplice</strong> realizzare sulle proprie pagine web quanto spiegato nell&#8217;articolo.</p>
<p style="text-align: center; font-size: 1.4em;"><a title="MediaTable jQuery Plugin Demo | Responsive tables with jQuery" href="http://consulenza-web.com/jquery/MediaTable"  target="_blank">&gt;&gt;&gt; Vai alla demo! &lt;&lt;&lt;</a></p>
<h2>MediaTable in Azione:</h2>
<p>In questo primo screenshoot vediamo una tabella di cui <strong>sono visualizzate solamente le colonne veramente importanti</strong>. Siamo su di uno schermo di piccole dimensioni!</p>
<p><a href="http://www.consulenza-web.com/wp-content/uploads/2012/01/media-table-001.jpg" ><img class="size-full wp-image-571" title="MediaTable jQuery Plugin" src="http://www.consulenza-web.com/wp-content/uploads/2012/01/media-table-001.jpg" alt="" width="471" height="184" /></a></p>
<p>Cliccando sul menu &#8220;columns&#8221; (il cui nome è configurabile) si apre un menu contenente l&#8217;<strong>elenco completo delle colonne disponibili</strong> nella tabella. Possiamo <strong>variare a piacere</strong> il numero di colonne visualizzate mettendo in relazione informazioni differenti.</p>
<p>Questo <strong>menu è generato automaticamente</strong>! Il sorgente di questo esempio, come spiegato successivamente, è una semplice tabella dati HTML!</p>
<p><a href="http://www.consulenza-web.com/wp-content/uploads/2012/01/media-table-002.jpg" ><img class="size-full wp-image-572" title="MediaTable jQuery Plugin" src="http://www.consulenza-web.com/wp-content/uploads/2012/01/media-table-002.jpg" alt="" width="471" height="184" /></a></p>
<p style="text-align: center; font-size: 1.4em;"><a title="MediaTable jQuery Plugin Demo | Responsive tables with jQuery" href="http://consulenza-web.com/jquery/MediaTable"  target="_blank">&gt;&gt;&gt; Vai alla demo! &lt;&lt;&lt;</a></p>
<h2>Come si usa MediaTable?</h2>
<p>MediaTable richiede la definizione di una <strong>tabella HTML</strong> definita correttamente ovvero con THEAD e TBODY. Le colonne di intestazione vanno raggruppate per classe in base alla priorità di visualizzazione.</p>
<p>Via CSS si imposteranno dei <strong>breakpoint</strong> su cui definire quali gruppi di colonne visualizzare.<br />
Il plugin costruisce inoltre un menu delle colonne disponibili per consentire una <strong>selezione manuale</strong> esplicita delle colonne da visualizzare.</p>
<p>Il nostro esempio utilizza 3 gruppi di colonne:</p>
<ul>
<li>essential &#8211; visibili su qualunque schermo</li>
<li>optional &#8211; visibili dai 768px (iPad portrait)</li>
<li>n/a &#8211; visibili dai 1024px (iPad landscape)</li>
</ul>
<p>Un&#8217;ulteriore classe &#8220;persist&#8221; è utilizzata per identificare colonne che non sono gestite dal menu. Impostando una colonna con le classi <em>essential</em> e <em>persist</em> essa non potrà mai essere nascosta!</p>
<pre>&lt;table class="mediaTable"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class="essential persist"&gt;Employee&lt;/th&gt;
&lt;th class="essential"&gt;xHTML&lt;/th&gt;
&lt;th class="optional"&gt;HTML5&lt;/th&gt;
&lt;th class="essential"&gt;CSS&lt;/th&gt;
&lt;th class="essential"&gt;JS&lt;/th&gt;
&lt;th class="optional"&gt;jQuery&lt;/th&gt;
&lt;th class="optional"&gt;jQueryUI&lt;/th&gt;
&lt;th&gt;jQuery Mobile&lt;/th&gt;
&lt;th&gt;Sencha Touch&lt;/th&gt;
&lt;th class="essential"&gt;PHP&lt;/th&gt;
&lt;th&gt;PHP (OO)&lt;/th&gt;
&lt;th class="optional"&gt;CakePHP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Marco Pegoraro&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;td class="yes"&gt;y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
....
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</pre>
<p>Il codice javascript per l&#8217;inizializzazione del plugin è estremamente semplice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.mediaTable'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">mediaTable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Tutte le tabelle aventi classe &#8220;mediaTable&#8221; verranno attivate per consentire la selezione dei campi ed il comportamento responsivo rispetto alle dimensioni dello schermo.</p>
<p style="text-align: center; font-size: 1.4em;"><a title="MediaTable jQuery Plugin Demo | Responsive tables with jQuery" href="http://consulenza-web.com/jquery/MediaTable"  target="_blank">&gt;&gt;&gt; Vai alla demo! &lt;&lt;&lt;</a></p>
<h2>Compatibilità:</h2>
<p>Ho testato il plugin sui seguenti sistemi:</p>
<ul>
<li>Mac OsX, Firefox 9.0.1</li>
<li>Mac OsX, Firefox 4.0</li>
<li>Mac OsX, Chrome 16</li>
<li>Mac OsX, Safari 5.1.2</li>
<li>Windows7, IE9</li>
<li>Windows7, IE8, IE7, IE6 (with <a title="CSS media query on IE6, IE7, IE8" href="https://github.com/scottjehl/Respond" class="aga aga_6" target="_blank">respond.js</a> for media-query)</li>
<li>Windows7, Firefox 7.0.9</li>
</ul>
<h2>Fork on GitHub:</h2>
<p>Il plugin è di libera distribuzione!</p>
<p><a title="MediaTable jQuery Plugin" href="https://github.com/thepeg/MediaTable" class="aga aga_7" target="_blank">Link al progetto pubblico su GitHub!</a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F&amp;title=MediaTable+jQuery+Plugin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F&amp;title=MediaTable+jQuery+Plugin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F&amp;title=MediaTable+jQuery+Plugin" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F&amp;title=MediaTable+jQuery+Plugin" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F&amp;title=MediaTable+jQuery+Plugin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+MediaTable+jQuery+Plugin+@+http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fmediatable-jquery-plugin%2F&amp;t=MediaTable+jQuery+Plugin" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2012/01/mediatable-jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struttura di un plugin jQuery</title>
		<link>http://www.consulenza-web.com/2012/01/struttura-di-un-plugin-jquery/</link>
		<comments>http://www.consulenza-web.com/2012/01/struttura-di-un-plugin-jquery/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 17:13:12 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[jquery ui]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[ottimizzazione]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[prestazioni]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=497</guid>
		<description><![CDATA[In questo articolo voglio approfondire alcuni accorgimenti utili a migliorare le prestazioni, l&#8217;utilizzo e l&#8217;organizzazione di un plugin jQuery. Qualunque tipo di funzione/effetto e/o trasformazione del DOM di una pagina web può essere incorporata in un plugin jQuery con lo scopo di migliorare l&#8217;organizzazione del proprio codice Javascript. Invece di un&#8217;accozzaglia di istruzioni generiche avremo [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo voglio approfondire alcuni accorgimenti utili a migliorare le prestazioni, l&#8217;utilizzo e l&#8217;organizzazione di un <strong>plugin jQuery</strong>.</p>
<p>Qualunque tipo di funzione/effetto e/o trasformazione del DOM di una pagina web può essere incorporata in un plugin jQuery con lo scopo di <strong>migliorare l&#8217;organizzazione del proprio codice Javascript</strong>.<br />
Invece di un&#8217;accozzaglia di istruzioni generiche avremo il riferimento ad un set ordinato di plugins.</p>
<p><a title="Codice sorgente completo dell'articolo" href="http://jsbin.com/apojah/14/edit/" class="aga aga_9" target="_blank">http://jsbin.com/apojah/14/edit/</a></p>
<p><span id="more-497"></span></p>
<h2>Wrapper jQuery:</h2>
<p>Il primo accorgimento utile è incorporare il codice del plugin in un <strong>oggetto wrapper</strong> il cui scopo è duplice:</p>
<ol>
<li>isolare il codice del plugin dallo spazio degli script della pagina</li>
<li>utilizzare <strong>$</strong> come riferimento interno a jQuery in modo sicuro</li>
</ol>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
... <span style="color: #660066;">qui</span> va il codice del plugin ...
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Tutte le variabili dichiarate mediante la sintassi &#8220;var&#8221; saranno locali al plugin mentre rimane possibile accedere a variabili globali dichiarate esternamente.</p>
<p>Passare la variabile &#8220;jQuery&#8221; al wrapper rende possibile l&#8217;utilizzo della funzione <strong>$</strong> tipica di jQuery all&#8217;interno del codice del nostro plugin anche in presenza di altri framework esterni (es MooTools).</p>
<h2>Struttura base del plugin:</h2>
<p>Un plugin è un&#8217;estensione di jQuery che agisce su di un <em>contesto</em> formato da un elenco di <em>nodi DOM</em> identificati da una query xPath.</p>
<pre>$('p').hide();</pre>
<p>La precedente istruzione identifica un <em>elenco di nodi DOM</em> composto da tutti i paragrafi (p) presenti nel documento HTML e passa tale contesto alla funzione <em>hide()</em> di jQuery. Tale funzione restituisce il contesto stesso rendendo possibile la concatenazione di più plugins:</p>
<pre>$('p').hide().fadeIn();</pre>
<p>Per questo motivo il codice base del nostro plugin sarà:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    ... <span style="color: #660066;">azioni</span> sul singolo elemento DOM ...
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
&nbsp;
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Viene eseguito un ciclo applicando una funzione ad ogni elemento del contesto. Successivamente il plugin restituisce il contesto stesso per consentire la concatenazione dei plugins come accennato sopra.</p>
<h2>Ottimizziamo il ciclo sul contesto:</h2>
<p>E&#8217; importante capire che in Javascript ogni <em>function()</em> è trattata come un oggetto.<br />
Il codice di questo esempio, seppur molto diffuso, crea un <strong>nuovo oggetto</strong> per ogni elemento di contesto quindi <strong>incide significativamente sulla memoria e sulla prestazioni</strong> del plugin stesso.</p>
<p>Possiamo <strong>ottimizzare</strong> il tutto spostando la logica applicata al singolo elemento in una funzione esterna locale al wrapper del plugin:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Metodo locale utilizzato dal plugin jQuery sugli elementi DOM
   *
   */</span>
  <span style="color: #003366; font-weight: bold;">var</span> __loop <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Plugin - Estensione jQuery
   */</span>
  $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Applico la logica agli elementi del contesto (DOM)</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span>__loop<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Mantengo la possibilità di concatenare plugins.</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// EndOf: &quot;customPlugin()&quot; ###</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>In riga <em>#19</em> applichiamo la funzione <em>__fn()</em> che è definita esterna al plugin ma localmente al wrapper creato. In questo modo Javascript utilizzerà sempre il medesimo oggetto passando di volta in volta dati differenti.</p>
<p>Questo concetto è estremamente importante in quanto con jQuery è utilizzo comune passare nuove funzioni come parametri di metodi applicati ad elementi DOM. Aver cura di definire tali funzioni (solitamente callback) in modo esplicito nel wrapper del plugin è fondamentale per migliorare le prestazioni del nostro codice.</p>
<h2>Configurazione del Plugin:</h2>
<p>Praticamente il 100% dei plugins jQuery utilizzano il primo parametro passato come oggetto di configurazione interna.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">customPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
speed<span style="color: #339933;">:</span><span style="color: #3366CC;">'fast'</span><span style="color: #339933;">,</span>
color<span style="color: #339933;">:</span><span style="color: #3366CC;">'red'</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Una configurazione classica consiste in un oggetto le cui proprietà sono utilizzate dalla logica interna al plugin stesso per personalizzare le funzionalità erogate secondo diverse esigenze.</p>
<p>L&#8217;utilizzo di un oggetto di configurazione fa nascere alcune problematiche di organizzazione del codice quali:</p>
<ul>
<li>necessità di applicare dei <strong>valori di default</strong> per opzioni non rese esplicite</li>
<li>necessità di <strong>passare l&#8217;oggetto di configurazione</strong> alla funzione <em>__loop()</em></li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Proprietà di configurazione interna.</span>
  <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Estendo la proprietà di configurazione con l'oggetto di</span>
  <span style="color: #006600; font-style: italic;">// configurazione contenuto nel primo parametro del plugin.</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>arguments.<span style="color: #660066;">length</span> <span style="color: #339933;">||</span> $.<span style="color: #660066;">isPlainObject</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    cfg <span style="color: #339933;">=</span> $.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>
      color<span style="color: #339933;">:</span> <span style="color: #3366CC;">'black'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Applico la logica agli elementi del contesto (DOM)</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> __loop.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> cfg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Mantengo la possibilità di concatenare plugins.</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Come prima cosa si noti l&#8217;aggiunta di una proprietà locale al plugin <strong>cfg</strong> la quale è instanziata a <em>false</em> e successivamente estesa da un oggetto contenente la <strong>configurazione di default</strong> del plugin stesso. (riga <em>#3</em> -&gt; <em>#13</em>)</p>
<p>La configurazione è contenuta nel primo parametro tra quelli passati al plugin, inoltre il valore di <em>cfg</em> viene modificato <strong>solamente se tale parametro è un oggetto</strong>. Questo condizionale è la base di una semplice tecnica per utilizzare il medesimo plugin con <strong>tipi di input differenti</strong> come avviene in quasi tutti i widget di jQuery UI.</p>
<pre>$('#foo').dialog({ .. config .. }).dialog('open');</pre>
<h2>Utilizziamo le Closures:</h2>
<p>Anche la riga <em>#16</em> è cambiata: abbiamo dovuto aggiungere una <strong>closure</strong> per consentire il passaggio della configurazione alla funzione locale <em>__loop()</em>.</p>
<p>L&#8217;utilizzo della <em>closure</em> è un <strong>compromesso di ottimizzazione</strong>.</p>
<p>Cerchiamo di isolare tutta la logica possibile in una funzione esterna che verrà invocata con parametri diversi dal codice interno alla closure. La closure verrà invece creata per ogni elemento DOM del contesto causando un leggero spreco di memoria.</p>
<p><strong>Mantenere essenziale il codice delle <em>closure</em> demandando tutta la logica a funzioni esterne è importantissimo per garantire buone performance al nostro codice!</strong></p>
<h2>Rispondere a diversi tipi di input:</h2>
<p>Abbiamo accennato a jQueryUI ed a come metta a disposizione una serie di widget la cui caratteristica comune è <strong>erogare comportamenti diversi in base a tipi di chiamate diverse:</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Logic methods
   */</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> __loop <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> cfg <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'customPlugin'</span><span style="color: #339933;">,</span> cfg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> __colorize <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'customPlugin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'background-color'</span><span style="color: #339933;">,</span> cfg.<span style="color: #660066;">color</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">/**
   * Plugin - Estensione jQuery
   */</span>
  $.<span style="color: #660066;">fn</span>.<span style="color: #660066;">customPlugin</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Proprietà di configurazione interna.</span>
    <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Estendo la proprietà di configurazione con l'oggetto di</span>
    <span style="color: #006600; font-style: italic;">// configurazione contenuto nel primo parametro del plugin.</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>arguments.<span style="color: #660066;">length</span> <span style="color: #339933;">||</span> $.<span style="color: #660066;">isPlainObject</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      cfg <span style="color: #339933;">=</span> $.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>
        color<span style="color: #339933;">:</span> <span style="color: #3366CC;">'black'</span>
      <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Inizializzazione Plugin:</span>
    <span style="color: #006600; font-style: italic;">// Applico la logica agli elementi del contesto (DOM)</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> cfg <span style="color: #339933;">!==</span> <span style="color: #003366; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> __loop.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> cfg <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Azioni su plugin intanziato:</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> arguments.<span style="color: #660066;">length</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span> arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #3366CC;">'colorize'</span><span style="color: #339933;">:</span>
          $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> __colorize.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Mantengo la possibilità di concatenare plugins.</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// EndOf: &quot;customPlugin()&quot; ###</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">/**
 * Codice eseguito al caricamento della pagina
 */</span>
$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Inizializzazione del plugin</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">customPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    color<span style="color: #339933;">:</span><span style="color: #3366CC;">'red'</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Esempio di utilizzo delle azioni del plugin</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'p'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">customPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'colorize'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>In questo esempio applichiamo il nostro plugin a tutti paragrafi (p) del documento (riga <em>#69</em>). Questa operazione andrà ad attivare il metodo locale <em>__loop()</em> la cui logica è salvare la configurazione del plugin all&#8217;interno del DOM del nodo interessato.</p>
<p>Successivamente sfruttiamo il click su di un bottone per invocare il metodo &#8220;colorize&#8221; del plugin stesso. In questo caso entra in scena il metodo local <em>__colorize()</em>. Questo è reso possibile dal controllo sul <strong>tipo di dato</strong> effettuato sul <strong>primo parametro</strong> passato al plugin. Rispettivamente in riga <em>#30</em> e poi in riga <em>#46</em>.</p>
<p>Seguendo la struttura esposta nell&#8217;articolo il codice del plugin è diviso in due macro sezioni: un <strong>&#8220;router&#8221; di azioni</strong> ed un certo numero di <strong>metodi interni</strong>.</p>
<p>Il <strong>router</strong> è gestito nella funzione che estende jQuery. Controlla il tipo di input e si occupa di stabile che<strong> tipo di azione</strong> è richiesta.</p>
<p>I <strong>metodi interni</strong> si occupano di dar seguito alla decisione del router e devono &#8220;fare la magia&#8221;. Solitamente i metodi interni sono invocati per ogni elemento DOM identificato dal contesto del plugin come nei precedenti esempi.</p>
<p><strong>Il passo successivo è massimizzare l&#8217;ottimizzazione dei metodi interni!</strong></p>
<h2>Ottimizzare con le Variabili Cache:</h2>
<p>Ogni metodo locale di logica riceve come <em>contesto</em> il riferimento ad un preciso nodo DOM facente parte dell&#8217;xPath su cui è stato lanciato il plugin. Nel nostro esempio significa che il codice <em>$(this)</em> all&#8217;interno dei metodi <em>__loop()</em> o <em>__colorize()</em> è il riferimento ad un singolo paragrafo.</p>
<p>Sempre all&#8217;interno di questi metodi potremo aver bisogno di effettuare nuove ricerche su nodi:</p>
<pre>$(this).find('strong')</pre>
<p>a cui applicare vari metodi jQuery oppure altri plugin a cascata.</p>
<p>Ogni volta che si utilizza jQuery per effettuare una ricerca viene impegnata memoria e CPU. Noi possiamo agire e salvare i risultati di una query in una variabile locale così da alleggerire il carico del computer client. Vediamo il codice di <em>__colorize()</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>0
1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> __colorize <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #003366; font-weight: bold;">var</span> cfg <span style="color: #339933;">=</span> $this.<span style="color: #660066;">data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'customPlugin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  $this.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'background-color'</span><span style="color: #339933;">,</span> cfg.<span style="color: #660066;">color</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>In riga <em>#2</em> viene creata la variabile locale <strong>$this</strong> con riferimento al nodo DOM.<br />
Nelle righe <em>#4</em> e <em>#6</em> riutilizziamo questa variabile per applicare metodi jQuery.</p>
<p>Questo è ovviamente un esempio banale ma possiamo immaginare l&#8217;impatto positivo di questo accorgimento quando la logica comincia a complicarsi un po&#8217;!</p>
<h2>Conclusioni:</h2>
<p>In questo articolo abbiamo raccolto le basi per la costruzione di un plugin jQuery versatile e prestazionale.</p>
<p>Grazie a questa struttura <strong>diventa semplice realizzare strumenti complessi</strong> che contengano configurazione e azioni.</p>
<p>Nel prossimo articolo studiamo in dettaglio alcune linee guida utili alla <strong>realizzazione di un &#8220;widget&#8221;</strong> ovvero un plugin complesso che mette a disposizione un <strong>controllo di interfaccia facilmente riutilizzabile</strong> in progetti differenti.</p>
<p>Al momento in cui scrivo il progetto di &#8220;widget collection&#8221; jQuery più affermato è sicuramente jQueryUI il quale mette a disposizione controlli di interfaccia evoluti quali <em>dialog window</em>, <em>date picker</em>, <em>sortable list</em>, etc.</p>
<p>Noi impareremo a creare componenti &#8220;custom&#8221; il cui utilizzo sia però ispirato alle linee guida di jQueryUI, fino ad arrivare alla creazione di nuovi widget completamente compatibili con jQueryUI e le sue linee guida.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;title=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Struttura+di+un+plugin+jQuery+@+http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2012%2F01%2Fstruttura-di-un-plugin-jquery%2F&amp;t=Struttura+di+un+plugin+jQuery" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2012/01/struttura-di-un-plugin-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery ImagesLoaded Plugin</title>
		<link>http://www.consulenza-web.com/2011/11/jquery-imagesloaded-plugin/</link>
		<comments>http://www.consulenza-web.com/2011/11/jquery-imagesloaded-plugin/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 16:20:19 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[complete]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ready]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=490</guid>
		<description><![CDATA[Questo https://github.com/thepeg/ImagesLoaded lancia una funzione di callback quando tutte le immagini del target sono state caricate con successo. $('#target').imagesLoaded(function(){   alert("All images in #target were loaded!"); }); E&#8217; anche possibile gestire una configurazione più dettagliata impostando callback di successo e di errore, quest&#8217;ultima lanciata nel caso una o più immagini non siano correttamente caricate nel [...]]]></description>
			<content:encoded><![CDATA[<p>Questo https://github.com/thepeg/ImagesLoaded lancia una funzione di callback quando tutte le immagini del target sono state caricate con successo.</p>
<pre>$('#target').imagesLoaded(function(){
  alert("All images in #target were loaded!");
});</pre>
<p>E&#8217; anche possibile gestire una configurazione più dettagliata impostando <strong>callback di successo e di errore</strong>, quest&#8217;ultima lanciata nel caso una o più immagini non siano correttamente caricate nel <strong>tempo di timeout impostato</strong>:</p>
<pre>$('#target').imagesLoaded({
  success: function(){ alert('Ok!'); },
  error: function() { alert('Ko!')); },
  timeout: 1000,
});</pre>
<p>Nel precedente codice di esempio è <strong>impostato il timeout</strong> ovvero il <strong>tempo massimo di durata del controllo</strong> e le <strong>callback personalizzate</strong> in caso di successo o di fallimento del controllo. Le funzioni di callback ricevono come contesto il riferimento a $(&#8216;#target&#8217;);</p>
<h3>Fork on GitHub!</h3>
<p><a title="Fork ImagesLoaded on GitHub!" href="https://github.com/thepeg/ImagesLoaded" class="aga aga_11" target="_blank">https://github.com/thepeg/ImagesLoaded</a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F&amp;title=jQuery+ImagesLoaded+Plugin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F&amp;title=jQuery+ImagesLoaded+Plugin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F&amp;title=jQuery+ImagesLoaded+Plugin" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F&amp;title=jQuery+ImagesLoaded+Plugin" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F&amp;title=jQuery+ImagesLoaded+Plugin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+jQuery+ImagesLoaded+Plugin+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-imagesloaded-plugin%2F&amp;t=jQuery+ImagesLoaded+Plugin" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/11/jquery-imagesloaded-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Auto FancyBOX Plugin</title>
		<link>http://www.consulenza-web.com/2011/11/jquery-auto-fancybox-plugin/</link>
		<comments>http://www.consulenza-web.com/2011/11/jquery-auto-fancybox-plugin/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 14:17:14 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[attribute]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[data-]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[facilities]]></category>
		<category><![CDATA[fancybox]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=476</guid>
		<description><![CDATA[Questo plugin permette di applicare il plugin FancyBOX a elementi della pagina configurandone il comportamento direttamente dagli attributi stessi dell&#8217;elemento. E&#8217; molto più semplice utilizzare FancyBOX in questo modo perchè non c&#8217;è bisogno di complicate configurazioni Javascript: solo 1 riga di codice! Source code on GitHub! https://github.com/thepeg/AutoFancybox Di seguito un esempio di codice Javascript di [...]]]></description>
			<content:encoded><![CDATA[<p>Questo plugin permette di applicare il <a title="jQuery FancyBOX Plugin" href="http://fancybox.net/" class="aga aga_14" target="_blank">plugin FancyBOX</a> a elementi della pagina configurandone il comportamento direttamente dagli attributi stessi dell&#8217;elemento.<br />
E&#8217; <strong>molto più semplice utilizzare FancyBOX</strong> in questo modo perchè non c&#8217;è bisogno di complicate configurazioni Javascript: <strong>solo 1 riga di codice</strong>!</p>
<p style="text-align: center;"><a title="Fork me on GitHub" href="https://github.com/thepeg/AutoFancybox" target="_blank">Source code on GitHub!<br />
<span style="font-size: 0.8em;">https://github.com/thepeg/AutoFancybox</span></a></p>
<p><span id="more-476"></span></p>
<p>Di seguito un esempio di codice Javascript di inizializzazione (1 riga!) ed un esempio di HTML che permette di lanciare un IFRAME in lightbox.</p>
<pre>// Document onReady()
$('.auto-fancybox').autoFancybox();

&lt;!-- Inside your document --&gt;
&lt;a href="http://goo.gl/VgLDo" title="Lavora con me!"
  class="auto-fancybox"
  data-type="iframe"
  data-width="90%"
  data-height="90%"
&gt;Lavora con me!&lt;/a&gt;</pre>
<h2>Opzioni Supportate</h2>
<p>Il plugin supporta quasi tutte le opzioni ufficiali di FancyBOX. Trattandosi di attributi HTML5 i nomi sono scritti completamente in minuscolo quindi l&#8217;opzione di configurazione &#8220;showTitle&#8221; diventa l&#8217;attributo &#8220;data-showtitle&#8221;.</p>
<ul>
<li>padding</li>
<li>margin</li>
<li>opacity</li>
<li>modal</li>
<li>cyclic</li>
<li>scrolling</li>
<li>width</li>
<li>height</li>
<li>autoscale</li>
<li>autodimensions</li>
<li>centeronscroll</li>
<li>ajax</li>
<li>swf</li>
<li>hideonoverlayclick</li>
<li>hideoncontentclick</li>
<li>overlayshow</li>
<li>overlayopacity</li>
<li>overlaycolor</li>
<li>titleshow</li>
<li>titleposition</li>
<li>titleformat</li>
<li>transitionin</li>
<li>transitionout</li>
<li>speedin</li>
<li>speedout</li>
<li>changespeed</li>
<li>changefade</li>
<li>easingin</li>
<li>easingout</li>
<li>showclosebutton</li>
<li>shownavarrows</li>
<li>enableescapebutton</li>
<li>type</li>
<li>href</li>
<li>title</li>
<li>content</li>
<li>index</li>
</ul>
<div>Per la documentazione di tutte queste opzioni di configurazione rimando alla <a title="FancyBOX API" href="http://fancybox.net/api" class="aga aga_15" target="_blank">documentazione ufficiale</a>.</div>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F&amp;title=jQuery+Auto+FancyBOX+Plugin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F&amp;title=jQuery+Auto+FancyBOX+Plugin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F&amp;title=jQuery+Auto+FancyBOX+Plugin" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F&amp;title=jQuery+Auto+FancyBOX+Plugin" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F&amp;title=jQuery+Auto+FancyBOX+Plugin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+jQuery+Auto+FancyBOX+Plugin+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F11%2Fjquery-auto-fancybox-plugin%2F&amp;t=jQuery+Auto+FancyBOX+Plugin" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/11/jquery-auto-fancybox-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone: App Native, WebApp o sviluppo ibrido?</title>
		<link>http://www.consulenza-web.com/2011/10/iphone-native-web-app/</link>
		<comments>http://www.consulenza-web.com/2011/10/iphone-native-web-app/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 06:00:55 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[jquery mobile]]></category>
		<category><![CDATA[native]]></category>
		<category><![CDATA[phonegap]]></category>
		<category><![CDATA[sencha touch]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=466</guid>
		<description><![CDATA[Da qualche settimana ho iniziato a dilettarmi nell sviluppo di applicazioni mobile per il mio iPhone/iPad. Inizialmente ho letto parecchie discussioni sull&#8217;argomento in oggetto: &#8220;native VS webapp&#8221; e in questo articolo vorrei sintetizzare alcune mie valutazioni. Potendo dedicare allo studio delle applicazioni mobile solamente poche ore la sera ho subito approciato il mondo delle WebApp [...]]]></description>
			<content:encoded><![CDATA[<p>Da qualche settimana ho iniziato a dilettarmi nell sviluppo di applicazioni mobile per il mio iPhone/iPad.</p>
<p>Inizialmente ho letto parecchie discussioni sull&#8217;argomento in oggetto: &#8220;<strong>native VS webapp</strong>&#8221; e in questo articolo vorrei sintetizzare alcune mie valutazioni.</p>
<p>Potendo dedicare allo studio delle applicazioni mobile solamente poche ore la sera ho subito approciato il mondo delle WebApp perchè mi consentono di sfruttare competenze preesistenti: HTML5, Javascript, CSS.</p>
<h2>WebApp</h2>
<p>Per il primissimo approccio ho utilizzato <a title="jQuery Mobile" href="http://jquerymobile.com/" class="aga aga_21" target="_blank">jQuery Mobile</a> con il quale ho realizzato una semplicissima photogallery la cui <a title="Web design responsivo / adattivo" href="http://www.consulenza-web.com/2011/07/compromesso-vincente/"  target="_blank">interfaccia responsiva</a> si adatta al dispositivo che la richiede: se usi un computer vedrai una pagina web con effetto lightbox mentre se usi un iPhone, Android, iPad vedrai un&#8217;interfaccia simile a quelle native.<br />
Inoltre il passaggio tra le immagini è gestito dal touch e non dal click. [<a title="esempio photogallery con interfaccia responsiva" href="http://www.bertoliniarte.it/en/photogallery/" class="aga aga_22" target="_blank">vedi esempio</a>].</p>
<p>Successivamente mi sono dedicato a <a title="Sencha Touch Mobile Framework" href="http://www.sencha.com/products/touch/" class="aga aga_23" target="_blank">SenchaTouch</a>, un prodotto veramente incredibile e completo ma dotato di scarsa documentazione libera: l&#8217;azienda che lo produce campa vendendo formazione!<br />
Attualmente mi sto dedicando allo studio di questo prodotto e ho aperto un <a title="Sencha Touch Developer, Sencha Touch Web App" href="http://movableapp.com" class="aga aga_24" target="_blank">piccolo blog</a> dedicato dove pubblico i miei &#8220;appunti di viaggio&#8221; su piccole e grandi cose che scopro sull&#8217;argomento.</p>
<p><strong>Principali vantaggi di un&#8217;applicazione web based:</strong></p>
<ul>
<li>sviluppo su tecnologie open: html, javascript, css</li>
<li>sviluppo su browser web: safari, chrome</li>
<li>deploy dell&#8217;applicazione su server FTP</li>
<li>installazione semplice: basta collegarsi all&#8217;indirizzo dell&#8217;app</li>
<li>possibilità di funzionamento off-line (in assenza di connettività)</li>
<li>compatibilità semplificata con Android, Blackberry</li>
</ul>
<h2>Applicazione Nativa</h2>
<p>Lo studio di applicazioni native l&#8217;ho approciato <a title="concatenare stringhe in objective-c" href="http://www.consulenza-web.com/2009/10/concatenare-stringhe-in-objective-c/"  target="_blank">qualche tempo fa</a> scontrandomi subito con la pessima sintassi del linguaggio ObjectiveC.</p>
<p>Sostanzialmente i framework (volutamente al plurale) di sviluppo su cui si basano le applicazioni native sono incredibili collezioni di oggetti e componenti pronti da utilizzare e configurare.</p>
<p>L&#8217;applicazione risulta così una composizione creativa di oggetti mentre la realizzazione di componenti ex-novo è tutt&#8217;altra cosa.</p>
<p>In linea di massima ritengo che per chi proviene dal mondo web <strong>la curva di apprendimento sia piuttosto lunga</strong> rispetto all&#8217;applicazione web based a parità di obiettivo.</p>
<p><strong>Principali vantaggio di un&#8217;applicazione nativa:</strong></p>
<ul>
<li>AppStore: visibilità, diffusione, guadagno</li>
<li>prestazioni decisamente superiori</li>
<li>accesso all&#8217;hardware: fotocamera, file system, accelerometro, etc</li>
<li>funzionamento off-line nativo</li>
</ul>
<h2>Applicazione Ibrida con PhoneGap!</h2>
<p>Una possibilità di congiungere le due diverse soluzioni in un compromesso che possa <strong>sfruttare i relativi vantaggi</strong> è l&#8217;<strong>applicazione ibrida web/nativa</strong>. Questa soluzione si può ottenere con <a title="PhoneGap Project" href="http://www.phonegap.com/" class="aga aga_25" target="_blank">PhoneGap</a>.</p>
<p>L&#8217;applicazione ibrida è un wrapper che consente il funzionamento dell&#8217;applicazione web. <strong>Una sorta di piccolo browser preconfezionato</strong>.</p>
<p>Solo questo punto rende possibile distribuire l&#8217;applicazione su AppStore consentendo dunque il funzionamento off-line nativo!</p>
<p>Cataloghi, manuali, reference, schede tecniche sono esempi di applicazioni che trovano in questa soluzione la miglior soluzione possibile: <strong>velocità di sviluppo abbinata a capacità di distribuzione su AppStore!</strong></p>
<p>PhoneGap mette anche a disposizione delle API Javascript per poter <strong>accedere a funzionalità avanzate del dispositivo</strong> quali:</p>
<ul>
<li>file system</li>
<li>fotocamera</li>
<li>libreria media</li>
<li>accelerometro</li>
<li>bussola</li>
<li>contatti</li>
<li>geolocalizzazione</li>
<li>connettività</li>
<li>notifiche</li>
<li>storage db</li>
</ul>
<p>Con questo sistema sono riuscito, nell&#8217;arco di una giornata, a realizzare il prototipo di un&#8217;applicazione che mantiene sincronizzati sul device (in questo caso un&#8217;iPad) una serie di files (pdf) pubblicati su di un server FTP remoto. Una sorta di client Dropbox ma mooolto più semplice.</p>
<p>In conclusione presumo che proseguirò sulla strada dell&#8217;applicazione ibrida perchè rappresenta un punto di giunzione tra le due diverse filosofie di sviluppo. <strong>Inoltre offre un sistema piuttosto semplice per realizzare applicazioni compatibili con più dispositivi</strong>!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F&amp;title=iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F&amp;title=iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F&amp;title=iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F&amp;title=iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F&amp;title=iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F10%2Fiphone-native-web-app%2F&amp;t=iPhone%3A+App+Native%2C+WebApp+o+sviluppo+ibrido%3F" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/10/iphone-native-web-app/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jQuery: strutturare il codice di un plugin</title>
		<link>http://www.consulenza-web.com/2011/07/jquery-strutturare-codice-plugin/</link>
		<comments>http://www.consulenza-web.com/2011/07/jquery-strutturare-codice-plugin/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 07:47:17 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[codice]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[organizzazione]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=353</guid>
		<description><![CDATA[In questo articolo espongo un&#8217;architettura di codice Javascript per la definizione di plugin jQuery i cui obiettivi sono: Compatibilità cross-library Configurazione globale del plugin Separazione delle API dal codice funzionale del plugin stesso Visualizza l&#8217;esempio correlato » Scarica i files dell&#8217;esempio correlato » 1. Definizione di uno Scope anonimo: /** * jQuery Bacheca * Plugin Dimostrativo */ [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo espongo un&#8217;architettura di codice Javascript per la definizione di plugin jQuery i cui obiettivi sono:</p>
<ol>
<li>Compatibilità cross-library</li>
<li>Configurazione globale del plugin</li>
<li>Separazione delle API dal codice funzionale del plugin stesso</li>
</ol>
<div><a title="Bacheca, Plugin jQuery di Esempio | organizzazione codice plugin jQuery | www.consulenza-web.com" href="http://consulenza-web.com/jquery/bacheca"  target="_blank">Visualizza l&#8217;esempio correlato »</a><br />
<a title="download files di esempio, zip, 37Kb" href="http://consulenza-web.com/jquery/bacheca.zip" class="aga aga_27" target="_blank">Scarica i files dell&#8217;esempio correlato »</a></div>
<h2><span id="more-353"></span>1. Definizione di uno Scope anonimo:</h2>
<div>
<pre>/**
 * jQuery Bacheca
 * Plugin Dimostrativo
 */

;(function($){
  // Plugin's code goes here
})( jQuery );</pre>
<p>Questo codice crea uno <em>SCOPE</em> ovvero una <strong>bolla isolata</strong> in cui scrivere il nostro codice.</p>
<p>A meno di particolari accorgimenti questo codice non può influire su altro codice pubblico e codice di terzi non può agire sul nostro. Questo ci garantisce al nostro plugin certa protezione dagli errori altrui!</p>
<p>Un&#8217;altro vantaggio di questa tecnica consiste nel poter utilizzare il &#8220;$&#8221; come riferimento a jQuery anche in presenza di altre librerie in quando esso è definito come variabile locale del nostro ambiente di lavoro.</p>
<p><strong>NOTA:</strong> il codice sorgente visualizzato d&#8217;ora in avanti si riferisce al contenuto di questo wrapper.</p>
</div>
<h2>2. Configurazione Globale del Plugin<span class="Apple-style-span" style="font-size: 13px; font-weight: normal;"> </span></h2>
<pre>$.bacheca = {

  // Versione ed altre info eventuali.
  version: '1.0,
  author: 'Marco Pegoraro',
  doc: 'http://www.documentazionedelplugin.com',

  // Configurazione globale del plugin.
  defaults: {},

};</pre>
<p>Questa istruzione <strong>estende jQuery</strong> e aggiunge una nuova proprietà chiamata con il nome del plugin stesso.</p>
<p><strong>NOTA:</strong> I dati qui collezionati saranno pubblici ed accessibili da qualunque porzione di codice abbia accesso al <em>namespace</em> jQuery. Questo è un fatto importante perchè chi utilizza il nostro plugin potrà scrivere istruzioni simili alla seguente per configurare a livello globale il comportamento del plugin stesso.</p>
<pre>$.bacheca.defaults.var1 = "foo";</pre>
<p>Qualunque istanza del plugin bacheca riceverà questa variabile nella configurazione locale (a meno che non venga sovrascritta dalla configurazione dell&#8217;istanza stessa!)</p>
<p>Può essere molto utile poter controllare, a livello di pagina, se un determinato plugin è caricato o meno con un&#8217;istruzione simile a questa:</p>
<pre>if ( $.bacheca ) { /* plugin exists */ } else { /* plugin missing */ }</pre>
<h2>3. Il Plugin</h2>
<p>Il plugin vero e proprio è semplicemente una funzione che estende la collection di jQuery aggiungendo nuove funzionalità.</p>
<p>$.fn.bacheca = function() { /* plugin logic */ }</p>
<p>Molti sviluppatori implementano le funzionalità direttamente nel codice logico del plugin ma io trovo sia più corretto <strong>organizzare il plugin come un metodo pubblico di accesso ad API  private</strong>.</p>
<p>Questo significa che tutta la logica del plugin è inaccessibile da codice globale e la possiamo utilizzare solamente attraverso il plugin stesso mediante istruzioni simili a:</p>
<pre>$('#bacheca').bacheca({ bgcolor: "#eee" });
$('#bacheca').bacheca( "write", "Nuova frase in bacheca" );
$('#bacheca').bacheca( "clear" );</pre>
<p>Come si può vedere da questo esempio stiamo utilizzando sempre il plugin &#8220;bacheca&#8221; il quale avrà <strong>comportamenti differenti in base alla tipologia del primo parametro</strong>. nel caso il primo parametro venga riconosciuto come nome di una API essa verrà invocata ricevendo tutti i parametri aggiuntivi.</p>
<p>Il codice da utilizzare per implementare quanto esposto è:</p>
<pre>// Collezione di metodi di interfaccia (API)
apis = {};

// Definizione del plugin
$.fn.bacheca = function( method ) {

  // Cerco il metodo richiesto tra le API esposte.
  if ( apis[method] ) {
    return apis[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));

  // Lancio il metodo di inizializzazione in presenza di un oggetto di configurazione.
  } else if ( typeof method === 'object' || ! method ) {
    return apis.init.apply( this, arguments );

  // Lancio un'eccezione jQuery in caso il metodo API non sia trovato.
  } else {
    $.error( 'Method "' +  method + '" does not exist on jQuery.bacheca' );

  }
}</pre>
<p>Come anticipato il plugin non contiene logica funzionale ma è solo un &#8220;<em>passa carte</em>&#8221; verso metodi elencati in un array chiamato &#8220;apis&#8221;.</p>
<p>L&#8217;oggetto &#8220;apis&#8221; viene definito all&#8217;interno dello scope del plugin e risulta quindi essere un oggetto &#8220;privato&#8221; il cui utilizzo è riservato al codice del plugin stesso.<br />
In questo modo possiamo esporre funzionalità all&#8217;esterno garantendo che esse non siano modificabili da altro software (altri plugins, etc).</p>
<h2>4. API Collection</h2>
<p>Il plugin definito nel paragrafo precedente non fa altro che cercare metodi all&#8217;interno della collezione delle API.</p>
<p>Il nostro lavoro di sviluppo del plugin consiste proprio nell&#8217;estendere queste API a partire dal metodo &#8220;init()&#8221;, che riceverà la configurazione del plugin stesso, proseguendo poi per i metodi di azione.</p>
<h2>5. Bacheca::init()</h2>
<pre>apis.init = function( cfg ) {

  // Estendo la configurazione di default con la configurazione locale
  var cfg = $.extend( {}, $.bacheca.defaults, cfg );

  // Ciclo gli elementi identificati dal selettore
  return $(this).each(function(){
    $bacheca = $(this);
    $bacheca.html( cfg.content );
    if ( cfg.bgcolor != null ) $bacheca.css( 'background', cfg.bgcolor );
  });
}</pre>
<p>Questo metodo riceve la configurazione locale applicata all&#8217;istanza del plugin. Ogni istanza del plugin (ogni suo utilizzo) può essere configurato a piacere ed è importante che queste configurazioni siano mantenute isolate le une dalle altre.</p>
<p>In questo primo e semplice plugin la configurazione è utilizzata semplicemente per definire il contenuto iniziale della bacheca ed il suo colore di sfondo. Gli altri metodi API non fanno uso di questa configurazione dunque non ci siamo occupati di gestirla al meglio (lasciamo l&#8217;argomento ad un articolo dedicato).</p>
<h2>6. Bacheca::write(), Bacheca::clear()</h2>
<pre>apis.write = function( word ) {
  return $(this).append('&lt;p&gt;'+word+'&lt;/p&gt;');
}</pre>
<pre>apis.clear = function() {
  return $(this).html("");
}</pre>
<p>Questi due metodi API esposti dal plugin sono estremamente semplici e consentono di manipolare il contenuto della bacheca.</p>
<h2>7. Utilizzo del plugin:</h2>
<pre>&lt;!-- Codice HTML --&gt;
&lt;div id="bacheca"&gt;&lt;/div&gt;</pre>
<pre>// Codice Javascript globale:
$(document).ready(function(){
  $('#bacheca')
    .bacheca({ bgcolor:"green", content:"Test Contenuto" })
    .bacheca('clear')
    .bacheca('write','Il mio nome è Marco')
  ;
});</pre>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;title=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+jQuery%3A+strutturare+il+codice+di+un+plugin+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F07%2Fjquery-strutturare-codice-plugin%2F&amp;t=jQuery%3A+strutturare+il+codice+di+un+plugin" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/07/jquery-strutturare-codice-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Task4: disponibile il multilingua!</title>
		<link>http://www.consulenza-web.com/2011/06/pimp-disponibile-il-multilingua/</link>
		<comments>http://www.consulenza-web.com/2011/06/pimp-disponibile-il-multilingua/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 21:04:04 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePOWER]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Task4.it]]></category>
		<category><![CDATA[collaborate]]></category>
		<category><![CDATA[contribute]]></category>
		<category><![CDATA[locale]]></category>
		<category><![CDATA[localization]]></category>
		<category><![CDATA[manager]]></category>
		<category><![CDATA[project manager]]></category>
		<category><![CDATA[task]]></category>
		<category><![CDATA[task manager]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=327</guid>
		<description><![CDATA[L&#8217;aggiornamento del giorno consiste nella localizzazione dell&#8217;interfaccia grafica di Task4. Task4 riconosce la lingua in uso nel tuo browser e tenta di caricare la traduzione necessaria. E&#8217; anche possibile impostare in modo esplicito la lingua desiderata. Se l&#8217;indirizzo del tuo progetto è &#8220;http://task4.it/nomeprogetto&#8221; e vuoi utilizzare l&#8217;interfaccia in lingua inglese utilizza semplicemente il seguente indirizzo: [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;aggiornamento del giorno consiste nella localizzazione dell&#8217;interfaccia grafica di <a title="Task4 - semplice task manager con interfaccia web" href="http://task4.it" class="aga aga_30" target="_blank">Task4</a>.</p>
<p><strong>Task4</strong> riconosce la lingua in uso nel tuo browser e tenta di caricare la traduzione necessaria.</p>
<p><strong>E&#8217; anche possibile impostare in modo esplicito la lingua desiderata.</strong></p>
<p>Se l&#8217;indirizzo del tuo progetto è &#8220;http://task4.it/nomeprogetto&#8221; e vuoi utilizzare l&#8217;interfaccia in lingua inglese utilizza semplicemente il seguente indirizzo:</p>
<pre> http://task4.it<strong>/en/</strong>nomeprogetto</pre>
<h3>Partecipa al progetto!</h3>
<p><strong>Task4</strong> può essere utilizzato gratuitamente da chiunque dunque ci servono più  traduzioni possibili!<br />
<a title="Download pacchetto di localizzazione" href="http://task4.it/locale.zip" class="aga aga_31">Scarica il pacchetto di localizzazione e contribuisci al progetto!</a></p>
<p>&nbsp;</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F&amp;title=Task4%3A+disponibile+il+multilingua%21" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F&amp;title=Task4%3A+disponibile+il+multilingua%21" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F&amp;title=Task4%3A+disponibile+il+multilingua%21" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F&amp;title=Task4%3A+disponibile+il+multilingua%21" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F&amp;title=Task4%3A+disponibile+il+multilingua%21" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Task4%3A+disponibile+il+multilingua%21+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F06%2Fpimp-disponibile-il-multilingua%2F&amp;t=Task4%3A+disponibile+il+multilingua%21" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/06/pimp-disponibile-il-multilingua/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BlogMyPage.org: inserisci un blog in ogni pagina!</title>
		<link>http://www.consulenza-web.com/2011/01/blogmypage-org-inserisci-un-blog-in-ogni-pagina/</link>
		<comments>http://www.consulenza-web.com/2011/01/blogmypage-org-inserisci-un-blog-in-ogni-pagina/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 18:59:26 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[integration]]></category>
		<category><![CDATA[service]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=291</guid>
		<description><![CDATA[Questo è stato un weekend di lavoro. Venerdì un cliente mi domanda come si fa ad attivare i commenti in una pagina del suo sito e io un po&#8217; imbarazzato gli risposi: &#8220;bè, non si può! Bisogna fare un blog!&#8221;. Egli mi guarda cercando di capire il mio punto di vista e rispose: &#8220;ma perchè? [...]]]></description>
			<content:encoded><![CDATA[<p>Questo è stato un weekend di lavoro.</p>
<p>Venerdì un cliente mi domanda come si fa ad attivare i commenti in una pagina del suo sito e io un po&#8217; imbarazzato gli risposi:<br />
&#8220;bè, non si può! Bisogna fare un blog!&#8221;.</p>
<p>Egli mi guarda cercando di capire il mio punto di vista e rispose:<br />
<strong>&#8220;ma perchè? basta mettere un form no?&#8221;</strong></p>
<p><span id="more-291"></span>Io rimango sempre felicemente sorpreso di come la gente percepisce &#8220;facile&#8221; costruire un sistema web. Pensano che una pagina sia un oggetto fisico sul quale &#8220;appoggiare&#8221; altri oggetti fisici. Pensano che i &#8220;moduli&#8221; siano veramente i pezzi di un puzzle.</p>
<p>Dopo aver preparato un piccolo preventivo ci ho pensato su parecchio e ho detto: &#8220;e perchè no?&#8221;</p>
<p>Siamo ormai abituati a inserire Google Analytics (codice Javascript), Google Maps (Iframe o Javascript), Flick (tanto Javascript), Facebook (addirittura un markup inventato + Javascript)&#8230; insomma, <strong>perchè non inserire un blog esattamente come fosse un filmato YouTUBE?</strong></p>
<p>Così è nato il servizio <a title="Embed Blog features in every web page!" href="http://BlogMyPage.org" class="aga aga_34">BlogMyPage.org</a></p>
<p>BlogMyPage.org permette di ottenere un semplice codice Javascript (ma sono previste numerosi metodi di integrazione) da inserire in una qualunque pagina web (al momento è richiesto jQuery) per aggiungere a tale pagina un sistema di discussione perfettamente funzionante!</p>
<p>Al momento il servizio è in BETA. Lo stiamo provando e lo stiamo migliorando.</p>
<p>Per provarlo è necessario ricevere <strong>un codice di invito</strong> (Vi ricordate GMail all&#8217;inizio?). Per ovvie ragioni regalo un codice di invito a chiunque faccia una donazione tramite i pulsanti PayPal che trovate nel sito!</p>
<p><a title="Embed Blog features in every web page!" href="http://BlogMyPage.org" class="aga aga_35">BlogMyPage.org</a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F&amp;title=BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F&amp;title=BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F&amp;title=BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F&amp;title=BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F&amp;title=BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21+@+http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2011%2F01%2Fblogmypage-org-inserisci-un-blog-in-ogni-pagina%2F&amp;t=BlogMyPage.org%3A+inserisci+un+blog+in+ogni+pagina%21" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2011/01/blogmypage-org-inserisci-un-blog-in-ogni-pagina/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery BluePrint Plugin</title>
		<link>http://www.consulenza-web.com/2010/10/jquery-blueprint-plugin/</link>
		<comments>http://www.consulenza-web.com/2010/10/jquery-blueprint-plugin/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 16:02:56 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[tip & tricks]]></category>
		<category><![CDATA[blueprint]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=227</guid>
		<description><![CDATA[Da pochi giorni sto giocando con il framework CSS blueprint per organizzare il layout di alcuni semplici templates. Trovo questo tipo di strumento molto utile ma estremamente limitativo nella definizione della larghezza del layout che fissata a 950px. Esistono strumenti per creare versioni ad-hoc del foglio di stile ma io ho affrontato il problema da [...]]]></description>
			<content:encoded><![CDATA[<p>Da pochi giorni sto giocando con il framework CSS <a title="css framework" href="http://www.blueprintcss.org/" class="aga aga_37" target="_blank">blueprint</a> per organizzare il layout di alcuni semplici templates.</p>
<p>Trovo questo tipo di strumento molto utile ma estremamente limitativo nella definizione della larghezza del layout che fissata a 950px.</p>
<p>Esistono strumenti per creare versioni ad-hoc del foglio di stile ma io ho affrontato il problema da un punto di vista differente realizzando un <strong>plugin jQuery</strong> che, presa la larghezza di un elemento &#8220;.container&#8221; (il wrapper della pagina realizzata con blueprint) <span style="text-decoration: underline;">aggiusta le regole del framework per adattarlo a tale dimensione</span>.</p>
<p style="text-align: center;"><a title="jQuery BluePrint CSS Framework" href="http://www.consulenza-web.com/progetti/jquery_blueprint/"  target="_blank">Vai alla Demo »</a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F&amp;title=jQuery+BluePrint+Plugin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F&amp;title=jQuery+BluePrint+Plugin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F&amp;title=jQuery+BluePrint+Plugin" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F&amp;title=jQuery+BluePrint+Plugin" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F&amp;title=jQuery+BluePrint+Plugin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+jQuery+BluePrint+Plugin+@+http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F10%2Fjquery-blueprint-plugin%2F&amp;t=jQuery+BluePrint+Plugin" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2010/10/jquery-blueprint-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Mail Obfuscator</title>
		<link>http://www.consulenza-web.com/2010/07/jquery-mail-obfuscator/</link>
		<comments>http://www.consulenza-web.com/2010/07/jquery-mail-obfuscator/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 11:13:10 +0000</pubDate>
		<dc:creator>peg</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[tip & tricks]]></category>
		<category><![CDATA[crowler]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mail obfuscator]]></category>
		<category><![CDATA[obfuscator]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.consulenza-web.com/?p=214</guid>
		<description><![CDATA[Oggi cercavo un metodo semplice e non intrusivo per impedire parte dello spam derivante dalla pubblicazione di un indirizzo mail in chiaro su di una pagina web. Ovviamente la miglior soluzione possibile è dotarsi di un buon filtro anti-spam (gMail?) perchè qualunque tipo di mail obfuscator si concretizza in un problema di usabilità ed una [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi cercavo un metodo semplice e non intrusivo per impedire parte dello spam derivante dalla pubblicazione di un indirizzo mail in chiaro su di una pagina web.</p>
<p>Ovviamente la miglior soluzione possibile è dotarsi di un buon filtro anti-spam (gMail?) perchè qualunque tipo di mail obfuscator si concretizza in un <strong>problema di usabilità ed una barriera di usabilità</strong>!</p>
<p>Ho comunque creato una soluzione Javascript basata su jQuery che propone un piccolo e semplicissimo approccio al problema.</p>
<p><span id="more-214"></span><a href="http://www.consulenza-web.com/wp-content/uploads/2010/07/jquery.mcrypt.js" class="aga aga_40"></a></p>
<p>L&#8217;idea di base è pubblicare nel codice sorgente della pagina un <strong>indirizzo mail volutamente errato </strong>e gestirne una <strong>correzione automatica mediante Javascript</strong>.</p>
<p>L&#8217;errore consiste nello scambiare il primo e l&#8217;ultimo carattere dell&#8217;indirizzo mail per cui &#8220;info@consulenza-web.com&#8221; diventa &#8220;mnfo@consulenza-web.coi&#8221;.</p>
<p>Ovviamente il nuovo indirizzo mail è formalmente corretto ed un qualunque spam bot o mail crowler lo identifica correttamente. Purtroppo per il malintenzionato questo indirizzo produrrà solamente degli invii falliti.</p>
<p><a href="http://www.consulenza-web.com/wp-content/uploads/2010/07/jquery.mcrypt.js" class="aga aga_41">jquery.mcrypt.js</a></p>
<p>Il plugin qui proposto di occupa di ripristinare automaticamente l&#8217;indirizzo corretto in modo che l&#8217;utente non percepisca l&#8217;errore.</p>
<pre>&lt;script&gt;
$('document').ready(function(){
  $('.mailto').mcrypt();
});
&lt;/script&gt;</pre>
<pre>&lt;a href="mailto:mnfo@consulenza-web.coi" class="mailto"&gt;mnfo@consulenza-web.coi&lt;/a&gt;</pre>
<p>Questa porzione di sorgente è sufficiente per creare un po&#8217; di problemi agli spam engine! <strong>Ovviamente non è una soluzione definitiva e nemmeno molto elaborata</strong>&#8230; però è semplice ed efficace per il suo scopo!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Segnala presso:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F&amp;title=jQuery+Mail+Obfuscator" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F&amp;title=jQuery+Mail+Obfuscator" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F&amp;title=jQuery+Mail+Obfuscator" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F&amp;title=jQuery+Mail+Obfuscator" rel="nofollow" title="Add to&nbsp;LinkedIn"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/linkedin.png" title="Add to&nbsp;LinkedIn" alt="Add to&nbsp;LinkedIn" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F&amp;title=jQuery+Mail+Obfuscator" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+jQuery+Mail+Obfuscator+@+http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.consulenza-web.com%2F2010%2F07%2Fjquery-mail-obfuscator%2F&amp;t=jQuery+Mail+Obfuscator" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://www.consulenza-web.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.consulenza-web.com/2010/07/jquery-mail-obfuscator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

