<?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>jblog &#187; Usabilità</title>
	<atom:link href="http://jblog.it/category/usabilita/feed" rel="self" type="application/rss+xml" />
	<link>http://jblog.it</link>
	<description>News e appunti per webmaster</description>
	<lastBuildDate>Tue, 25 May 2010 16:16:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jConfirmAction: finestre di dialogo &#8220;confirm&#8221; comode e personalizzate</title>
		<link>http://jblog.it/2010/05/17/jconfirmaction-plugin-jquery-dialog-box-finestre-dialogo-confirm-accessibili-usabili-leggere-personalizzabili_880.html</link>
		<comments>http://jblog.it/2010/05/17/jconfirmaction-plugin-jquery-dialog-box-finestre-dialogo-confirm-accessibili-usabili-leggere-personalizzabili_880.html#comments</comments>
		<pubDate>Mon, 17 May 2010 13:12:14 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Usabilità]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[confirm]]></category>
		<category><![CDATA[dialog box]]></category>
		<category><![CDATA[finestra di dialogo]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=880</guid>
		<description><![CDATA[jConfirmAction è un ottimo plugin jQuery che permette di inserire facilmente delle dialog box di tipo "confirm" (quelle con i 2 pulsanti "ok" e "annulla") molto più belle di quelle di default e molto più usabili.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-886" title="jConfirmAction Plugin" src="http://jblog.it/wp-content/uploads/2010/05/jconfirmX.gif" alt="jconfirmX jConfirmAction: finestre di dialogo confirm comode e personalizzate" width="540" height="149" /></p>
<p><a title="WebStuffShare | jConfirmAction" href="http://www.webstuffshare.com/2010/03/jquery-plugin-jconfirmaction/" target="_blank">jConfirmAction</a> è un ottimo <strong>plugin jQuery</strong> che permette di inserire facilmente delle dialog box di tipo &#8220;confirm&#8221; (quelle con i 2 pulsanti &#8220;ok&#8221; e &#8220;annulla&#8221;) molto più gradevoli di quelle di default e molto più <strong>comode per l&#8217;utente</strong>.</p>
<p><span class="highlight_green"><strong>Leggero.</strong></span> Il plugin è molto leggero: ha una dimensione di 1,21 kb (non compresso).</p>
<p><span class="highlight_green"><strong>Accessibile.</strong></span> Uno dei maggiori vantaggi è che funziona anche in caso di <strong>javascript disabilitato</strong>. Questo perché al tag &lt;a&gt; viene comunque impostato l&#8217;attributo href ma il plugin si occupa di bloccarne il comportamento di default con la funzione preventDefault(). A proposito dell&#8217;accessibilità con javascript ti consiglio di leggere <a title="Javascript e accessibilità - blog.html.it" href="http://blog.html.it/10/05/2010/javascript-e-accessibilita/" target="_blank">questo articolo</a>.</p>
<p><span class="highlight_green"><strong>Migliora l&#8217;esperienza dell&#8217;utente.</strong></span> Una classica finestra di dialogo di tipo &#8220;confirm&#8221; appare sempre al centro della pagina. Questo comportamento potrebbe infastidire l&#8217;utente a causa del continuo via vai del mouse tra il link cliccato e il centro della pagina per cliccare &#8220;ok&#8221; o &#8220;annulla&#8221;. Il plugin jConfirmAction fa apparire la dialog box sopra il link cliccato, quindi con uno <strong>spostamento di pochi pixel</strong> l&#8217;utente arriva sui due pulsanti della dialog box. Se ciò ti sembra ininfluente pensa a una situazione in cui l&#8217;utente deve <em>rispondere continuamente a più di una dialog box</em>&#8230;</p>
<p><span class="highlight_green"><strong>Semplice per il web designer.</strong></span> L&#8217;utilizzo di base del plugin richiede solo un paio di minuti per sistemare il link allo script, le righe di codice css e le immagini all&#8217;interno dei file e delle directory del sito.</p>
<p><span class="highlight_green"><strong>Personalizzabile.</strong></span> Un aspetto che ho particolarmente apprezzato è la semplicità nella <strong>personalizzazione totale</strong> del plugin. Praticamente, in pochi passi, è possibile adattare alle proprie esigenze tutte le caratteristiche e i comportamenti del plugin: testi, immagini, css, html del box, codice javascript del plugin jquery.</p>
<p><span id="more-880"></span><!--adv300--></p>
<h2>La classica finestra &#8220;confirm&#8221;</h2>
<p><img class="alignnone size-full wp-image-882" title="dialog box confirm" src="http://jblog.it/wp-content/uploads/2010/05/basic_confirm.gif" alt="basic confirm jConfirmAction: finestre di dialogo confirm comode e personalizzate" width="540" height="162" /></p>
<p>Per valutare meglio il plugin è utile mostrare la <strong>classica dialog box &#8220;confirm&#8221;</strong> e il codice (javascript e jquery) per implementarla.</p>
<h4>&lt;Body&gt; e link</h4>
<pre>&lt;body&gt;
   &lt;a href="delete.html" id="delete_link"&gt;Delete me&lt;/a&gt;
&lt;/body&gt;</pre>
<h4>La dialog box &#8220;confirm&#8221; con jquery</h4>
<pre>&lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;

      $(document).<strong>ready</strong>(function() {

         <strong>$('#delete_link').click(function(e)</strong> {

            // Evita che si attivi automaticamente il link
	    // alla pagina linkata (delete.html)
            <strong>e.preventDefault();</strong>

            // Imposta la variabile "thisHref"
            // (la variabile non è necessaria perché si potrebbe
	    //  scrivere "window.location=$(this).attr('href')")
            thisHref = $(this).attr('href');

            // Chiama una finestra di dialogo "confirm" con la
	    // domanda "Are you sure?"
            //    --&gt; se si clicca su "ok" effettua un redirect
	    //        alla pagina linkata (delete.html)
            <strong>if(confirm('Are you sure?'))
               window.location = thisHref;</strong>
         });
      });
&lt;/script&gt;</pre>
<h4>Demo e download</h4>
<p>Per provare lo script: <a href="http://test.jblog.it/basicconfirm/" target="_blank">http://test.jblog.it/basicconfirm/</a></p>
<p>Per scaricare lo script: <a href="http://download.jblog.it/basicconfirm.zip" target="_blank">http://download.jblog.it/basicconfirm.zip</a></p>
<h2>Il plugin jConfirmAction</h2>
<p><img class="alignnone size-full wp-image-883" title="jconfirmaction 1" src="http://jblog.it/wp-content/uploads/2010/05/jconfirm1.gif" alt="jconfirm1 jConfirmAction: finestre di dialogo confirm comode e personalizzate" width="540" height="126" /></p>
<h4>&lt;Body&gt; e link (uguale a quello per la classica &#8220;confirm&#8221;)</h4>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;">&lt;body&gt;
   &lt;a href="delete.html" id="delete_link"&gt;Delete me&lt;/a&gt;
&lt;/body&gt;</pre>
<h4>Implementazione base di jConfirmAction</h4>
<pre><strong>&lt;-- CSS per la formattazione della finestra di dialogo --&gt;</strong>
&lt;link rel="stylesheet" type="text/css" href="jconfirmaction.css" /&gt;

<strong>&lt;!-- JS SCRIPT: jquery, plugin jconfirmaction --&gt;</strong>
&lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jconfirmaction.jquery.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;

      $(document).<strong>ready</strong>(function() {

<strong><span style="font-weight: normal;">         </span>$('#delete_link').jConfirmAction({</strong>
             // personalizzazione del testo
             question : "Are you sure?",
             yesAnswer : "OK",
             cancelAnswer : "Annulla"
         });
      });
&lt;/script&gt;</pre>
<h4>Demo e download</h4>
<p>Anche se sul sito del plugin c&#8217;é una pagina dimostrativa ho voluto creare una demo svuotata di tutte le cose superflue in modo da evidenziare meglio il funzionamento del plugin.</p>
<p>Per provare lo script: <a href="http://test.jblog.it/jconfirmaction/" target="_blank">http://test.jblog.it/jconfirmaction/</a></p>
<p>Per scaricare lo script: <a href="http://download.jblog.it/jconfirmaction.zip" target="_blank">http://download.jblog.it/jconfirmaction.zip</a></p>
<h3>Grafica</h3>
<p><img class="alignnone size-full wp-image-893" title="jconfirm2-2" src="http://jblog.it/wp-content/uploads/2010/05/jconfirm2-2.gif" alt="jconfirm2 2 jConfirmAction: finestre di dialogo confirm comode e personalizzate" width="540" height="133" /></p>
<p>Per visualizzare correttamente il &#8220;fumetto&#8221; della dialog box abbiamo bisogno di <strong>almeno 2 componenti grafici</strong>:</p>
<ul>
<li>contenitore del testo e dei pulsanti &#8220;ok&#8221; e &#8220;annulla&#8221;</li>
<li>sfondo del singolo pulsante</li>
</ul>
<h3>CSS</h3>
<p><img class="alignnone size-full wp-image-892" title="jconfirm3-2" src="http://jblog.it/wp-content/uploads/2010/05/jconfirm3-2.gif" alt="jconfirm3 2 jConfirmAction: finestre di dialogo confirm comode e personalizzate" width="540" height="126" /></p>
<p>Questo plugin ha bisogno di <strong>alcune righe di codice css</strong> che naturalmente possiamo sistemare in un apposito file o incollare nel principale file .css del nostro sito (consiglio quest&#8217;ultima pratica per evitare la richiesta http dovuta al singolo file .css per il plugin).</p>
<p><span class="highlight_red"><strong>CONFLITTUALITA&#8217;.</strong> Il problema è che i nomi delle classi sono abbastanza comuni e potremmo averli già utilizzati per altre classi. La <strong>soluzione</strong> è quella di andare a modificare direttamente il codice html della dialog box che si trova all&#8217;interno del file .js del plugin, come vedremo in seguito.</span></p>
<pre>/* CONTENITORE PRINCIPALE */
<strong>.question</strong> {
	position: absolute;
	display: inline;
	text-align: center;
	width: 174px;
	height: 78px;
	font-size: 13px;
	line-height: 1.5em;
	/* immagine del contenitore del "fumetto" */
	<strong>background</strong>: url('images/bubble.png') left top no-repeat;
	padding: 10px 0 0 0;
	text-shadow: 0px 1px 0px #fff;
	margin-left: -7em;
	margin-top: -6em;
	opacity: 0;
}

/* PULSANTI */
<strong>.yes</strong>, <strong>.cancel</strong> {
	margin-top: .5em;
	margin-right: .5em;
	cursor: pointer;
	display: inline-block;
	width: 63px;
	height: 21px;
	color: #fff;
	text-shadow: 0px 1px 0px #000;
	/* immagine del pulsante */
	<strong>background</strong>: url('images/button.png') left top no-repeat;
}</pre>
<h3>HTML</h3>
<p>L&#8217;html relativa al box del &#8220;fumetto&#8221; è <strong>molto semplice</strong>, quindi non credo che avrai grossi problemi se andrai a modificare la struttura del box.</p>
<p>Un <strong>buon motivo</strong> per modificare l&#8217;html è quello di evitare le possibili <strong>conflittualità con le classi del css</strong>, modificando i nomi delle classi associate ai div in nomi meno generici.</p>
<p>Nel file del plugin la parte relativa al <strong>codice html del box</strong> è questa:</p>
<pre>$(this).after(
'&lt;div class="question"&gt;'+theOptions.question+'&lt;br/&gt;
     &lt;span class="yes"&gt;'+theOptions.yesAnswer+'&lt;/span&gt;
     &lt;span class="cancel"&gt;'+theOptions.cancelAnswer+'&lt;/span&gt;
&lt;/div&gt;');</pre>
<h3>Un plugin alternativo</h3>
<p>Una valida alternativa è il plugin <strong><a title="jQuery Confirm Plugin" href="http://nadiana.com/jquery-confirm-plugin" target="_blank">jQuery Confirm</a></strong> sviluppato da Nadia Alramli.</p>
<p>La caratteristica che lo distingue da jConfirmAction è che quando si clicca sul link scompare il link e appare la domanda (con relativi link &#8220;ok&#8221; e &#8220;annulla&#8221;).</p>
<p>Sicuramente è <strong>molto più leggero di jConfirmAction</strong> in quanto non richiede immagini e codice css. Inoltre ha moltissime opzioni che consentono di adattarlo al meglio alle esigenze del sito.</p>
<p>Fra i due plugin (che sostanzialmente fanno la stesse cose) io <strong>continuo a preferire jConfirmAction</strong> perché esteticamente il fumetto è più bello! <img src='http://jblog.it/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="jConfirmAction: finestre di dialogo confirm comode e personalizzate" /> </p>
<img src="http://jblog.it/?ak_action=api_record_view&id=880&type=feed" alt=" jConfirmAction: finestre di dialogo confirm comode e personalizzate"  title="jConfirmAction: finestre di dialogo confirm comode e personalizzate" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2010/05/17/jconfirmaction-plugin-jquery-dialog-box-finestre-dialogo-confirm-accessibili-usabili-leggere-personalizzabili_880.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Come riciclare inutili &#8220;listoni&#8221; in titoli e contenuti più usabili</title>
		<link>http://jblog.it/2010/05/10/riciclare-inutili-listoni-post-lunghi-titoli-convincenti-contenuti-usabili_852.html</link>
		<comments>http://jblog.it/2010/05/10/riciclare-inutili-listoni-post-lunghi-titoli-convincenti-contenuti-usabili_852.html#comments</comments>
		<pubDate>Mon, 10 May 2010 05:00:01 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Usabilità]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[feed reader]]></category>
		<category><![CDATA[scrittura web]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=852</guid>
		<description><![CDATA[Scorrendo i feed con Google Reader mi capita di leggere dei titoli abbastanza assurdi. Risultato: non leggo il post! A primo impatto potresti pensare: "sei pazzo! con tutta quella roba che ti promettono non ci dai un'occhiata?!". Perché dovrei perder tempo a leggere un post enorme (pieno di link e di immagini da caricare) in cui potrei trovarci tutto e niente?]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-853" title="google reader" src="http://jblog.it/wp-content/uploads/2010/04/Senza-titolo-1.jpg" alt="Senza titolo 1 Come riciclare inutili listoni in titoli e contenuti più usabili" width="540" height="302" /></p>
<p>Scorrendo i feed con Google Reader mi capita di leggere dei <strong>titoli abbastanza assurdi</strong>. Risultato: non leggo il post! Ti spiego perché&#8230;</p>
<p>Per iniziare ti faccio <strong>un po&#8217; di esempi</strong>:</p>
<ul>
<li>&#8220;30 best icon tutorials&#8221;</li>
<li>&#8220;100+ web designer resources&#8221;</li>
<li>&#8220;the big list of html5, javascript and css3&#8243;</li>
<li>&#8220;ultimate collection of photoshop tutorials&#8221;</li>
<li>&#8220;top 60 wordpress resources&#8221;</li>
</ul>
<p>A primo impatto potresti pensare: &#8220;sei pazzo! con tutta quella roba che ti promettono non ci dai un&#8217;occhiata?!&#8221;.</p>
<p><strong>Perché dovrei perder tempo a leggere un post enorme (pieno di link e di immagini da caricare) in cui potrei trovarci tutto e niente?</strong></p>
<p><span id="more-852"></span><br />
<!--adv300--></p>
<p>Questo è il punto di vista di chi segue<em> <strong>più di 100 feed al  giorno</strong></em>: in una situazione del genere è naturale che per non perdere  tempo bisogna essere molto selettivi per beccare i post migliori.</p>
<p>In generale, quando scorro i feed <strong>leggo solo i titoli dei post</strong> e successivamente vado a leggerli. Quindi il titolo ha un&#8217;importanza fondamentale per decidere se leggere o meno il  post, soprattutto se per leggerlo bisogna andare direttamente nel sito (o nel blog)! <strong class="highlight_orange">Fai così anche tu?</strong></p>
<p><strong>Alla cieca.</strong> Quando leggo un titolo del tipo &#8220;100+ web designer resources&#8221; mi chiedo &#8220;risorse riguardo cosa? software? script? grafica?&#8221; e finisco con un &#8220;boh&#8230; vabbè, andiamo avanti&#8230;&#8221;. Questo succede soprattutto perché <strong>una persona ha fretta di leggere solo le cose che le interessano</strong> e non andare all&#8217;esplorazione di qualcosa che non si conosce bene.</p>
<p><strong>Lettura faticosa. </strong>In questi tipi di post (aka &#8220;mega-liste&#8221; <img src='http://jblog.it/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="Come riciclare inutili listoni in titoli e contenuti più usabili" /> ) ci sono talmente tante cose che risulta difficile guardarle tutte, conservarle e catalogarle nei preferiti, taggarle nei social bookmarks, condividerle su facebook o su twitter, ecc.</p>
<p><strong>Lunghezza eccessiva.</strong> Hai idea di quanto sia lungo un post con 30 immagini e link!? E&#8217; un po&#8217; come per il <strong>&#8220;post definitivo&#8221;</strong> che viene spesso criticato a causa della sua lunghezza dato che non tutti hanno il tempo e la voglia di leggere un post di oltre 10 pagine.</p>
<p><strong class="highlight_red">Dare un titolo a un post del genere è veramente dura! Come si fa scrivere un titolo completo per un post che ha dei contenuti molto diversi fra loro?</strong></p>
<p><strong class="highlight_red">Ecco le 2 strade che seguo per evitare una situazione simile.</strong></p>
<h2>Alternativa 1: post grande, focalizzato su un particolare argomento</h2>
<p><img class="alignnone size-full wp-image-854" title="alternativa 1" src="http://jblog.it/wp-content/uploads/2010/04/2523555009_729d7e3a54_b.jpg" alt="2523555009 729d7e3a54 b Come riciclare inutili listoni in titoli e contenuti più usabili" width="540" height="361" /><br />
<small>Photo by Momentary Glimpse | <a href="http://www.flickr.com/photos/momentaryglimpse/2523555009/" target="_blank">http://www.flickr.com/photos/momentaryglimpse/25&#8230;</a></small></p>
<p>Tempo fa ho scritto un post-lista su dei pacchetti di icone che fossero abbastanza completi da soddisfare tutte le esigenze di un cms o di un sito medio-grande. Il post era abbastanza lungo ma nel titolo ho cercato di chiarire l&#8217;idea scrivendo &#8220;pacchetti di icone completi e definitivi&#8221;. (Spero di esserci riuscito&#8230;)</p>
<p>Se proprio vuoi pubblicare un post lungo:</p>
<ul>
<li><strong>focalizzati </strong>su un particolare settore o argomento</li>
<li>spendi 5 minuti in più per scrivere un <strong>buon titolo</strong> che fornisca una chiara <strong>presentazione dei contenuti</strong></li>
</ul>
<p><strong>Un esempio?</strong> &#8220;Link Checker Tools &amp; Broken Link Checking Software Mega List&#8221;: dalle parole &#8220;mega list&#8221; si capisce che non è un post da 2 righe, però è chiaro come i contenuti siano estremamente focalizzati sull&#8217;argomento &#8220;link checking&#8221;.</p>
<h2>Alternativa 2: dividilo in post più piccoli</h2>
<p><img class="alignnone size-full wp-image-855" title="alternativa 2" src="http://jblog.it/wp-content/uploads/2010/04/2714646118_55a4576006_b.jpg" alt="2714646118 55a4576006 b Come riciclare inutili listoni in titoli e contenuti più usabili" width="540" height="360" /><br />
<small>Photo by Chapendra | <a href="http://www.flickr.com/photos/chaparral/2714646118/" target="_blank">http://www.flickr.com/photos/chaparral/2714646118/</a></small></p>
<p>Per esempio, prendiamo il post &#8220;the big list of html5, javascript and css3&#8243;. Leggendo un titolo del genere mi immagino un&#8217;insalata di codici,  tutorial, immagini, librerie, script, ecc. Perché dovrei stressarmi fra decine e decine di link?!</p>
<p><strong>Divisione per argomenti.</strong> A una prima occhiata il post &#8220;the big  list of html5, javascript and css3&#8243; potresti dividerlo in 3 post  riguardanti gli argomenti principali che si leggono dal titolo: html5, javascript, css3. Tuttavia, la divisione per argomenti è un po&#8217; &#8220;ignorante&#8221;, nel senso che si  limita solo a &#8220;spezzettare il post&#8221;.</p>
<p><strong>Divisione per idee e soluzioni.</strong> Se i contenuti lo  permettono, puoi effettuare una <em>divisione trasversale</em> del post, cioé dividerlo in post più piccoli rielaborando addirittura il senso di tutto quell&#8217;ammasso di roba. Ad <strong>esempio</strong>, dal post &#8220;the big list of html5, javascript and css3&#8243; potresti ricavarne un altro sui &#8220;menù di  navigazione&#8221; e il titolo diventerebbe &#8220;navigation menu with html5,  javascript and css3&#8243;.</p>
<p>Dividere un post molto lungo in post più piccoli ha almeno <strong>3 vantaggi</strong>:</p>
<ul>
<li>scrittura immediata di <strong>titoli più dettagliati</strong></li>
<li><strong>molti post da pubblicare </strong><strong>in più giorni</strong> senza &#8220;bruciare&#8221; un post molto grande in un solo giorno</li>
<li>maggiore probabilità che gli articoli vengano <strong>letti per intero</strong></li>
</ul>
<h2>Conclusione</h2>
<p>So benissimo che <strong>dietro la scrittura di un titolo (e di un post) ci sono tanti altri fattori</strong>: marketing, seo, scrittura web, ecc. Questo è solo un piccolo tassello di un enorme puzzle di linee guida sulla scrittura di post.</p>
<p><strong class="highlight_green">Quando leggi i feed, quanto sono importanti per te i titoli? Secondo te il &#8220;listone&#8221; inteso come &#8220;ammasso di contenuti&#8221; resta  comunque  un ottimo post? Pensi sia un bene il fatto di dividere e ottimizzare i &#8220;listoni&#8221;?</strong></p>
<img src="http://jblog.it/?ak_action=api_record_view&id=852&type=feed" alt=" Come riciclare inutili listoni in titoli e contenuti più usabili"  title="Come riciclare inutili listoni in titoli e contenuti più usabili" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2010/05/10/riciclare-inutili-listoni-post-lunghi-titoli-convincenti-contenuti-usabili_852.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>10 formati di banner e annunci da evitare</title>
		<link>http://jblog.it/2009/06/19/10-formati-banner-annunci-ads-da-evitare-odiati_702.html</link>
		<comments>http://jblog.it/2009/06/19/10-formati-banner-annunci-ads-da-evitare-odiati_702.html#comments</comments>
		<pubDate>Fri, 19 Jun 2009 02:48:17 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Usabilità]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[adsense]]></category>
		<category><![CDATA[annunci]]></category>
		<category><![CDATA[banner]]></category>
		<category><![CDATA[guadagnare]]></category>
		<category><![CDATA[promuovere]]></category>
		<category><![CDATA[pubblicità]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=702</guid>
		<description><![CDATA[Se stai considerando l&#8217;idea di inserire un po&#8217; di banner e annunci sul tuo sito ti consiglio di leggere questo interessante articolo pubblicato su Business Insider in cui vengono classificati i formati più odiati dagli utenti.
L&#8217;articolo è stato strutturato molto bene in quanto descrive i 10 formati incriminati fornendo lo screenshot del sito che lo [...]]]></description>
			<content:encoded><![CDATA[<p><a title="10 formati di banner e annunci da evitare" href="http://jblog.it/2009/06/19/10-formati-banner-annunci-ads-da-evitare-odiati_702.html"><img class="alignright size-full wp-image-703" src="http://jblog.it/wp-content/uploads/2009/10/anger.jpg" alt="anger 10 formati di banner e annunci da evitare" width="196" height="214" title="10 formati di banner e annunci da evitare" /></a>Se stai considerando l&#8217;idea di inserire un po&#8217; di banner e annunci sul tuo sito ti consiglio di leggere <a title="The 10 Online Ad Formats People Hate Most" href="http://www.businessinsider.com/10-online-ad-formats-people-hate-most-2009-6" target="_blank"><strong>questo interessante articolo</strong></a> pubblicato su <strong><em>Business Insider </em></strong>in cui vengono classificati i formati più odiati dagli utenti.</p>
<p>L&#8217;articolo è stato strutturato molto bene in quanto descrive i 10 formati incriminati fornendo lo <strong>screenshot</strong> del sito che lo utilizza, il tutto all&#8217;interno di una bellissima <strong><a title="Slideshow" href="http://www.businessinsider.com/10-online-ad-formats-people-hate-most-2009-6/banner-ad-below-header-1" target="_blank">slide-show</a></strong>.<span id="more-702"></span></p>
<h4>1. Banner sotto l&#8217;header</h4>
<p>Spacca in due la pagina e sposta più in basso il suo vero contenuto.</p>
<h4>2. Annunci simili al contenuto</h4>
<p>Sono ingannevoli e causano l&#8217;abbandono involontario del sito da parte dell&#8217;utente.</p>
<h4>3. Annunci animati</h4>
<p>Provoca distrazione e, poiché sono di bassa qualità, riduce la credibilità del sito.</p>
<h4>4. Annuncio espandibile al centro della pagina</h4>
<p>Obbliga l&#8217;utente a cliccare sul pulsante &#8220;chiudi&#8221;, interrompendo fastidiosamente la navigazione.</p>
<p><!--adv300--></p>
<h4>5. Banner vicini al logo</h4>
<p>Anche se ha il vantaggio di non interferire sulla struttura della pagina e, quindi, di non trascinare ulteriormente in basso il contenuto, riduce lo spazio riservato al logo diminuendo la chiarezza e la visibilità del brand.</p>
<h4>6. Banner ampio in alto a sinistra</h4>
<p>In molti casi, con un banner di questo tipo gli utenti si accorgono subito che non fa parte del reale contenuto della pagina.</p>
<h4>7. Google Ads testuali</h4>
<p>Interrompono il contenuto della pagina. Naturalmente il gestore del sito spera che vengano confusi con il contenuto e che, di conseguenza, vengano cliccati.</p>
<h4>8. Pulsante &#8220;chiudi&#8221; nascosto</h4>
<p>Spesso nei banner graficamente carini e animati si cerca di camuffare il pulsante &#8220;chiudi&#8221; o di ritardarne la sua apparizione. In questo caso gli utenti sono costretti a perdere tempo a cercarlo o a sorbirsi tutta l&#8217;animazione che generalmente è una sgradevole interruzione della navigazione.</p>
<h4>9. Banner &#8220;a tutto schermo&#8221;</h4>
<p>Questo tipo di banner occupa tutta l&#8217;area della pagina e obbliga l&#8217;utente a cliccare su &#8220;continua&#8221; (o qualcosa di simile) per accedere ai contenuti desiderati. Abbastanza &#8220;violenta&#8221; come soluzione.</p>
<h4>10. Annunci appariscenti e ben amalgamati</h4>
<p>Quando un banner o un annuncio assomiglia graficamente al sito e al suo contenuto tende a fondersi con la pagina risultando indistinguibile agli occhi dell&#8217;utente. In questo caso l&#8217;utente rimane disorientato, soprattutto se è un assiduo visitatore abituato al normale layout del sito.</p>
<p><em>Questa è solo una sintesi. Per leggere l&#8217;articolo originale e osservare i 10 screenshot dei siti che utilizzano questi formati vai su <a title="The 10 Online Ad Formats People Hate Most" href="http://www.businessinsider.com/10-online-ad-formats-people-hate-most-2009-6" target="_blank">http://www.businessinsider.com/10-online-ad-formats-people-hate-most-2009-6</a>.</em></p>
<p><strong><span class="highlight_green">Che ne pensi di questa lista? Secondo te è completa o avresti altri esempi negativi da aggiungere?</span></strong></p>
<img src="http://jblog.it/?ak_action=api_record_view&id=702&type=feed" alt=" 10 formati di banner e annunci da evitare"  title="10 formati di banner e annunci da evitare" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/06/19/10-formati-banner-annunci-ads-da-evitare-odiati_702.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Come utilizzare Ajax: librerie, framework, ottimizzazione, caching, usabilità</title>
		<link>http://jblog.it/2009/05/02/come-utilizzare-ajax-basi-librerie-framework-ottimizzazione-caching-usabilita_202.html</link>
		<comments>http://jblog.it/2009/05/02/come-utilizzare-ajax-basi-librerie-framework-ottimizzazione-caching-usabilita_202.html#comments</comments>
		<pubDate>Sat, 02 May 2009 09:39:15 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ottimizzazione]]></category>
		<category><![CDATA[Usabilità]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[classi librerie]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[ottimizzare]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=202</guid>
		<description><![CDATA[
Ajax è una tecnica di programmazione (non un linguaggio) che ti permette di sviluppare applicazioni web interattive. In pratica, grazie ad Ajax puoi aggiornare alcuni dati della pagina senza ricaricare completamente la pagina, migliorando le prestazioni del tuo sito.
In questo articolo: effettuare le richieste e gestire le risposte, formati per lo scambio dati, utilizzare librerie [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Come utilizzare Ajax: libreria, framework, ottimizzazione, caching, usabilità" rel="attachment wp-att-375" href="http://jblog.it/2009/05/02/come-utilizzare-ajax-basi-librerie-framework-ottimizzazione-caching-usabilita_202.html/18xokt04_ajax_logo_150_rgb" target="_self"><img class="alignright size-full wp-image-375" title="Ajax logo" src="http://jblog.it/wp-content/uploads/2009/05/18xokt04_ajax_logo_150_rgb.jpg" alt="Ajax logo" width="157" height="140" /></a></p>
<p>Ajax è una tecnica di programmazione (non un linguaggio) che ti permette di sviluppare applicazioni web interattive. In pratica, grazie ad Ajax puoi aggiornare alcuni dati della pagina senza ricaricare completamente la pagina, migliorando le prestazioni del tuo sito.</p>
<p><span class="highlight_yellow"><strong>In questo articolo</strong>: effettuare le richieste e gestire le risposte, formati per lo scambio dati, utilizzare librerie e framework javascript, memorizzare Ajax in cache, evitare risposte duplicate, migliorare l&#8217;usabilità delle applicazioni ajax.</span></p>
<p><span id="more-202"></span></p>
<p><strong>Il termine &#8220;Ajax&#8221; è l&#8217;acronimo di Asynchronous JavaScript and XML.</strong></p>
<p>Vedremo che, nonostante la tecnica Ajax preveda l&#8217;utilizzo di XML, si potranno utilizzare altri formati per lo scambio dati.</p>
<p>Il termine &#8220;Ajax&#8221; è stato coniato da <a href="http://www.jjg.net/" target="_blank">Jesse James Garret</a> nel post &#8220;<a href="http://www.adaptivepath.com/ideas/essays/archives/000385.php" target="_blank">Ajax: A New Approach to Web Applications</a>&#8220;, il 18 febbraio 2005.</p>
<h2>Cosa succede con e senza Ajax</h2>
<p><!--adv300--></p>
<p>Supponiamo di avere una pagina con un form composto da tre campi di testo: nome, cognome e telefono. Lo script lato-server deve ricevere i tre dati, cercarli nel database e stampare l&#8217;indirizzo associato.</p>
<p><strong>Importante.</strong> Generalmente, lo script utilizzato con una chiamata Ajax è diverso da quello utilizzato per l&#8217;esecuzione senza javascript.</p>
<h4>L&#8217;esecuzione standard dello script</h4>
<p><a rel="attachment wp-att-213" href="http://jblog.it/2009/05/02/come-utilizzare-ajax-basi-librerie-framework-ottimizzazione-caching-usabilita_202.html/attachment/1"><img class="size-full wp-image-213 alignnone" title="Esecuzione di uno script senza utilizzare Ajax" src="http://jblog.it/wp-content/uploads/2009/04/1.png" alt="Esecuzione di uno script senza utilizzare Ajax" width="600" height="170" /></a></p>
<p><em>N.B. i rettangoli tratteggiati indicano cosa viene caricato.</em></p>
<p><strong>P</strong><strong>rima fase.</strong> Si carica la pagina html, si scrivono i dati nel form e si inviano al server premendo il pulsante &#8220;invia&#8221;. Oltre a quelle dei dati, il server riceverà le richieste http degli altri componenti della pagina che dovranno essere ricaricati.</p>
<p><strong>Seconda fase.</strong> Il server cerca l&#8217;indirizzo nel database, e il browser <strong>ricarica completamente </strong>la pagina con i nuovi dati o con un messaggio di errore (es. &#8220;indirizzo non trovato&#8221;).</p>
<h4>L&#8217;esecuzione dello script utilizzando Ajax</h4>
<p><a rel="attachment wp-att-218" href="http://jblog.it/2009/05/02/come-utilizzare-ajax-basi-librerie-framework-ottimizzazione-caching-usabilita_202.html/attachment/2"><img class="alignnone size-full wp-image-218" title="Esecuzione di uno script ajax" src="http://jblog.it/wp-content/uploads/2009/04/2.png" alt="Esecuzione di uno script ajax" width="600" height="170" /></a></p>
<p><strong>Prima fase.</strong> Si carica la pagina html, si scrivono i dati nel form e si inviano al server premendo il pulsante &#8220;invia&#8221;. Al server arriva solo una richiesta http: quella dei dati inviati. Inoltre vengono stampati i componenti da mostrare successivamente  (&#8220;tutto ok!&#8221;, &#8220;i dati &#8230; correttamente&#8221;, ecc.) nascondendoli con le regole dei css.</p>
<p><strong>Seconda fase.</strong> Il server cerca l&#8217;indirizzo nel database e, una volta trovato, viene rispedito al browser che aggiornerà il componente riservato all&#8217;indirizzo. Gli altri contenuti stampati precedentemente (&#8220;tutto ok!&#8221;, &#8220;i dati &#8230; correttamente&#8221;, ecc.), vengono resi visibili, mentre i componenti relativi al form vengono nascosti. Per nascondere e mostrare i componenti si utilizzano le regole dei css.</p>
<h2>Framework e librerie javascript</h2>
<p>Un framework javascript è un <strong>insieme di librerie</strong> che facilita la scrittura di codice e applicazioni javascript.</p>
<p><strong>Perché utilizzare un framework?</strong></p>
<ul>
<li>Ti permette di scrivere in <strong>poche righe</strong> quello che in javascript &#8220;puro&#8221; richiderebbe centinaia di righe</li>
<li>Elimina il problema della <strong>compatibilità browser-javascript</strong> eseguendo istruzioni diverse a seconda del browser che si sta utilizzando</li>
</ul>
<p>Ecco i framework più famosi.</p>
<h5>Prototype</h5>
<p><img class="alignright size-full wp-image-227" title="Prototype is a JavaScript Framework that aims to ease development of dynamic web applications" src="http://jblog.it/wp-content/uploads/2009/04/prototype.png" alt="Prototype is a JavaScript Framework that aims to ease development of dynamic web applications" width="139" height="72" />Prototype is a JavaScript Framework that aims to ease development of dynamic web applications.</p>
<p><a href="http://www.prototypejs.org/" target="_blank">http://www.prototypejs.org/</a></p>
<h5>jQuery</h5>
<p><img class="alignright size-full wp-image-230" title="jQuery is a new kind of JavaScript Library." src="http://jblog.it/wp-content/uploads/2009/04/jquery.png" alt="jQuery is a new kind of JavaScript Library." width="226" height="59" />jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.</p>
<p><a href="http://jquery.com/" target="_blank">http://jquery.com/</a></p>
<h5>MooTools</h5>
<p><img class="alignright size-full wp-image-231" title="MooTools is a compact, modular, Object-Oriented JavaScript framework" src="http://jblog.it/wp-content/uploads/2009/04/mootools.png" alt="MooTools is a compact, modular, Object-Oriented JavaScript framework" width="249" height="74" />MooTools is a compact, modular, Object-Oriented JavaScript framework designed for the intermediate to advanced JavaScript developer. It allows you to write powerful, flexible, and cross-browser code with its elegant, well documented, and coherent API.</p>
<p><a href="http://mootools.net/" target="_blank">http://mootools.net/</a></p>
<h5>Dojo</h5>
<p><img class="alignright size-full wp-image-232" title="Dojo. Solve problems faster. Create better user experiences. Liberally licensed. Everything you need, all in one place." src="http://jblog.it/wp-content/uploads/2009/04/dojo.png" alt="Dojo. Solve problems faster. Create better user experiences. Liberally licensed. Everything you need, all in one place." width="147" height="32" />Solve problems faster. Create better user experiences. Liberally licensed. Everything you need, all in one place.</p>
<p><a href="http://dojotoolkit.org/" target="_blank">http://dojotoolkit.org/</a></p>
<h2>Ajax, jQuery e Php all&#8217;opera</h2>
<p>Generalmente un&#8217;applicazione Ajax è composta dalla pagina html e dallo script lato-server da richiamare successivamente via javascript.</p>
<p>Il framework che utilizzo è <a href="http://jquery.com/" target="_blank">jQuery</a>, soprattutto perché, nel complesso, è molto più leggero e veloce rispetto agli altri.</p>
<p>Analizziamo ora il codice dell&#8217;applicazione Ajax di cui ho parlato prima.</p>
<p><strong>Requisiti.</strong> Php 5.2, MySql 5, jQuery 1.3.</p>
<p><strong>Demo dell&#8217;applicazione. </strong>Puoi provare l&#8217;applicazione Ajax <a href="http://download.jblog.it/ajax_phone/" target="_blank">qui</a>.</p>
<h4>Pagina html e codice javascript</h4>
<p>Questa pagina si può dividere in due parti.</p>
<ul>
<li>codice html</li>
<li>codice javascript per la gestione delle chiamate ajax e del codice html</li>
</ul>
<p>Puoi vedere il file completo <a title="Pagina html e codice javascript" href="http://download.jblog.it/ajax_phone/index.txt" target="_blank">qui</a>.</p>
<h5>Html</h5>
<p>All&#8217;interno del tag &lt;body&gt; si possono distinguere due &lt;div&gt;. Il primo (id=&#8221;form_panel&#8221;) ospita il form e un &lt;h3&gt; per la scrittura degli errori (id=&#8221;errors&#8221;); il secondo (id=&#8221;address_panel&#8221;) ospita un &lt;div&gt; (id=&#8221;the_address&#8221;) in cui si scriverà l&#8217;indirizzo trovato.</p>
<pre lang="html">&lt;body&gt;
	&lt;!-- Area del form --&gt;
	&lt;div id="form_panel"&gt;
		&lt;h1&gt;INSERISCI I DATI&lt;/h1&gt;
		&lt;h3 id="errors" style="display:none;color:#CC0000;"&gt;&lt;/h3&gt;
		&lt;form action=""&gt;
			&lt;p&gt;
				&lt;div&gt;&lt;b&gt;Nome&lt;/b&gt; &lt;small&gt;(solo lettere)&lt;/small&gt;&lt;/div&gt;
				&lt;input id="firstname" name="firstname" type="text" value="" /&gt;
				&lt;small id="firstname_msg" style="color:#CC0000;"&gt;&lt;/small&gt;
			&lt;/p&gt;
			&lt;p&gt;
				&lt;div&gt;&lt;b&gt;Cognome&lt;/b&gt; &lt;small&gt;(solo lettere)&lt;/small&gt;&lt;/div&gt;
				&lt;input id="lastname" name="lastname" type="text" size="30" value="" /&gt;
				&lt;small id="lastname_msg" style="color:#CC0000;"&gt;&lt;/small&gt;
			&lt;/p&gt;
			&lt;p&gt;
				&lt;div&gt;&lt;b&gt;Telefono&lt;/b&gt; &lt;small&gt;(numeri, trattino "-", parentesi "(" e ")", spazio " ")&lt;/small&gt;&lt;/div&gt;
				&lt;input id="phone" name="phone" type="text" value="" /&gt;
				&lt;small id="phone_msg" style="color:#CC0000;"&gt;&lt;/small&gt;
			&lt;/p&gt;
			&lt;p&gt;&lt;input id="send" name="send" type="button" value="Invia" /&gt;&lt;/p&gt;
		&lt;/form&gt;
	&lt;/div&gt;

	&lt;!-- Area dell'indirizzo (trovato) --&gt;
	&lt;div id="address_panel" style="display:none;"&gt;
		&lt;h1&gt;INDIRIZZO&lt;/h1&gt;
		&lt;p id="the_address"&gt;&lt;/p&gt;

		&lt;a href="#" id="back_to_form"&gt;&amp;lt; indietro&lt;/a&gt;
	&lt;/div&gt;
&lt;/body&gt;</pre>
<h5>Javascript</h5>
<p>Il codice javascript viene scritto direttamente nel codice html, ma potrebbe essere scritto in un file esterno (.js).</p>
<p>Vengono specificate 3 funzioni e 3 variabili.</p>
<p><strong>$(document).ready(function(){ &#8230; }).</strong> In realtà, questa non è una funzione, ma un metodo di jQuery che, al posto dei &#8220;&#8230;&#8221;, consente di specificare il codice javascript da eseguire quando la pagina ha completato il caricamento.</p>
<p><strong>function form_check().</strong> Esegue dei controlli sui valori dei campi e restituisce &#8220;true&#8221; se non ci sono errori, altrimenti &#8220;false&#8221;.</p>
<p><strong>function form_ajax_send().</strong> Invia i dati del form allo script &#8220;myscript.php&#8221;, attende e gestisce la risposta.</p>
<p><strong>var form_msgs = new Array(&#8230;).</strong> Array degli errori relativi al form (es. &#8220;dati non corretti&#8221;).</p>
<p><strong>var error_msgs = new Array(&#8230;).</strong> Array degli errori relativi all&#8217;invio e alla risposta dei dati (es. &#8220;errore del db&#8221;).</p>
<p><strong>var regexps = new Array(&#8230;).</strong> Espressioni regolari utilizzate in form_check() per controllare i caratteri dei dati inseriti.</p>
<h5>L&#8217;oggetto XMLHttpRequest</h5>
<p>Per inviare richieste http dinamiche bisogna utilizzare l&#8217;oggetto XMLHttpRequest. Questo oggetto ha una serie di <strong>proprietà </strong>e <strong>metodi</strong>.</p>
<p><strong>Uno dei principali svantaggi</strong> legati all&#8217;utilizzo di questo oggetto sta nel fatto che non è standardizzato, quindi non è riconosciuto universalmente da tutti i browser. Infatti, Internet Explorer 6 e precedenti lo vedono come un ActiveX da richiamare in maniera diversa rispetto ai browser Mozilla.</p>
<p><strong>La soluzione</strong> è quella di utilizzare un framework e lasciare che sia lui a occuparsi di effettuare i controlli di compatibilità e differenziare la chiamata e il funzionamento dell&#8217;oggetto XMLHttpRequest.</p>
<p><strong>Per conoscere meglio l&#8217;oggetto XMLHttpRequest</strong> puoi consultare la <a title="The XMLHttpRequest" href="http://www.w3.org/TR/XMLHttpRequest/" target="_blank">pagina ufficiale del w3c (in inglese)</a> oppure la <a title="XMLHttpRequest" href="http://it.wikipedia.org/wiki/XMLHttpRequest" target="_blank">pagina su Wikipedia</a>.</p>
<p><strong>Per approfondire</strong> la gestione di Ajax con jQuery puoi leggere la pagina della <strong>documentazione ufficiale di jQuery</strong> relativa ad Ajax: <a title="jQuery: Ajax" href="http://docs.jquery.com/Ajax" target="_blank">http://docs.jquery.com/Ajax</a>.</p>
<h5>Ajax</h5>
<p>Analizziamo le righe di codice javascript relative alla gestione della richiesta e della risposta asincrona.</p>
<pre lang="js">$.get("myscript.php",{firstname_get:firstname,lastname_get:lastname,phone_get:phone},
	// funzione "callback", cioé eseguita quando vengono restituiti i dati dallo script "myscript.php"
	function(data,status)
	{
		if(status=="success") { ... }
		else { ... } // status=="failure"
	}
);</pre>
<p><strong>$.get.</strong> Questa funzione effettua una richiesta GET. Alternativamente si poteva utilizzare $.post. A seconda del tipo di richiesta, nell0 script lato server bisogna utilizzare gli array $_GET e $_POST per ottenere i dati inviati.</p>
<p><strong>&#8220;myscript.php&#8221;.</strong> Il primo argomento della funzione $.get. Specifica lo script da utilizzare.</p>
<p><strong>{firstname_get:firstname,lastname_get:lastname,phone_get:phone}.</strong> Il secondo argomento della funzione $.get. Questo è un tipo di dati chiamato &#8220;Map&#8221;, dove &#8220;firstname&#8221;, &#8220;lastname&#8221; e &#8220;phone&#8221; sono le variabili riempite con i valori del form, e &#8220;firstname_get&#8221;, &#8220;lastname_get&#8221; e &#8220;phone_get&#8221; sono i nomi delle variabili passate allo script. Quindi, in myscript.php per leggere il cognome non utilizzeremo $_GET['lastname'] ma $_GET['lastname_get'].</p>
<p><strong>function(data,status).</strong> Il terzo argomento della funzione $.get. Rappresenta la funzione &#8220;callback&#8221;, ovvero la funzione da utilizzare quando si riceve la risposta. Poiché la risposta è asincrona, cioé avviene in un secondo momento rispetto all&#8217;invio dei dati, non possiamo scrivere:</p>
<pre lang="js">if(form_check())
{
	ajax_invia_dati();
	ajax_gestisci_risposta();
}</pre>
<p>poiché, quando verrà chiamata la funzione ajax_gestisci_risposta() sicuramente la risposta non sarà ancora arrivata.</p>
<p>Per questo motivo è necessario specificare la cosiddetta <strong>funzione &#8220;callback&#8221;</strong> che verrà eseguita non appena ajax fornirà una risposta. Questa funzione ha due parametri: <strong>data</strong> (dati ricevuti), <strong>status </strong>(stato della risposta). Se status è &#8220;success&#8221; significa che tutto è andato a buon fine, altrimenti status sarà &#8220;failure&#8221;.</p>
<p><strong>Come ottenere l&#8217;oggetto XMLHttpRequest.</strong> Le funzioni $.get, $.post, ecc. restituiscono l&#8217;oggetto XMLHttpRequest che potrà essere utilizzato con tutti i suoi metodi e le sue proprietà.</p>
<h4>Script lato server (php)</h4>
<ul>
<li>Effettua una connessione al database</li>
<li>Esegue la query con i dati ricevuti</li>
<li>Stampa una stringa fra queste: &#8220;db error&#8221;, &#8220;no data&#8221;, o l&#8217;indirizzo trovato</li>
</ul>
<p>Puoi vedere il file completo <a title="Pagina html e codice javascript" href="http://download.jblog.it/ajax_phone/myscript.txt" target="_blank">qui</a>.</p>
<pre lang="php">&lt;?php

header('Expires:'.date("D, d M Y H:i:s",time()+2600000).' GMT');
header('Cache-Control:public,max-age=2600000');

$mydb = @new mysqli('localhost', 'root', 'root', 'mydb');

if(mysqli_connect_errno()!=0) { echo 'db error'; }
else
{
	// effettua la query
	$result = @$mydb-&gt;query("
	SELECT	`Address`
	FROM	`info`
	WHERE	`Lastname`='".$_GET['lastname_get']."' AND
		`Firstname`='".$_GET['firstname_get']."' AND
		`Phone`='".$_GET['phone_get']."'		;");

	// controlla quanti record sono stati trovati (se 0: indirizzo non trovato)
	if($mydb-&gt;affected_rows==0)	{ echo 'no data'; }

	// indirizzo trovato
	else
	{
		$address = $result-&gt;fetch_array(MYSQLI_NUM);
		echo $address[0];
	}
}
?&gt;</pre>
<h5>Dati restituiti dallo script</h5>
<p><strong> </strong></p>
<ul>
<li>&#8220;db error&#8221;, se si verifica un errore relativo al database (in fase di connessione)</li>
<li>&#8220;no data&#8221;, se non viene trovato l&#8217;indirizzo</li>
<li>stringa dell&#8217;indirizzo, se viene trovato l&#8217;indirizzo</li>
</ul>
<h5>Come impostare lo script per i test</h5>
<p>Se vuoi testare lo script è necessario effettuare alcune semplici operazioni.</p>
<ul>
<li>All&#8217;interno di myscript.php individua la riga $mydb = @new mysqli(&#8216;localhost&#8217;, &#8216;root&#8217;, &#8216;root&#8217;, &#8216;mydb&#8217;); e sostituisci i valori del tuo database: host, username, password, database.</li>
<li>Crea la tabella &#8220;info&#8221; nel tuo database. Nello script c&#8217;è una query (CREATE TABLE &#8230; ) da copiare e far eseguire subito dal tuo dbms (es. phpMyAdmin). Se la crei manualmente è necessario creare 5 campi chiamati ID, Lastname, Firstname, Phone, Address.</li>
<li>Infine, inserisci un paio di record in modo che l&#8217;applicazione Ajax possa trovare qualc0sa nella tabella.</li>
</ul>
<h2>Formati di scambio dati</h2>
<p><img class="alignright size-full wp-image-361" title="Scambio dati" src="http://jblog.it/wp-content/uploads/2009/05/senza-titolo-1.png" alt="Scambio dati" width="342" height="134" />Per i dati da inviare come risposta possono essere utilizzati <strong>vari formati</strong>: testo semplice, html, xml, json, ebml.</p>
<p>Lo script dell&#8217;<strong>esempio precedente</strong> stampa <strong>testo semplice</strong>.</p>
<h4>Testo semplice e html</h4>
<p>Preferibile se si devono sviluppare applicazioni semplici che non richiedono massicci scambi di dati e complesse elaborazioni.</p>
<p>Il maggior vantaggio sta nel fatto che testo semplice e codice html non richiedono ulteriori elaborazioni per rendere i dati rappresentabili all&#8217;interno di una pagina xhtml o html.</p>
<h4>Json</h4>
<p>Json, acronimo di <em>JavaScript Object Notation</em>,  è un ottimo formato per lo scambio dati.</p>
<p>Si possono rappresentare <strong>oggetti </strong>e <strong>array</strong>:</p>
<pre lang="js">var object = { name : "Giacomo", phone: "123456789", object2: { msg: "Ciao" } };
var array = ["mystring", 100, { msg: "Ciao" }, object, 5*2, 0.134];</pre>
<p>Per processare una risposta in formato Json, anziché $.get è necessario utilizzare<strong>$.getJson</strong>. Questa funzion processa automaticamente una risposta in formato Json in modo da poter utilizzare subito i dati.</p>
<p>Ad esempio, se la risposta è:</p>
<pre lang="js">var object = { name : "Giacomo", phone: "123456789", object2: { msg: "Ciao" } };
var array = ["mystring", 100, { msg: "Ciao" }, object, 5*2, 0.134];</pre>
<p>all&#8217;interno della funzione &#8220;callback&#8221; potremmo utilizzare le due variabili scrivendo semplicemente:</p>
<pre lang="js">object.name.length; // per ottenere la lunghezza della stringa "Giacomo"
alert(object.object2.msg); // per stampare un alertbox con il messaggio "Ciao"
newvar = array[4] + 3; // per assegnare alla variabile newvar il valore (5*2)+3, cioé 13</pre>
<p>Per saperne di più vai alla pagina ufficiale di Json: <a title="Json official page" href="http://json.org/" target="_blank">http://json.org/</a>.</p>
<h4>XML</h4>
<p>XML, acronimo di <em>eXtensible Markup Language</em>, è un <strong>metalinguaggio di markup</strong> che permette di definire tag personalizzare per strutturare documenti complessi. Una volta ottenuta una risposta formattata in XML è necessario elaborarla per poterla gestire.</p>
<p>La lettura e l&#8217;elaborazione di un testo XML consiste nello scorrere la struttura del documento per recuperare i dati contenuti nei tag XML. Per scorrere la struttura del documento esistono <strong>librerie javascript</strong> che consentono di farlo semplicemente.</p>
<p>Utilizzare questo formato è vantaggioso nel caso in cui ci siano molti dati da ricevere, mentre è sconsigliabile nel caso in cui ricevano pochi dati in quanto i caratteri per i tag XML potrebbero superare quelli per i dati effettivi.</p>
<h2>Memorizza le risposte Ajax in cache per evitare richieste duplicate</h2>
<p>Come detto prima, le risposte Ajax non sono altro che risposte HTTP e, come in tutte le risposte HTTP, possono essere inviati gli header.</p>
<p>Naturalmente, gli header devono essere inviati dallo script lato server, prima di qualsiasi output.</p>
<p>Per memorizzare le risposte Ajax nella cache si possono utilizzare i campi di intestazione Cache-Control, Expires, Pragma, <strong>ETag</strong>. Nei casi in cui non si possa utilizzare la cache del browser ricorreremo a una tecnica javascript.</p>
<p><strong>Per approfondire la gestione della cache</strong> dai uno sguardo al post precedente: <a title="Ridurre le richieste HTTP (parte 1): come utilizzare la cache del browser" href="http://jblog.it/2009/04/24/ridurre-richieste-http-come-utilizzare-cache-browser_124.html">http://jblog.it/2009/04/24/ridurre-richieste-http-come-utilizzare-cache-browser_124.html</a>.</p>
<h4>Richieste GET e POST: come si comporta il browser</h4>
<p>Nell&#8217;esempio, utiliziamo un solo script lato server che restituisce 3 output diversi a seconda dell&#8217;esito dell&#8217;operazione: &#8220;db error&#8221; per l&#8217;errore del database, &#8220;no data&#8221; se non è stato trovato l&#8217;indirizzo, e la stringa dell&#8217;indirizzo trovato nel database.</p>
<p>Ti consiglio di leggere questo interessante articolo (in inglese) del w3c: <a title="URIs, Addressability, and the use of HTTP GET and POST" href="http://www.w3.org/2001/tag/doc/whenToUseGet.html" target="_blank">URI, indirizzabilità, e l&#8217;uso di GET e POST</a>.</p>
<p>Il comportamento del browser cambia in base al tipo di richiesta (GET e POST) e agli header inviati dallo script lato server. Analizziamo alcuni casi più da vicino.</p>
<h5>Le richieste GET</h5>
<p><strong> </strong>L&#8217;indirizzo di una richiesta GET ha la forma:</p>
<pre lang="plaintext">http://localhost/ajax_phone/myscript.php?par1=ciao&amp;par2=hello</pre>
<p>Il comportamento di <strong>default </strong>del browser consiste nell&#8217;inviare sempre una nuova richiesta.</p>
<p>Tuttavia, se vogliamo che il browser memorizzi per 1 ora la risposta dello script lato server, inviamo i seguenti header:</p>
<pre lang="plaintext">header('Expires:Sun, 03 May 2009 23:18:45 GMT');
header('Cache-Control:public,max-age=3600');
header('Pragma:public');</pre>
<p>In questo caso, quando l&#8217;applicazione Ajax invia la prima richiesta, il browser legge lo script e lo memorizza in cache. La volta successiva possono verificarsi due casi:</p>
<ul>
<li>se si inviano dei <strong>dati diversi</strong> (ad es., se invece di &#8220;par2=hello&#8221; inviamo &#8220;par2=welcome&#8221;) il browser effettua una nuova richiesta e la memorizza in cache</li>
<li>se si inviano gli <strong>stessi dati</strong>, il browser si accorge che l&#8217;indirizzo della richiesta è uguale, quindi legge i dati dalla cache evitando di effettuare una nuova richiesta</li>
</ul>
<p><strong>Differenziare gli header.</strong> Se alcune richieste non devono essere memorizzate in cache, puoi inviare degli header diversi a seconda dell&#8217;ouput generato dallo script (prima di stampare qualsiasi output). Ad esempio:</p>
<pre lang="php">if($output!="error")
{
	header('Expires:Sun, 03 May 2009 23:18:45 GMT');
	header('Cache-Control:public,max-age=3600');
	header('Pragma:public');
}
else
{
	header('Expires:Sun, 01 Jan 1970 02:00:00 GMT');
	header('Cache-Control:no-cache');
	header('Pragma:no-cache');
}</pre>
<p><strong>Forzare la richiesta.</strong> Per fare in modo che il browser effettui una nuova richiesta, anche se questa è già presente nella cache, basta inviare un ulteriore parametro con un valore variabile, ad esempio un numero casuale.</p>
<pre lang="js">$.get("myscript.php",{firstname_get:firstname,lastname_get:lastname,phone_get:phone,random:Math.random()},
	function(data,status){...});</pre>
<h5>Le richieste POST</h5>
<p>L&#8217;indirizzo di una richiesta POST ha la forma:</p>
<pre lang="plaintext">http://localhost/ajax_phone/myscript.php</pre>
<p><strong>E i parametri?</strong> Vengono inviati tramite protocollo HTTP, ma non sono visibili al browser.</p>
<p><strong>Le richieste POST non possono essere memorizzate in cache.</strong></p>
<h5>Come evitare le richieste duplicate</h5>
<p>Abbiamo visto che le richieste POST non possono essere memorizzate in cache.</p>
<p>Tuttavia è possibile evitare le richieste duplicate grazie a qualche riga di javascript.</p>
<p>Questa tecnica consiste nel <strong>memorizzare i dati inviati e ricevuti in un array</strong>, in modo che, prima di inviare una richiesta, si controlla se i dati da inviare sono già presenti nell&#8217;array. Se sono presenti, si leggono i dati ricevuti in corrispondenza dei dati richiesti e si procede con l&#8217;esecuzione dell&#8217;applicazione.</p>
<pre lang="js">var my_array() = new Array();

/* Una volta riempito l'array avrà questo aspetto
myarray = Array(
	Array( Array('Mario','Rossi',3429752370), 'no data' ),
	Array( Array('Giacomo','Ratta',4325233), 'Via Beethoven, 21' ),
);
*/</pre>
<p>Ogni elemento dell&#8217;array è un array di due elementi. Il primo è l&#8217;array dei dati inviati; il secondo è la stringa dell&#8217;output restituito.</p>
<pre lang="js">// Esegue le operazioni con i dati ricevuti
function esegui_le_operazioni(data) { ... }

if(form_check())
{
	// Leggo i valori dei 3 campi del form
	firstname = $('#firstname').val();
	lastname = $('#lastname').val();
	phone = $('#phone').val();

	// Indica se sono state trovate i dati da inviare
	// Contiene l'indice dell'elemento contenente dati inviati e dati ricevuti
	found = -1;

	// Cerco i dati nell'array
	for(i=0;i&lt;my_array.length;i++)
	{
		// (riga da adattare in base alle proprie esigenze)
		if(my_array[i][0][0]==firstname &amp;&amp; my_array[i][0][1]==lastname &amp;&amp; my_array[i][0][1]==phone)
		{ found=i; break; }
	}

	// I dati sono stati trovati
	if(found&gt;=0)
	{
		esegui_le_operazioni(my_array[found][1]);
	}

	// Dati non trovati: nuova richiesta
	else {
		$.get("myscript.php",{firstname_get:firstname,lastname_get:lastname,phone_get:phone},
		// funzione "callback", cioé eseguita quando vengono restituiti i dati dallo script "myscript.php"
		function(data,status)
		{
			if(status=="success")
			{
				// Inserisco dati inviati e dati ricevuti nell'array
				// riga da adattare in base alle proprie esigenze)
				my_array.push(new Array(new Array(firstname,lastname,phone), data));

				esegui_le_operazioni(data);
			}
			else { ... } // status=="failure"

		}); //end-callback

	} //end-if
}</pre>
<h5>Quando utilizzare GET e quando POST<strong><br />
</strong></h5>
<ul>
<li>Il metodo GET è da preferire quando si devono inviare dati per il normale funzionamento della pagina e degli script</li>
<li>Il metodo POST si deve utilizzare quando quelli da scambiare sono dei dati sensibili (username, password, telefono)</li>
</ul>
<h2>Migliorare l&#8217;usabilità e l&#8217;accessibilità delle applicazioni Ajax</h2>
<p>Spesso nella progettazione delle applicazioni Ajax l&#8217;usabilità lascia un po&#8217; a desiderare: nessun messaggio di successo/errore, caricamenti infiniti senza segni di vita, ecc.</p>
<p>Certo, l&#8217;usabilità è un tema complesso e progettare siti e applicazioni usabili richiede tempo e buone competenze.</p>
<p>Tuttavia, ci sono alcune cose che devono essere fatte e che, fortunatamente, non richiedono troppo tempo.</p>
<p><strong><em>Potrai vedere queste modifiche nello script di esempio.</em></strong></p>
<h4>Errori e messaggi</h4>
<ul>
<li>Ogni campo di input deve avere la relativa area dedicata ai messaggi di errore (&#8220;dati obbligatori&#8221;, &#8220;caratteri non validi&#8221;, ecc.)</li>
<li>La pagina deve avere un&#8217;area destinata ad ospitare i messaggi relativi all&#8217;esecuzione dello script (&#8220;ricerca eseguita con successo&#8221;, &#8220;errore dell&#8217;applicazione&#8221;, &#8220;errore del database&#8221;, ecc.)</li>
</ul>
<h4>Barra di caricamento</h4>
<p><img class="alignright size-full wp-image-360" title="loader" src="http://jblog.it/wp-content/uploads/2009/05/loader.png" alt="loader Come utilizzare Ajax: librerie, framework, ottimizzazione, caching, usabilità" width="220" height="19" />Nella maggior parte della applicazioni, per motivi tecnici, non è possibile inserire una barra di caricamento che rilevi la percentuale reale dei dati caricati fino a quel momento.</p>
<p>Generalmente, si preferisce mostrare un&#8217;immagine gif che può essere una barra di caricamento o un&#8217;animazione generica in modo che faccia sapere all&#8217;utente che l&#8217;applicazione sta lavorando.</p>
<p><strong>Svantaggio.</strong> Durante il caricamento dei dati si potrebbe verificare un malfunzionamento che non blocca la richiesta. In questo caso il caricamento sarebbe infinito provocando l&#8217;abbandono del sito da parte dell&#8217;utente.</p>
<p><strong>Soluzione 1.</strong> Puoi inserire un pulsante da far premere all&#8217;utente per fermare la richiesta http.</p>
<pre lang="html">&lt;button type="button" onclick="stopAjaxRequest();"&gt;Stop&lt;/button&gt;</pre>
<p><strong>Soluzione 2.</strong> Analizza il tuo script e prevedi un tempo massimo entro cui restituire l&#8217;output, e, con javascript, impostare un timer che faccia fermare la richiesta Ajax una volta trascorso il tempo previsto.</p>
<pre lang="js">// esegue la funzione stopAjaxRequest() dopo 10 secondi
setTimeout(stopAjaxRequest(),10000);</pre>
<h5>Come creare la funzione stopAjaxRequest().</h5>
<ul>
<li>L&#8217;oggetto <span>XMLHttpRequest ha il metodo <strong>abort() </strong>che permette di fermare una richiesta http.</span></li>
<li>Le funzioni $.ajax, $.get, $.post, $.getScript, $.getJSON di jquery restituiscono un oggetto <span>XMLHttpRequest.</span></li>
</ul>
<p><strong>1. Creiamo una variabile globale per l&#8217;oggetto <span>XMLHttpRequest, che chiamiamo XHR</span></strong></p>
<pre lang="js"><span>var XHR;<strong>
</strong></span></pre>
<p><strong><span>2. Creiamo la funzione</span> stopAjaxRequest() che richiama XHR ed esegue il metodo abort()</strong></p>
<pre lang="js">function stopAjaxRequest() { XHR.abort(); }</pre>
<p><strong><span>3. Assegnamo a XHR l&#8217;oggetto restituito dalla funzione $.get che utilizziamo per inviare i dati</span></strong></p>
<pre lang="js"><span>XHR = $.get("myscript.php",{firstname_get:firstname,lastname_get:lastname,phone_get:phone},
	function(data,status)</span><span> { ... }</span><span>);
</span></pre>
<h4>Se javascript è disabilitato&#8230;</h4>
<p>Purtroppo, ancora oggi ci sono utenti che utilizzano browser che non eseguono codice javascript, che hanno scarsa compatibilità oppure con javascript disattivato.</p>
<p>La <strong>soluzione </strong>è quella di progettare applicazioni che funzionino sia con javascript che senza.</p>
<p>Questo potrebbe andare bene per la piccola applicazione Ajax realizzata per questo post. Tuttavia, se le applicazioni sono di un certo livello, il carico di lavoro aumenta notevolmente. Quindi progettare applicazioni ibride ha senso solo quando le applicazioni da realizzare <strong><span style="text-decoration: underline;">devono</span> </strong>offrire il <strong>massimo della compatibilità</strong> con i browser usati dagli utenti (ad es. siti governativi, pubblica amministrazione, ecc.)</p>
<p><strong>Secondo me</strong>, data la piccola percentuale di browser non compatibili e di utenti che disattivano (erroneamente) javascript, e la presenza di siti importanti come ebay, microsoft, youtube che non offrono l&#8217;alternativa &#8220;no javascript&#8221;, si può benissimo sviluppare un sito senza preoccuparsi degli utenti che non potranno eseguire javascript.</p>
<p>Nel <strong>tag &lt;noscript&gt;</strong> è possibile inserire il codice html da eseguire in caso di &#8220;javascript disabilitato&#8221;.</p>
<p>Alcune volte l&#8217;ho utilizzato per nascondere dei componenti che avevano senso solo con javascript disabilitato. Lo so&#8230; sintatticamente non è corretto, però potrebbe esserti utile.</p>
<p>Supponiamo di avere un link che fa apparire un alert:</p>
<pre lang="js">&lt;a id="alert_click" href="#" onclick="javascript:alert('Ciao!');"&gt;Clicca qui&lt;/a&gt;</pre>
<p>Per nasconderlo, in caso di javascript disabilitato, scriviamo:</p>
<pre lang="html">&lt;noscript&gt;
&lt;style type="text/css"&gt;
#alert_click { display:none; }
&lt;/style&gt;
&lt;/noscript&gt;</pre>
<h2>Svantaggi di Ajax</h2>
<ul>
<li>Le chiamate effettuate non vengono registrate nella cronologia, a differenza di quanto avviene utilizzando iframe nascosti</li>
<li>I pulsanti &#8220;avanti&#8221; e &#8220;dietro&#8221; non sono utilizzabili poiché le chiamate Ajax non vengono memorizzate nella cronologia</li>
<li>L&#8217;utilizzo esclusivo di javascript viola il requisito 15 della legge Stanca: &#8220;la pagina deve essere fruibile anche in assenza di script&#8221;</li>
<li>L&#8217;oggetto XMLHttpRequest non è compatibile con tutti i browser. Internet Explorer 6 e precedenti lo vedono come oggetto ActiveX, e il browser potrebbe essere impostato a un livello di sicurezza tale da non permettere l&#8217;esecuzione di controlli ActiveX</li>
<li>L&#8217;oggetto XMLHttpRequest può comunicare solo all&#8217;interno del dominio. Se la destinazione è esterna al dominio bisogna creare un proxy lato server per poter comunicare all&#8217;esterno.</li>
<li>Poiché i motori di ricerca non eseguono codice javascript, essi non possono indicizzare i contenuti generati dinamicamente con javascript e Ajax</li>
</ul>
<h2>Libri e risorse utili</h2>
<h5>Ajax. Guida per lo sviluppatore. Seconda edizione. Hoepli (2007).</h5>
<p><img class="alignright size-full wp-image-351" title="Ajax. Guida per lo sviluppatore. Seconda edizione" src="http://jblog.it/wp-content/uploads/2009/05/4960-300x300.jpg" alt="Ajax. Guida per lo sviluppatore. Seconda edizione" width="71" height="100" />Con Ajax guida per lo sviluppatore scoprirete come sfidare le regole tradizionali di quello che può accadere sul Web e come liberarvi del consueto approccio “click and wait”, approfondendo le tecniche, i pattern e i casi di utilizzo di Ajax, così da crearvi un’esperienza d’uso senza precedenti nelle vostre applicazioni.</p>
<p>Link: <a title="Ajax. Guida per lo sviluppatore. Seconda edizione" href="http://www.hoepli.it/editore/visbook.asp?id=978-88-203-3923-4" target="_blank">http://www.hoepli.it/editore/visbook.asp?id=978-88-203-3923-4</a>.</p>
<h5>Ajax e Php. Sviluppare applicazioni web dinamiche. Hoepli (2007)</h5>
<p><img class="alignright size-full wp-image-352" title="Ajax e Php. Sviluppare applicazioni web dinamiche" src="http://jblog.it/wp-content/uploads/2009/05/copj13.jpg" alt="Ajax e Php. Sviluppare applicazioni web dinamiche" width="70" height="100" /><span class="tcorpotesto">AJAX e PHP. Sviluppare applicazioni web dinamiche è la risorsa più pratica ed efficiente che possiate utilizzare per entrare nell&#8217;entusiasmante mondo di AJAX. Questo libro vi spiegherà infatti come creare applicazioni web in PHP che sfruttino al massimo le tecnologie Ajax.<br />
</span></p>
<p>Link: <a title="Ajax e Php. Sviluppare applicazioni web dinamiche" href="http://www.hoepli.it/libro/ajax-php.asp?ib=9788820339432&amp;pc=000022007002012" target="_blank">http://www.hoepli.it/libro/ajax-php.asp</a></p>
<h5>Siti e pagine</h5>
<p><a title="Ajax: A New Approach to Web Applications" href="http://www.adaptivepath.com/ideas/essays/archives/000385.php" target="_blank">Ajax: A New Approach to Web Applications</a></p>
<p><a title="The XMLHttpRequest Object" href="http://www.w3.org/TR/XMLHttpRequest/" target="_blank">W3C: The XMLHttpRequest Object</a></p>
<p><a title="Wikipedia: l'oggetto XMLHttpRequest" href="http://it.wikipedia.org/wiki/XMLHttpRequest" target="_blank">Wikipedia: l&#8217;oggetto XMLHttpRequest</a></p>
<p><a title="jQuery: Ajax" href="http://docs.jquery.com/Ajax" target="_blank">jQuery: Ajax</a></p>
<p><a title="Json official page" href="http://json.org/" target="_blank">JSON.org</a></p>
<p><a title="Ridurre le richieste HTTP (parte 1): come utilizzare la cache del browser" href="http://jblog.it/2009/04/24/ridurre-richieste-http-come-utilizzare-cache-browser_124.html">Ridurre le richieste HTTP (parte 1): come utilizzare la cache del browser</a></p>
<p><a title="URIs, Addressability, and the use of HTTP GET and POST" href="http://www.w3.org/2001/tag/doc/whenToUseGet.html" target="_blank">W3C: URIs, Addressability, and the use of HTTP GET and POST</a></p>
<img src="http://jblog.it/?ak_action=api_record_view&id=202&type=feed" alt=" Come utilizzare Ajax: librerie, framework, ottimizzazione, caching, usabilità"  title="Come utilizzare Ajax: librerie, framework, ottimizzazione, caching, usabilità" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/05/02/come-utilizzare-ajax-basi-librerie-framework-ottimizzazione-caching-usabilita_202.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
