<?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>(function() { &#187; plugin</title>
	<atom:link href="http://maxb.net/blog/tag/plugin/feed/" rel="self" type="application/rss+xml" />
	<link>http://maxb.net/blog</link>
	<description>// MAXB.NET LABS</description>
	<lastBuildDate>Mon, 16 May 2011 19:12:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Un’ idea di plugin: jCropMap</title>
		<link>http://maxb.net/blog/2009/11/12/un-idea-di-plugin-jcropmap/</link>
		<comments>http://maxb.net/blog/2009/11/12/un-idea-di-plugin-jcropmap/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 18:12:52 +0000</pubDate>
		<dc:creator>Massimiliano Balestrieri</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[jcrop]]></category>
		<category><![CDATA[jcropmap]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://maxb.net/blog/?p=481</guid>
		<description><![CDATA[SOMMARIO Per chi non avesse la pazienza di leggere, o per chi semplicemente non è italiano, o per gli autori di Jcrop, qui sotto c&#8217;è un elenco di link in cui i linguaggi sono universali:  html, javascript (jQuery) e qualche &#8230; <a href="http://maxb.net/blog/2009/11/12/un-idea-di-plugin-jcropmap/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>SOMMARIO</h3>
<p>Per chi non avesse la pazienza di leggere, o per chi semplicemente non è italiano, o per gli autori di <a href="http://deepliquid.com/projects/Jcrop/demos.php" target="_blank">Jcrop</a>, qui sotto c&#8217;è un elenco di link in cui i linguaggi sono universali:  html, javascript (jQuery) e qualche proprietà di css.</p>
<ul>
<li><a href="http://maxb.net/scripts/jcropmap/demo.html" target="_blank">esempio base</a></li>
<li><a href="http://maxb.net/scripts/jcropmap/edit.html" target="_blank">inserire le aree</a></li>
<li><a href="http://maxb.net/scripts/jcropmap/show.html" target="_blank">visualizzare le aree inserite</a></li>
<li><a href="http://maxb.net/scripts/jcropmap/demo2.html" target="_blank">esempio con shapes disegnate</a></li>
<li><a href="http://maxb.net/scripts/jcropmap/release.html" target="_blank">trigger dell&#8217;evento release</a></li>
</ul>
<h3>DOWNLOAD</h3>
<p>
<a href="http://maxb.net/scripts/jcropmap/jcropmap.zip" target="_blank">DEMOS</a>
</p>
<h3>IL TAG MAP</h3>
<p>Il tag <a href="http://www.w3schools.com/TAGS/tag_map.asp" target="_blank">map</a>, e il &#8220;sottotag&#8221; <a href="http://www.w3schools.com/TAGS/tag_area.asp" target="_blank">area</a> permettono di &#8220;disegnare&#8221; link all&#8217;interno di un immagine.</p>
<pre class="brush: xml; title: ; notranslate">

&lt;img src=&quot;planets.gif&quot; width=&quot;145&quot; height=&quot;126&quot; alt=&quot;Planets&quot; usemap=&quot;#planetmap&quot; /&gt;

&lt;map name=&quot;planetmap&quot;&gt;
  &lt;area shape=&quot;rect&quot; coords=&quot;0,0,82,126&quot; alt=&quot;Sun&quot; href=&quot;sun.htm&quot; /&gt;
  &lt;area shape=&quot;circle&quot; coords=&quot;90,58,3&quot; alt=&quot;Mercury&quot; href=&quot;mercur.htm&quot; /&gt;
  &lt;area shape=&quot;circle&quot; coords=&quot;124,58,8&quot; alt=&quot;Venus&quot; href=&quot;venus.htm&quot; /&gt;
&lt;/map&gt;
</pre>
<p><a href="http://www.w3schools.com/TAGS/tryit.asp?filename=tryhtml_areamap" target="_blank">Qui</a> c&#8217;è un esempio di utilizzo.</p>
<h3>LIMITI DEL TAG MAP</h3>
<p>Il limite principale di questo tag è a mio modo di vedere l&#8217;impossibilità di applicare stili ai tag &#8220;AREA&#8221; presenti all&#8217;interno.<br />
In pratica l&#8217;<strong>unico indizio</strong> visivo del link all&#8217;interno di una certa porzione di immagine, che viene dato all&#8217;utente, <strong>è il cursore</strong>.<br />
Non è possibile anche solo applicare bordi.<br />
Tutto questo fondamentalmente perchè il tag map permette di creare aree di tipo &#8220;rect&#8221; (e non sarebbe un problema per un browser disegnarne il bordo), &#8220;circle&#8221;, &#8220;poly&#8221;.<br />
Quindi il browser dovrebbe saper disegnare (canvas).</p>
<p>Altro limite, ma non direttamente del tag, è la difficoltà di scrivere le coordinate.</p>
<h3>ALTERNATIVE AL TAG MAP</h3>
<p><a href="http://www.alistapart.com/articles/cssmaps/" target="_blank">Listapart</a> ci aveva già pensato, e suggerisce di creare qualcosa di completamente diverso. Javascript legge una lista, disegna dei punti in posizione assoluta, e al click (o al mouseover) visulizza un tooltip.</p>
<p>L&#8217;idea è quella.</p>
<p>Siccome il mio problema comunque, era di dare in mano ad un redattore uno strumento per inserire i punti, ho iniziato a fare scouting di plugins che disegnassero aree sopra un&#8217; immagine.</p>
<h3>JQUERY JCROP</h3>
<p>Ecco che arrivo a <a href="http://deepliquid.com/projects/Jcrop/demos.php" target="_blank">Jcrop</a>.</p>
<p>Jcrop è un plugin <a href="http://jquery.com/" target="_blank">jQuery</a> principalmente pensato per tagliare immagini.</p>
<p>Inizialmente non pensavo di usarlo come sostituto dei tag map/area.</p>
<p>Pensavo solo di usare le coordinate che <a href="http://deepliquid.com/projects/Jcrop/demos.php?demo=handler" target="_blank">restuitiva</a>, salvarle nel database e successivamente creare le aree lato &#8220;frontoffice&#8221; leggendo dal database le coordinate salvate dal redattore della mappa.</p>
<p>Quindi l&#8217;avevo scelto come strumento di backoffice.</p>
<p><a href="http://deepliquid.com/projects/Jcrop/demos.php?demo=handler" target="_blank">Qui</a> un semplice utilizzo di Jcrop con le coordinate restituite in campi form.</p>
<h3>JCROP COME SOSTITUTO DEL TAG MAP</h3>
<p>Alla fine anche per la presentazione ho deciso di provare ad utilizzare il plugin.</p>
<p><a href="http://maxb.net/scripts/jcropmap/demo.html" target="_blank">Questo</a> è il risultato.</p>
<p>Una serie di link presi da una lista con le coordinate passate via <a href="http://docs.jquery.com/Plugins/Metadata" target="_blank">metadata</a>.</p>
<p>L&#8217;implementazione è  semplice (anche se le coordinate non sono proprio user-frendly).</p>
<h3>L&#8217;ESEMPIO BASE</h3>
<p><strong>Il container:</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;div class=&quot;jcropmap&quot;&gt;&lt;/div&gt;
</pre>
<p><strong>L&#8217;immagine:</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;img src=&quot;img/italia2006.jpg&quot; alt=&quot;italia2006&quot; /&gt;
</pre>
<p><strong>La lista di aree: </strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
	&lt;li&gt;&lt;a class=&quot;{coords : [33,111,75,176,42,65]}&quot; href=&quot;#&quot;&gt;Gattuso&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [93,104,144,180,51,76]}&quot; href=&quot;#&quot;&gt;Pirlo&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [171,103,224,183,53,80]}&quot; href=&quot;#&quot;&gt;Zambrotta&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [245,102,318,191,73,89]}&quot; href=&quot;#&quot;&gt;Camoranesi&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [326,100,397,190,71,90]}&quot; href=&quot;#&quot;&gt;Cannavaro&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [402,98,456,174,54,76]}&quot; href=&quot;#&quot;&gt;Perrotta&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [410,14,464,90,54,76]}&quot; href=&quot;#&quot;&gt;Totti&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [345,7,399,83,54,76]}&quot; href=&quot;#&quot;&gt;Grosso&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [274,4,328,80,54,76]}&quot; href=&quot;#&quot;&gt;Toni&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [211,4,265,80,54,76]}&quot; href=&quot;#&quot;&gt;Barzagli&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a class=&quot;{coords : [149,2,203,78,54,76]}&quot; href=&quot;#&quot;&gt;Buffon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p><strong>Il JS NELL&#8217;HEAD:</strong></p>
<pre class="brush: jscript; title: ; notranslate">
jQuery(window).load(function(){
	jQuery(&quot;.jcropmap&quot;).jcropmap();
});
</pre>
<p>NB:</p>
<p>non ci sono regole forti per questo plugin per la struttura html. L&#8217; importante è scegliere una classe o un id per il wrapper container e richiamarla nell&#8217;head quando si avvia il costruttore. All&#8217;interno di questo wrapper ricordarsi solo che i link vengono cercati all&#8217;interno di un ul, e l&#8217;immagine DEVE avere come classe jcropbox (sovrascrivibile da opzione).</p>
<h3>CREARE LE AREE</h3>
<p>Visto che non è proprio semplice scrivere le coordinate delle aree, ho creato una <a href="http://maxb.net/scripts/jcropmap/edit.html" target="_blank">demo</a> con una banale gestione della sessione.</p>
<p><strong>Questa demo non è un plugin</strong>.</p>
<p>E&#8217; solo uno <strong>spunto</strong> per crearsi la propria gestione dei link.</p>
<p>Sarà quindi necessario implementare un servizio che ad esempio salvi le informazioni su db.</p>
<h3>VISUALIZZARE IL RISULTATO</h3>
<p>Una volta inserite le coordinate nella <a href="http://maxb.net/scripts/jcropmap/edit.html" target="_blank">demo</a> precedente, potrete vedere il risultato dei vostri &#8220;tag&#8221; <a href="http://maxb.net/scripts/jcropmap/show.html" target="_blank">qui</a>.</p>
<h3>EXTRA : SHAPES, OPTIONS, RELEASE</h3>
<p>Ho aggiunto anche la possibilità di visualizzare le aree all&#8217;interno del &#8220;viewport&#8221; di Jcrop, e di sovrascrivere le opzioni che vengono passate. Un <a href="http://maxb.net/scripts/jcropmap/demo2.html" target="_blank">esempio</a>.</p>
<p><a href="http://maxb.net/scripts/jcropmap/release.html" target="_blank">Qui</a> invece mostro come ho agganciato il metodo release dell&#8217;oggetto costruito all&#8217;interno del plugin (click sul body).</p>
<p>Non è una tecnica pulitissima. Ma nemmeno quella di Jcrop mi sembra elegante.</p>
<h3>FEEDBACK</h3>
<p>Se ci sarà un certo riscontro a questo post, magari versionerò il plugin, esporrò meglio le opzioni, e magari anche un API pubblica di metodi.</p>
<p>Fino ad allora per maggiori informazioni o chiedete qui postando un commento, oppure guardate il <a href="http://maxb.net/scripts/jcropmap/jcropmap.js" target="_blank">codice sorgente</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://maxb.net/blog/2009/11/12/un-idea-di-plugin-jcropmap/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ahah &amp; unobtrusive javascript</title>
		<link>http://maxb.net/blog/2009/07/27/ahah-unobtrusive-javascript/</link>
		<comments>http://maxb.net/blog/2009/07/27/ahah-unobtrusive-javascript/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 12:59:15 +0000</pubDate>
		<dc:creator>Massimiliano Balestrieri</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[ahah]]></category>
		<category><![CDATA[ajaxstop]]></category>
		<category><![CDATA[authoring]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://maxb.net/blog/?p=410</guid>
		<description><![CDATA[DEMO il problema soluzione &#8220;manuale&#8221; (responsabilità dello sviluppatore) soluzione nel plugin (responsabilità affidata al plugin) IL PROBLEMA DEMO SORGENTE Javascript non intrusivo ha un problema di fondo. Lavorando sull&#8217;evento window.onload, i componenti javascript non intrusivi, NON si attivano nel momento &#8230; <a href="http://maxb.net/blog/2009/07/27/ahah-unobtrusive-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1>DEMO</h1>
<ul>
<li><a href="http://maxb.net/scripts/ahah_issue/ahah.html" target="_blank">il problema</a></li>
<li><a href="http://maxb.net/scripts/ahah_issue/solution1.html" target="_blank">soluzione &#8220;manuale&#8221;</a> (responsabilità dello sviluppatore)</li>
<li><a href="http://maxb.net/scripts/ahah_issue/solution2.html" target="_blank">soluzione nel plugin</a> (responsabilità affidata al plugin)</li>
</ul>
<h1>IL PROBLEMA</h1>
<ul>
<li><a href="http://maxb.net/scripts/ahah_issue/ahah.html" target="_blank">DEMO</a></li>
<li><a href="http://maxb.net/scripts/ahah_issue/lib/plugins.js.html" target="_blank">SORGENTE</a></li>
</ul>
<p>Javascript non intrusivo ha un problema di fondo.<br />
Lavorando sull&#8217;evento window.onload, i componenti javascript non intrusivi,<strong> NON si attivano nel momento in cui viene fatta un&#8217; iniezione html nel DOM (<a href="http://en.wikipedia.org/wiki/AHAH" target="_blank">AHAH</a>)</strong>.</p>
<p><a href="http://maxb.net/scripts/ahah_issue/ahah.html" target="_blank">Qui</a> ho scritto un banale esempio.</p>
<p>Il <a href="http://maxb.net/scripts/ahah_issue/lib/plugin.js" target="_blank">plugin</a> aggiunge le funzionalità draggable e resizable (jQuery UI) agli elementi HTML selezionati.</p>
<p>Il plugin come &#8220;comportamento di default&#8221; agisce su tutti gli elementi con classe &#8220;box&#8221; :</p>
<pre class="brush: jscript; title: ; notranslate">
$(document).ready(function(){
	$(&quot;.box&quot;).myplugin();
});
</pre>
<p>Quindi nella demo tutti gli elementi con classe &#8220;box&#8221; saranno draggabili e ridimensionabili.</p>
<p>Il link ADD, nella <a href="http://maxb.net/scripts/ahah_issue/ahah.html" target="_blank">DEMO</a>, aggiunge elementi box via ajax (<a href="http://en.wikipedia.org/wiki/AHAH" target="_blank">AHAH</a>):</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#add&quot;).click(function(){
    $.ajax({
        url     : 'box.html',
        success : function(html){
            $(&quot;body&quot;).append($(html).myplugin());
        }
    });
});
</pre>
<p>Questi elementi arrivando da un iniezione HTML non vengono &#8220;arricchiti&#8221; dal plugin (non sono quindi ridimensionabili ne trascinabili) perchè non sono presenti al window.onload (al document.ready per chi usa jquery).</p>
<p>Questo problema non si avvertirebbe se il componente fosse intrusivo (js cablato nell&#8217;html):</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;box1&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
$(&quot;#box1&quot;).myplugin();
//]]&gt;
&lt;/script&gt;
</pre>
<p>Se io iniettassi il codice qui sopra il box si attiverebbe perchè verrebbe valutato il js (almeno se iniettato via jquery) immediatamente senza eventi onload di mezzo.</p>
<p>Spesso i framework server-side sono intrusivi proprio per essere più flessibili.<br />
Il codice html generato sarà sporco (richfaces ad esempio) ma i componenti saranno sempre &#8220;funzionanti&#8221; sia al primo caricamento sia a seguito di iniezioni html.</p>
<h1>SOLUZIONE MANUALE</h1>
<ul>
<li><a href="http://maxb.net/scripts/ahah_issue/solution1.html" target="_blank">DEMO</a></li>
</ul>
<p>La soluzione &#8220;manuale&#8221; (a carico dello sviluppatore che implementa il comportamento e <strong>USA</strong> il plugin) è attivare le funzionalità js prima di appendere il nuovo pezzo di html. <a href="http://maxb.net/scripts/ahah_issue/solution1.html" target="_blank">DEMO</a></p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#add&quot;).click(function(){
    $.ajax({
        url     : 'box.html',
        success : function(html){
            $(&quot;body&quot;).append($(html).myplugin());
        }
    });
});
</pre>
<p>Questa è la soluzione che più di frequente utilizzo. </p>
<p>Se invece avessi scritto il plugin ecco come potrei fare (quindi spostando la responsabilità al plugin stesso).</p>
<h1>SOLUZIONE AUTOMATICA</h1>
<ul>
<li><a href="http://maxb.net/scripts/ahah_issue/ahah.html" target="_blank">DEMO</a></li>
<li><a href="http://maxb.net/scripts/ahah_issue/lib/solution.js.html" target="_blank">SORGENTE</a></li>
</ul>
<p>L&#8217;idea è : quello che attivo al document.ready lo attivo anche all&#8217;evento ajaxStop (quindi inizializzo il plugin sia al window.onload sia alla chiusura di ogni chiamata ajax).</p>
<pre class="brush: jscript; title: ; notranslate">
$(document)
.ready(function(){
    $(&quot;.box&quot;).myplugin();
})
.ajaxStop(function(){
    $(&quot;.box&quot;).myplugin();
});
</pre>
<p>Il problema di questa soluzione è che applicando 2 volte ad un elemento lo stesso plugin si &#8220;rischia&#8221; spesso di ottenere degli effetti indesiderati (doppi eventi al click, interfaccia che si moltiplica a mo&#8217; di matrioska, ecc&#8230;).</p>
<p>La soluzione quindi è realizzare un qualche sistema di singleton all&#8217;elemento che si arrichisce.<br />
Nel <a href="http://maxb.net/scripts/ahah_issue/solution2.html#">plugin</a> finale ho scritto un banale if che aggiunge una certa classe (flag) all&#8217;elemento arricchito.<br />
Se un evento (ajaxStop) invoca il costruttore del plugin più volte il codice non verrà eseguito.</p>
<pre class="brush: jscript; title: ; notranslate">
//singleton
if ($(that).is(&quot;.myplugin&quot;)) {
   return;
} else {
   $(that).addClass(&quot;.myplugin&quot;);
}
//plugin code...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://maxb.net/blog/2009/07/27/ahah-unobtrusive-javascript/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

