<?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; jQuery</title>
	<atom:link href="http://jblog.it/category/jquery/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>Scroll automatico e animato con &#8220;scrollTop&#8221; e il plugin &#8220;easing&#8221;</title>
		<link>http://jblog.it/2010/05/24/scroll-automatico-animato-jquery-scrolltop-plugin-easing_894.html</link>
		<comments>http://jblog.it/2010/05/24/scroll-automatico-animato-jquery-scrolltop-plugin-easing_894.html#comments</comments>
		<pubDate>Mon, 24 May 2010 09:00:17 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Web design]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[ancore]]></category>
		<category><![CDATA[animate]]></category>
		<category><![CDATA[easing]]></category>
		<category><![CDATA[link interni]]></category>
		<category><![CDATA[offset]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[pseudo-classe]]></category>
		<category><![CDATA[scrollTop]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=894</guid>
		<description><![CDATA[In questi giorni ho aiutato un amico alle prese con un sito web a pagina singola e prendendo spunto dal sito vanadiumjs ho voluto implementare lo scroll automatico e animato. Poiché la pagina era molto lunga mi sembrava utile inserire questa funzionalità al fine di evitare all'utente l'utilizzo prolungato della rotellina del mouse per scorrere la pagina.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-896" title="scroll automatico e animato - jquery + scrollTop + easing" src="http://jblog.it/wp-content/uploads/2010/05/17095584_99ed2e6537_b.jpg" alt="17095584 99ed2e6537 b Scroll automatico e animato con scrollTop e il plugin easing" width="540" height="300" /><span style="font-size: small;"><span><br />
</span></span></p>
<p>In questi giorni ho aiutato un amico alle prese con un <strong>sito web a pagina singola</strong> e prendendo spunto dal sito vanadiumjs.com ho voluto implementare lo scroll automatico e animato. Dopo un giretto sul web ho trovato questo <a href="http://oncemade.com/animated-page-scroll-with-jquery/" target="_blank">interessante script</a> da cui ho imparato un po&#8217; di cose che ti ripropongo.</p>
<p>Il mio <strong>non è stato solo uno sfizio</strong>: poiché la pagina era molto lunga mi sembrava utile inserire questa funzionalità al fine di evitare all&#8217;utente l&#8217;utilizzo prolungato della rotellina del mouse per poter scorrere la pagina. Certo, si poteva realizzare tutto con dei <strong>link interni di tipo &#8220;#id&#8221;</strong> evitando codice js e plugin jquery. Lo abbiamo fatto ugualmente <strong>perché la pagina era solo una</strong> e un po&#8217; di dinamismo non guasta mai! <img src='http://jblog.it/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="Scroll automatico e animato con scrollTop e il plugin easing" /> </p>
<p><strong>La proprietà &#8220;scrollTop&#8221;.</strong> La utiliziamo per delineare le caratteristiche dell&#8217;animazione all&#8217;interno del metodo <code>$.animate()</code>. Questa proprietà deve essere impostata con un valore intero pari alla distanza (in pixel) tra l&#8217;inizio della pagina e la posizione di destinazione.</p>
<p><strong>Il plugin &#8220;easing&#8221;</strong>. Non è fondamentare per realizzare lo scroll animato in quanto all&#8217;animazione ci pensa già il metodo <code>$.animate()</code>. Questo plugin ci serve per aggiungere a jquery altri tipi di animazione. Per saperne di più visita la <a title="jquery.easing plugin" href="http://gsgd.co.uk/sandbox/jquery/easing/" target="_blank">pagina del plugin</a> in cui potrai provare tutte le animazioni.</p>
<p><strong>Animazione &#8220;easeInOutQuad&#8221;.</strong> Il vero motivo per cui utilizziamo il plugin &#8220;easing&#8221; è per sfruttare l&#8217;animazione &#8220;easeInOutQuad&#8221; (uguale a quella di vanadiumjs.com) molto adatta per uno scroll animato: parte lenta, scorre veloce, e inizia a rallentare prima di arrivare sulla destinazione del link.</p>
<p><span id="more-894"></span><br />
<!--adv300--></p>
<h2>Aspetti positivi</h2>
<p><strong>Nessun problema se javascript è disabilitato.</strong> Poiché utiliziamo dei link interni (o ancore) per chiamare l&#8217;animazione sullo scroll, in caso di javascript disabilitato questi link funzioneranno comunque e faranno in modo di proiettare l&#8217;utente sul blocco con l&#8217;id specificato nell&#8217;attributo href.</p>
<p><strong>Normale scroll della pagina inalterato.</strong> Nonostante l&#8217;animazione, il normale scroll della pagina non viene alterato in alcun modo e la barra di scorrimento continua a funzionare come ci si aspetterebbe.</p>
<p><strong>Codice riusabile.</strong> Il codice javascript (e jquery) non dipende dal numero di link che devono avviare uno scroll animato. Infatti l&#8217;unica operazione richiesta è quella di specificare la classe comune ai link che avviano lo scroll animato.</p>
<h2>Al lavoro!</h2>
<p><strong>RISULTATO FINALE</strong>: <a href="http://test.jblog.it/autoscroll/" target="_blank">http://test.jblog.it/autoscroll/</a></p>
<p><strong>DOWNLOAD</strong>: <a href="http://download.jblog.it/autoscroll.zip" target="_blank">http://download.jblog.it/autoscroll.zip</a></p>
<h4>1. Includere jquery e jquery.easing</h4>
<pre>&lt;head&gt;
...
&lt;script type="text/javascript" src="<strong>jquery.min.js</strong>"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="<strong>jquery.easing.1.3.js</strong>"&gt;&lt;/script&gt;
...
&lt;/head&gt;</pre>
<h4>2. Attribuire una la stessa classe a tutti i link per lo scroll animato</h4>
<pre>&lt;!-- la classe comune è "scrollToBlock" --&gt;
&lt;a href="#blocco1" class="<strong>scrollToBlock</strong>"&gt;Blocco 1&lt;/a&gt;
&lt;a href="#blocco2" class="<strong>scrollToBlock</strong>"&gt;Blocco 2&lt;/a&gt;
&lt;a href="#blocco3" class="<strong>scrollToBlock</strong>"&gt;Blocco 3&lt;/a&gt;
&lt;a href="#blocco4" class="<strong>scrollToBlock</strong>"&gt;Blocco 4&lt;/a&gt;
&lt;a href="#blocco5" class="<strong>scrollToBlock</strong>"&gt;Blocco 5&lt;/a&gt;</pre>
<h4>3. Copiare il blocco di codice per lo scroll animato</h4>
<p>Anche se mi sembra superfluo dirlo, il seguente blocco di codice deve essere inserito fra i tag <code>&lt;head&gt;&lt;/head&gt;</code>.</p>
<pre>&lt;script type="text/javascript"&gt;
<strong>$(document).ready</strong>(function(){

  $('<strong>.scrollToBlock</strong>').click(function(){

    // recupera l'id e la distanza del blocco verso cui eseguire lo scroll
    var <strong>position </strong>= $( $(this).attr("href") ).offset().top;

    // ANIMAZIONE
    // (in alcuni browser funziona "body" in altri "html")
    // not(:animated) evita che un altro click su un'altra voce del menù abbia effetto quando il precedente scroll non si è concluso
    $("body:not(:animated), html:not(:animated)").animate(
      { <strong>scrollTop:position</strong> }, // parametri dell'animazione
      <strong>1000</strong>,                   // durata animazione (in millisecondi)
      '<strong>easeInOutQuad</strong>');       // animazione (del plugin "jquery.easing")

    // evita che la url venga "sporcata" con l'aggiunta di "#bloccoX"
    <strong>return false;</strong>
  });
});
&lt;/script&gt;</pre>
<h4>4. Impostare la classe dei link che avviano lo scroll animato</h4>
<pre>&lt;script type="text/javascript"&gt;
$(document).ready(function(){

  $('<strong>INSERIRE QUI</strong> la classe').click(function(){
...</pre>
<h4>5. Decidere la durata dell&#8217;animazione (in millisecondi)</h4>
<pre>...
$("body:not(:animated), html:not(:animated)").animate(
      { scrollTop:position }, // parametri dell'animazione
      <strong>1000,                   // durata animazione (in millisecondi)</strong>
      'easeInOutQuad');       // animazione (del plugin "jquery.easing")
...</pre>
<h4>6. Decidere l&#8217;animazione del plugin &#8220;easing&#8221;</h4>
<p>Nella <a title="jquery.easing plugin" href="http://gsgd.co.uk/sandbox/jquery/easing/" target="_blank">pagina del plugin</a> puoi trovare l&#8217;elenco completo delle animazioni e la dimostrazione di ciascuna di esse.</p>
<pre>...
$("body:not(:animated), html:not(:animated)").animate(
      { scrollTop:position }, // parametri dell'animazione
      1000,                   // durata animazione (in millisecondi)
      <strong>'easeInOutQuad');       // animazione (del plugin "jquery.easing")</strong>
...</pre>
<h4>7. Attribuire un id diverso a ciascun blocco di destinazione</h4>
<pre>&lt;div class="block" <strong>id="blocco1"</strong>&gt;
   &lt;h2&gt;Blocco 1&lt;/h2&gt;
   &lt;p&gt;Lorem ipsum...&lt;/p&gt;
&lt;/div&gt;

&lt;div class="block" <strong>id="blocco2"</strong>&gt;
   &lt;h2&gt;Blocco 2&lt;/h2&gt;
   &lt;p&gt;Sed ut perspiciatis...&lt;/p&gt;
&lt;/div&gt;

&lt;div class="block" <strong>id="blocco3"</strong>&gt;
   &lt;h2&gt;Blocco 3&lt;/h2&gt;
   &lt;p&gt;Lorem ipsum...&lt;/p&gt;
&lt;/div&gt;

&lt;div class="block" <strong>id="blocco4"</strong>&gt;
   &lt;h2&gt;Blocco 4&lt;/h2&gt;
   &lt;p&gt;Sed ut perspiciatis...&lt;/p&gt;
&lt;/div&gt;

&lt;div class="block" <strong>id="blocco5"</strong>&gt;
   &lt;h2&gt;Blocco 5&lt;/h2&gt;
   &lt;p&gt;Lorem ipsum...&lt;/p&gt;
&lt;/div&gt;</pre>
<h4>8. Attribuire l&#8217;id di ciascun blocco di destinazione al relativo link</h4>
<pre>&lt;!-- la classe comune è "scrollToBlock" --&gt;
&lt;a <strong>href="#blocco1"</strong> class="scrollToBlock"&gt;Blocco 1&lt;/a&gt;
&lt;a <strong>href="#blocco2"</strong> class="scrollToBlock"&gt;Blocco 2&lt;/a&gt;
&lt;a <strong>href="#blocco3"</strong> class="scrollToBlock"&gt;Blocco 3&lt;/a&gt;
&lt;a <strong>href="#blocco4"</strong> class="scrollToBlock"&gt;Blocco 4&lt;/a&gt;
&lt;a <strong>href="#blocco5"</strong> class="scrollToBlock"&gt;Blocco 5&lt;/a&gt;</pre>
<h2>Animazioni multiple</h2>
<p>Vorrei spendere qualche parola in più sulla riga seguente per dire come ci si arriva a scriverla:</p>
<pre>$("body:not(:animated), html:not(:animated)").animate(...);</pre>
<p><span class="highlight_black"><strong>PROBLEMA 1</strong></span></p>
<p>Teoricamente si dovrebbe scrivere:</p>
<pre>$("body").animate(...);</pre>
<p>perché lo scroll riguarda il tag &lt;body&gt;.</p>
<p>Poiché su alcuni browser lo scroll della pagina è inteso su <code>&lt;html&gt;</code> e non su <code>&lt;body&gt;</code>, per supportarli entrambi è necessario scrivere:</p>
<pre>$("html,body").animate(...);</pre>
<p>In questo modo lo scroll funzionerà sia con i browser che lo intendono su <code>&lt;body&gt;</code> sia su quelli che lo intendono su <code>&lt;html&gt;</code>.</p>
<p><span class="highlight_black"><strong>PROBLEMA 2</strong></span></p>
<p>Se durante uno scroll si clicca su un&#8217;altro link prima che lo scroll precedente sia completato, il secondo scroll NON inizia subito ma &#8220;si mette in coda&#8221; e inizierà quando lo scroll precedente sarà stato completato.</p>
<p>Ora, immaginate che durante uno scroll si clicchi su più di un link: una volta completato lo scroll inizieranno una serie di scroll corrispondenti ai click precedenti.</p>
<p>Questa situazione non è accettabile per vari motivi, ma soprattutto perché non ha alcun senso e alcuna utilità sia per l&#8217;utente che per il web designer.</p>
<p>La <strong>soluzione</strong> è quella di bloccare la partenza di uno scroll automatico prima che il precedente sia stato completato.</p>
<p>La <strong>pseudo-classe <code>:not()</code></strong> serve per escludere dalla selezione tutti gli elementi con determinate caratteristiche che possono essere &#8220;disabilitato&#8221;, &#8220;nascosto&#8221;, &#8220;attivo&#8221;, &#8220;animato&#8221;, ecc.</p>
<p>In particolare a noi serve che la pseudo-classe <code>:not()</code> escluda gli <strong>elementi animati</strong>, identificati dalla <strong>pseudo-classe :animated</strong>: in questo caso gli elementi da escludere (quando sono animati) sono <code>&lt;html&gt;</code> e <code>&lt;body&gt;</code>.</p>
<p><strong>Per escludere un elemento animato</strong> si scrive:</p>
<pre>$("elemento:not(:animated)")...</pre>
<p>Quindi, per escludere &lt;html&gt; e &lt;body&gt; quando sono animati:</p>
<pre>$("body:not(:animated), html:not(:animated)")...</pre>
<h2>La posizione di arrivo</h2>
<p>Come avrai notato lo scroll automatico arriva precisamente sull&#8217;elemento.</p>
<p>Questo può non essere bellissimo da vedere poiché il blocco di arrivo risulta appiccicato al bordo superiore del browser.</p>
<p>Per fare in modo che il blocco di arrivo abbia un certo margine dal bordo del browser bisogna sottrarre alcuni pixel dalla posizione calcolata.</p>
<p>Individua la riga:</p>
<pre>var position = $( $(this).attr("href") ).offset().top;</pre>
<p>e modificala in:</p>
<pre>var position = $( $(this).attr("href") ).offset().top ( - XX );</pre>
<p>dove &#8220;XX&#8221; sono i <strong>pixel di margine</strong> dal bordo superiore del browser.</p>
<p>Foto | <a href="http://www.flickr.com/photos/jurvetson/17095584/">http://www.flickr.com/photos/jurvetson/17095584/</a></p>
<img src="http://jblog.it/?ak_action=api_record_view&id=894&type=feed" alt=" Scroll automatico e animato con scrollTop e il plugin easing"  title="Scroll automatico e animato con scrollTop e il plugin easing" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2010/05/24/scroll-automatico-animato-jquery-scrolltop-plugin-easing_894.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>Tecniche javascript e jquery per selezionare e scorrere elementi html e nodi</title>
		<link>http://jblog.it/2009/05/25/tecniche-javascript-jquery-selezionare-scorrere-elementi-html-nodi_492.html</link>
		<comments>http://jblog.it/2009/05/25/tecniche-javascript-jquery-selezionare-scorrere-elementi-html-nodi_492.html#comments</comments>
		<pubDate>Mon, 25 May 2009 16:31:52 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[classi librerie]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=492</guid>
		<description><![CDATA[Tecniche javascript e jquery per selezionare, scorrere e manipolare gli elementi e i nodi di una pagina html, xml, tag, componenti com getElementById, getElementByTagName, children, childNodes, firstChild, lastChild, parentNode, nextSibling, previousSibling.]]></description>
			<content:encoded><![CDATA[<p><a title="Tecniche javascript e jquery per selezionare e scorrere gli elementi html" href="http://jblog.it/2009/05/25/tecniche-javascript-jquery-selezionare-scorrere-elementi-html-nodi_492.html" target="_self"><img class="alignright size-full wp-image-519" title="Craw machine" src="http://jblog.it/wp-content/uploads/2009/05/craw_machine.jpg" alt="Craw machine" width="290" height="190" /></a>Dopo aver letto l&#8217;<a title="10 Essential DOM Methods &amp; Techniques for Practical JavaScript" href="http://www.impressivewebs.com/10-essential-dom-methods-techniques-for-practical-javascript/" target="_blank">interessante articolo di <strong>ImpressiveWebs </strong>su alcune tecniche javascript</a> mi è venuta un&#8217;idea che ti piacerà. Ho deciso di integrarlo con le <strong>rispettive tecniche jquery</strong> ma, anziché limitarle esclusivamente all&#8217;ambito jquery cerco di mantenere comunque un legame con il puro codice javascript.</p>
<p><strong>Per quale motivo?</strong> Innanzitutto perché è interessante vedere come da jquery si possa passare ai classici oggetti javascript e poi perché in alcuni casi si preferisce programmare in javascript senza rinunciare ad alcune potenzialità di jquery come, ad esempio, i selettori, spesso argomento di scontro (e confronto) fra i vari framework. Inoltre, come dice ImpressiveWebs, alcuni sviluppatori si trovano a dover lavorare a progetti già avviati nei quali non è possibile (o non è sicuro) utilizzare librerie come jquery, mootools, dojo, ecc.</p>
<p>Un <strong>ringraziamento speciale</strong> va a <a href="http://www.impressivewebs.com/" target="_blank">ImpressiveWebs</a> che mi ha gentilmente autorizzato a tradurre buona parte dell&#8217;<a title="10 Essential DOM Methods &amp; Techniques for Practical JavaScript" href="http://www.impressivewebs.com/10-essential-dom-methods-techniques-for-practical-javascript/" target="_blank">articolo orginale</a>.<span id="more-492"></span></p>
<h2>getElementById: selezionare un elemento conoscendo l&#8217;id</h2>
<p><!--adv300--></p>
<p>Sappiamo che quasi tutti i tag html hanno l&#8217;attributo id. Questo attributo serve a <strong>identificare univocamente un elemento</strong> all&#8217;interno del documento html. Non è possibile specificare lo stesso id per due elementi diversi e, se ciò accade, il w3c validator segnalerà l&#8217;errore.</p>
<p>Supponiamo di avere un tag html con l&#8217;id &#8220;my_element_id&#8221;:</p>
<pre lang="html">&lt;div id="my_element_id"&gt;Questo è un elemento generico&lt;/div&gt;</pre>
<p>La caratteristica fondamentale dell&#8217;id ci permette di selezionare esattamente un elemento che ha come id un certo valore. Non a caso infatti la funzione restituisce un solo elemento e non un array di elementi, come avviene per funzioni che effettuano selezioni più generiche.</p>
<pre lang="js">var elemento = document.getElementById("my_element_id");</pre>
<p>Con jquery è possibile fare lo stesso ma, al contrario della precedente, la funzione jquery prevede la restituzione di un array di elementi poiché viene utilizzata anche per selezioni più generiche. Quindi sarà necessario selezionare il primo, nonché l&#8217;unico, elemento dell&#8217;array restituito. L&#8217;elemento ottenuto è esattamente uguale a quello ottenuto con la funzione getElementById.</p>
<pre lang="js">var elemento = $("#my_element_id")[0];</pre>
<h3>Ottenuto l&#8217;elemento che si fà?</h3>
<p>Si possono utilizzare tutte le proprietà e le funzioni (o meglio, metodi) javascript previste dal quel tipo di oggetto. Ad esempio:</p>
<pre lang="js">elemento.style.border = "1px solid #000";
elemento.disabled = "true";</pre>
<p>Se, invece, preferisci utilizzare jquery dovrai ricorrere necessariamente alle proprietà e ai metodi definiti nella libreria jquery. Ad esempio:</p>
<pre lang="js">$("#my_element_id").css("border",""1px solid #000"");
$("#my_element_id").attr("disabled","true");</pre>
<p><strong>ATTENZIONE.</strong> Spesso si sbaglia la scrittura della funzione scrivendo getElementBy<span style="text-decoration: underline;">ID</span> anziché getElementBy<span style="text-decoration: underline;">Id</span> (notare la &#8220;d&#8221; minuscola).</p>
<p><strong>Vantaggi.</strong> L&#8217;utilizzo di questa funzione impone la definizione di identificatori per i vari elementi che si vogliono gestire all&#8217;interno di funzioni javascript. Questo rappresenta un vantaggio poiché si tende a migliorare la scrittura del codice html. Un&#8217;altro possibile vantaggio è la maggior velocità della selezione per id rispetto alla selezione fra un&#8217;insieme di più elementi, che vedremo di seguito.</p>
<h2>getElementByTagName: selezionare un gruppo di tag</h2>
<p><img class="alignright size-full wp-image-525" title="Toystory craw machine" src="http://jblog.it/wp-content/uploads/2009/05/toystory2.jpg" alt="Toystory craw machine" width="170" height="115" />Se per qualche motivo non puoi o non vuoi specificare un id per alcuni elementi, questa funzione ti viene in aiuto. L&#8217;unico argomento della funzione è il tag degli elementi da selezionare i quali verranno poi restituiti in un <strong>array</strong>.</p>
<p><strong>Esempio.</strong> Supponiamo di avere una lista di link e di voler selezionare solo quelli che hanno l&#8217;attributo &#8220;target&#8221; uguale a &#8220;_blank&#8221; in modo da modificare il valore di questo attributo in &#8220;_top&#8221;.</p>
<pre lang="html">&lt;ul id="lista_5link"&gt;
	&lt;li&gt;&lt;a href="link1.html" target="_blank"&gt;Primo link&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="link2.html"&gt;Secondo link&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="link3.html" target="_blank"&gt;Terzo link&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="link4.html" target="_top"&gt;Quarto link&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="link5.html" target="_self"&gt;Quinto link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>Per selezionare i tag &#8220;&lt;a&gt;&#8221; con l&#8217;attributo &#8220;target&#8221; uguale a &#8220;_blank&#8221; dobbiamo innanzitutto ottenere un&#8217;array di tutti i tag &#8220;&lt;a&gt;&#8221; e successivamente modificare quelli che rispettano la nostra condizione.</p>
<pre lang="js">var myLinks = document.getElementsByTagName("a");

for(i=0; i&lt;myLinks.length; i++)
{
	if (myLinks[i].getAttribute("target") == "_blank")
	myLinks[i].setAttribute("target","_top");
}</pre>
<p>Con jquery il tutto si riduce a:</p>
<pre lang="js">$("a[target='_blank']").attr("target","_top");</pre>
<p>Con &#8220;a&#8221; si chiede di selezionare tutti i tag &#8220;&lt;a&gt;&#8221; e con &#8220;[target='_blank']&#8221; si chiede che questi tag abbiano l&#8217;attributo &#8220;target&#8221; uguale a &#8220;_blank&#8221;. Infine con <code>attr("target","_top")</code>, che viene eseguito solo se è stato trovato il tag richiesto, si imposta l&#8217;attributo &#8220;target&#8221; con il valore &#8220;_top&#8221;.</p>
<p><strong>Miglioramento.</strong> Per evitare che la ricerca dei tag &#8220;&lt;a&gt;&#8221; venga effettuata all&#8217;interno dell&#8217;intero documento, si può impostare l&#8217;id  alla lista in modo da <strong>restringere la ricerca</strong> agli elementi interni alla lista.</p>
<p>Al tag &#8220;&lt;ul&gt;&#8221; ho precedentemente assegnato l&#8217;id &#8220;lista_5link&#8221;. Ora vediamo come restringere la ricerca.</p>
<pre lang="js">// Seleziona l'elemento con l'id "lista_5link"
var oggettoLista = document.getElementById("lista_5link");

// Dell'elemento "oggettoLista" ricaviamo l'insieme dei tag &lt;a&gt;
var myLinks = oggettoLista.getElementsByTagName("a");

// Il ciclo for rimane uguale al precedente
for(i=0; i&lt;myLinks.length; i++)
{
	if (myLinks[i].getAttribute("target") == "_blank")
	myLinks[i].setAttribute("target","_top");
}</pre>
<p>Con jquery si aggiunge il vincolo &#8220;#lista_5link&#8221;:</p>
<pre lang="js">$("#lista_5link a[target='_blank']").attr("target","_top");
/* Invece di $("a[target='_blank']").attr("target","_top"); */</pre>
<h4>Soluzione ibrida</h4>
<pre lang="js">// Seleziona gli elementi &lt;a&gt; con jQuery
var myLinks = $("#lista_5link a")

// Il ciclo for rimane uguale al precedente
for(i=0; i&lt;myLinks.length; i++)
{
	if (myLinks[i].getAttribute("target") == "_blank")
	myLinks[i].setAttribute("target","_top");
}</pre>
<p><strong>Osservazione.</strong> Potresti dirmi &#8220;<em>perché non assegniamo lo stesso id a tutti i tag &lt;a&gt;?</em>&#8220;. Questa operazione non si può fare poiché l&#8217;id, per sua natura, deve necessariamente essere unico all&#8217;interno del documento, cioè solo un elemento può avere un certo id. Infatti, come spiegato prima, l&#8217;id deve servire a identificare univocamente <strong>un solo elemento</strong> all&#8217;interno del documento html.</p>
<h2>Leggere e scorrere i nodi del documento</h2>
<p><strong><img class="alignright size-full wp-image-521" title="node" src="http://jblog.it/wp-content/uploads/2009/05/node.jpg" alt="node Tecniche javascript e jquery per selezionare e scorrere elementi html e nodi" width="249" height="159" />Cosa sono i nodi?</strong> Un nodo è un qualsiasi elemento, tag, contenitore, blocco autonomo (es. &lt;br /&gt;, &lt;hr /&gt;), frammento di testo. I nodi hanno una <strong>relazione genitore-figlio</strong>. Ad esempio, nel caso della lista illustrata precedentemente, &lt;ul&gt; è il genitore e &lt;li&gt; il figlio, che a sua volta è il genitore di &lt;a&gt;.</p>
<p><strong>Ogni elemento è un nodo</strong> e come tale ha alcune proprietà e metodi che ci permettono di ricavare i suoi figli diretti (children), il suo genitore (parent), e di manipolarli in vari modi.</p>
<h4>Codice html che utilizzeremo per tutti gli esempi</h4>
<pre lang="html">&lt;div id="parent_div"&gt;
	&lt;p&gt;Paragrafo1&lt;/p&gt;
	&lt;p&gt;Paragrafo2&lt;/p&gt;
	&lt;a href="#"&gt;Link&lt;/a&gt;
	&lt;p&gt;Paragrafo3&lt;/p&gt;
	&lt;h5&gt;Titolo h5&lt;/h5&gt;
&lt;/div&gt;</pre>
<h2>Ottenere i nodi figli con childNodes e children</h2>
<p>Le due proprietà, childNode e children, sono costituite da un array dei figli diretti.</p>
<p>La differenza fra le due consiste nel fatto che children ignora i nodi di tipo testo concentrandosi sugli elementi html e xml.</p>
<ul>
<li>La <strong>proprietà childNodes</strong> rileva come &#8220;figli del contenitore&#8221; tutti gli elementi: tag, elementi, testo, ecc. Come si può vedere in figura, l&#8217;array childNodes avrà <strong>10 elementi</strong>: gli indici pari saranno gli elementi &#8220;testuali&#8221; e gli indici dispari i tag html. <strong>N.B.</strong> i blocchi evidenziati sono i figli &#8220;testuali&#8221;, quelli non evidenziati sono i figli &#8220;html&#8221;</li>
<li>La <strong>proprietà children </strong>rileva come &#8220;figli del contenitore&#8221; solo i tag html. Quindi l&#8217;array children avrà solo 5 elementi: i tag contenuti nel div &#8220;parent_div&#8221;</li>
</ul>
<p><a title="childNodes - children | Visualizza l'immagine al 100%" href="http://jblog.it/wp-content/uploads/2009/05/childnodes_children.png"><img class="aligncenter size-full wp-image-507" title="Differenza fra childNodes e children" src="http://jblog.it/wp-content/uploads/2009/05/childnodes_children.png" alt="Differenza fra childNodes e children" width="540" height="183" /></a><strong>Esempio. </strong>Supponiamo di voler assegnare a tutti i figli del div &#8220;parent_div&#8221; la classe &#8220;newclass&#8221;.</p>
<h3>La proprietà children</h3>
<pre lang="js">// Otteniamo i figli diretti di "parent_div"
var div_children = document.getElementById("parent_div").children;

for(i=0;i&lt;div_children.length;i++)
{
	// Assegniamo la classe "newclass"
	div_children[i].className="newclass";
}</pre>
<p><strong>ATTENZIONE.</strong> Ho riscontrato alcuni problemi legati a questa proprietà, ad esempio su Firefox. L&#8217;<strong>alternativa </strong>è proprio childNodes, da utilizzare con qualche piccolo accorgimento.</p>
<h3>La proprietà childNodes e nodeType</h3>
<p>Gli stessi risultati della proprietà children possono essere ottenuti con la proprietà childNodes, controllando il tipo di nodo che si sta leggendo grazie alla proprietà <strong>nodeType</strong>. Questa proprietà può avere 12 valori diversi (interi, da 1 a 12). La lista completa la puoi trovare qui: <a title="XML DOM Node Types" href="http://www.w3schools.com/Dom/dom_nodetype.asp" target="_blank">http://www.w3schools.com/Dom/dom_nodetype.asp</a> . In particolare, poiché la proprietà children non considera i <strong>nodi testuali</strong>, controlliamo che nodeType non sia 3 (codice corrispondente ai nodi testuali).</p>
<pre lang="js">// Otteniamo i figli diretti di "parent_div"
var div_children = document.getElementById("parent_div").childNodes;

for(i=0;i&lt;div_children.length;i++)
{
	// Controlliamo il tipo di nodo: noteType=3 se è un nodo testuale
	if(div_children[i].nodeType==3) continue;

	// Assegniamo la classe "newclass"
	div_children[i].className="newclass";
}</pre>
<p>Il <strong>risultato è identico</strong> al codice precedente in cui si utilizza la proprietà children.</p>
<h3>Soluzione ibrida</h3>
<pre lang="js">// Selezione figli con jquery
var div_children = $("#parent_div").children();

// Ciclo for uguale al precedente
for(i=0;i&lt;div_children.length;i++)
{
	// Assegniamo la classe "newclass"
	div_children[i].className="newclass";
}</pre>
<p><strong>N.B.</strong> la selezione con jquery ha lo stesso effetto della proprietà children, ovvero seleziona tutti i figli tranne quelli di tipo testuale.</p>
<h3>Soluzione con jquery</h3>
<pre lang="js">// Selezione figli con jquery e assegnazione della classe "newclass"
$("#parent_div").children().addClass("newclass");</pre>
<p>Con <code>$("#parent_div").children()</code> otteniamo i figli e con <code>addClass("newclass")</code> assegniamo la classe &#8220;newclass&#8221; ai figli trovati.</p>
<h2>Ottenere il primo e l&#8217;ultimo nodo figlio con firstChild e lastChild</h2>
<p>Normalmente per recuperare il primo o l&#8217;ultimo nodo figlio di un elemento si dovrebbero scrivere le seguenti righe di codice:</p>
<pre lang="js">// Primo nodo figlio
var first_child = document.getElementById("parent_div").firstChild;

// Ultimo nodo figlio
var last_child = document.getElementById("parent_div").lastChild;</pre>
<p><strong>Problema.</strong> Come per la proprietà childNodes, anche queste leggono qualsiasi tipo di nodo. Quindi, se fra due elementi c&#8217;è un carattere di spaziatura o un tab, questo verrà considerato un nodo.</p>
<p><strong>Soluzione.</strong> Con un semplice ciclo while possiamo leggere i successivi (o precedenti) nodi di tipo non testuale.</p>
<pre lang="js">// Primo nodo figlio
var first_child = document.getElementById("parent_div").firstChild;

// Se il nodo letto è di tipo testuale leggiamo il successivo
while(first_child!=null &amp;&amp; first_child.nodeType==3)
first_child = first_child.nextSibling;

// Ultimo nodo figlio
var last_child = document.getElementById("parent_div").lastChild;

// Se il nodo letto è di tipo testuale leggiamo il precedente
while(last_child!=null &amp;&amp; last_child.nodeType==3)
last_child = last_child.previousSibling;</pre>
<p><strong>Osservazioni.</strong> Le condizioni del <strong>ciclo while</strong> controllano che il nodo sia stato trovato (cioé che sia diverso da null) e che il tipo sia testuale (cioé nodeType = 3). Se entrambe le condizioni sono verificate il nodo attuale viene rimpiazzato con il successivo (nel caso del primo nodo) o con il precedente (nel caso dell&#8217;ultimo nodo). Questo procedimento si ripete finché non ci sono più nodi figli o non viene trovato un nodo di tipo &#8220;non testuale&#8221;. La proprietà <strong>nextSibling </strong>permette di ottenere il nodo successivo; la proprietà <strong>previousSibling </strong>permette di ottenere il nodo precedente.</p>
<h3>Soluzione ibrida con jquery</h3>
<p>Poiché il metodo children() di jquery legge i nodi figlio di tipo &#8220;non testuale&#8221;.</p>
<p>Per ricavare il primo e l&#8217;ultimo nodo figlio si passa come argomento &#8220;:first&#8221; (per il primo nodo) e &#8220;:last&#8221; (per l&#8217;ultimo nodo).</p>
<pre lang="js">// Primo nodo figlio
var first_child = $("#parent_div").children(":first");

// Ultimo nodo figlio
var last_child = $("#parent_div").children(":last");</pre>
<h2>Ottenere il genitore di un nodo con parentNode</h2>
<p>Supponiamo di avere il seguente codice html:</p>
<pre lang="html">&lt;div id="parent_div"&gt;
	&lt;p id="child1"&gt;Paragrafo1&lt;/p&gt;
	&lt;p id="child2"&gt;Paragrafo2&lt;/p&gt;
	&lt;p id="child3"&gt;Paragrafo3&lt;/p&gt;
&lt;/div&gt;</pre>
<p>Per ottenere il genitore dei tre paragrafi utilizzeremo la proprietà parentNode su uno dei tre paragrafi.</p>
<pre lang="js">var parent_node1 = document.getElementById("child1").parentNode;
var parent_node2 = document.getElementById("child2").parentNode;
var parent_node3 = document.getElementById("child3").parentNode;</pre>
<p>Le <strong>tre variabili</strong> (parent_node1, parent_node2, parent_node3) avranno lo <strong>stesso nodo</strong>: il div &#8220;parent_div&#8221;.</p>
<h3>Soluzione con jquery</h3>
<pre lang="js">// parent() restituisce un array di un solo elemento
var my_node = $("#ciaociao").parent()[0];</pre>
<h2>Ottenere i &#8220;fratelli&#8221; dei nodi con nextSibling e previousSibling</h2>
<p>Per ottenere il fratello di un nodo si possono utilizzare due funzioni:</p>
<ul>
<li><strong>nextSibling</strong>, per leggere il fratello successivo</li>
<li><strong>previousSibling</strong>, per leggere il fratello precedente</li>
</ul>
<p>Supponiamo di avere il seguente codice html:</p>
<pre lang="html">&lt;div id="parent_div"&gt;
	&lt;p id="child1"&gt;Paragrafo1&lt;/p&gt;
	&lt;p id="child2"&gt;Paragrafo2&lt;/p&gt;
	&lt;p id="child3"&gt;Paragrafo3&lt;/p&gt;
&lt;/div&gt;</pre>
<p>Vogliamo ottenere il nodo corrispondente al paragrafo di id &#8220;child2&#8243;.</p>
<p><strong>Problema.</strong> Anche queste proprietà selezionano i nodi di tipo &#8220;testuale&#8221;.</p>
<p><strong>Soluzione.</strong> Inseriamo un ciclo while identico a quello scritto per le proprietà firstChild e lastChild.</p>
<pre lang="js">// Ottenere il nodo "child2" partendo dal paragrafo "child1"
var node_child2_mod1 = document.getElementById("child1").nextSibling;

// Se il nodo letto è di tipo testuale leggiamo il successivo
while(node_child2_mod1!=null &amp;&amp; node_child2_mod1.nodeType==3)
node_child2_mod1 = node_child2_mod1.nextSibling;

// Ottenere il nodo "child2" partendo dal paragrafo "child3"
var node_child2_mod2 = document.getElementById("child1").previousSibling;

// Se il nodo letto è di tipo testuale leggiamo il precedente
while(node_child2_mod2!=null &amp;&amp; node_child2_mod2.nodeType==3)
node_child2_mod2 = node_child2_mod2.previousSibling;</pre>
<h3>Soluzione con jquery</h3>
<p>Fortunatamente i metodi next() e prev() di jquery selezionano solo i nodi &#8220;non testuali&#8221; e restituiscono un set di nodi costituito di fatto da un solo nodo.</p>
<pre lang="js">// Ottenere il nodo "child2" partendo dal paragrafo "child1"
var node_child2_mod1 = $("#child1").next()[0];

// Ottenere il nodo "child2" partendo dal paragrafo "child3"
var node_child2_mod2 = $("#child3").next()[0];</pre>
<h2>Attraversare i &#8220;fratelli&#8221; dei nodi con nextSibling e previousSibling</h2>
<p><img class="aligncenter size-full wp-image-522" title="Children climbing" src="http://jblog.it/wp-content/uploads/2009/05/climbing.jpg" alt="Children climbing" width="490" height="270" />Supponiamo di voler modificare tutti i fratelli di un certo nodo. Per fare ciò è necessario scorrere tutti i nodi &#8220;fratelli&#8221; modificandoli in base alle nostre esigenze. In realtà l&#8217;attraversamento dei nodi fratelli l&#8217;abbiamo già fatto in occasione dei cicli while utilizzati per risolvere il problema della selezione dei nodi testuali.</p>
<p>Utiliziamo il codice html dell&#8217;esempio precedente.</p>
<pre lang="js">// Otteniamo il nodo corrispondente al paragrafo "child1"
var node_child1 = document.getElementById("child1");

// Scorriamo tutti i fratelli di node_child1
while(node_child1!=null &amp;&amp; node_child1.nodeType!=3)
{
	// Leggiamo il fratello di node_child1 e lo inseriamo nella stessa variabile
	node_child1 = node_child1.nextSibling;

	// Esempio: applichiamo la classe "newclass"
	node_child1.className="newclass";
}</pre>
<h2>Conclusioni</h2>
<p>Queste sono alcune delle principali tecniche per selezionare e scorrere gli elementi html con il codice javascript &#8220;puro&#8221; e utilizzando il famoso framework jquery che, come avrai potuto notare, semplifica la scrittura di codice javascript e ne riduce drasticamente la lunghezza.</p>
<p><strong>In queste situazioni preferisci utilizzare javascript puro o jquery? Hai avuto problemi durante l&#8217;utilizzo di queste tecniche? Si possono migliorare in qualche modo?</strong></p>
<h2>Crediti</h2>
<ul>
<li><a href="http://www.impressivewebs.com" target="_blank">ImpressiveWebs</a> &#8211; <a title="10 Essential DOM Methods &amp; Techniques for Practical JavaScript" href="http://www.impressivewebs.com/10-essential-dom-methods-techniques-for-practical-javascript/" target="_blank">10 Essential DOM Methods &amp; Techniques for Practical JavaScript</a></li>
<li><strong>Libro</strong>. Javascript &#8211; La guida di Danny Goodman, Michael Morrison (<a href="http://www.informatica.mcgraw-hill.it/" target="_blank">McGraw-Hill</a>)</li>
<li>Foto1: <a href="http://www.flickr.com/photos/joshnjerry/2453291663/" target="_blank">Catch me if you can!</a> di <a href="http://www.flickr.com/photos/joshnjerry/">Josh n Jerry</a></li>
<li>Foto2: <a href="http://www.freerepublic.com/focus/f-chat/2096935/posts" target="_blank">http://www.freerepublic.com/focus/f-chat/2096935/posts</a></li>
<li>Foto3: <a href="http://www.flickr.com/photos/12184548@N02/1428798524/" target="_blank">Node</a> di <a href="http://www.flickr.com/photos/12184548@N02/" target="_blank">dixit M</a></li>
<li>Foto5: <a href="http://www.flickr.com/photos/docman/6107473/" target="_blank">Climbing</a> di <a href="http://www.flickr.com/photos/docman/" target="_blank">docman</a></li>
</ul>
<img src="http://jblog.it/?ak_action=api_record_view&id=492&type=feed" alt=" Tecniche javascript e jquery per selezionare e scorrere elementi html e nodi"  title="Tecniche javascript e jquery per selezionare e scorrere elementi html e nodi" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/05/25/tecniche-javascript-jquery-selezionare-scorrere-elementi-html-nodi_492.html/feed</wfw:commentRss>
		<slash:comments>5</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>
