<?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; Javascript</title>
	<atom:link href="http://jblog.it/category/javascript/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>5 miti da sfatare su javascript</title>
		<link>http://jblog.it/2010/05/14/5-miti-da-sfatare-su-javascript_888.html</link>
		<comments>http://jblog.it/2010/05/14/5-miti-da-sfatare-su-javascript_888.html#comments</comments>
		<pubDate>Fri, 14 May 2010 08:50:00 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[bug javascript]]></category>
		<category><![CDATA[oggetti javascript]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=888</guid>
		<description><![CDATA[Consiglio la lettura questo articolo che ho trovato molto interessante perché mi ha aperto gli occhi su alcuni aspetti di javascript che non conoscevo. Mi ha molto colpito il fatto che javascript è largamente utilizzato anche fuori dai browser.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-889" title="5 Common Myths About JavaScript" src="http://jblog.it/wp-content/uploads/2010/05/sitepoint1.jpg" alt="sitepoint1 5 miti da sfatare su javascript" width="540" height="206" /></p>
<p>Consiglio la lettura <a title="5 Common Myths About JavaScript" href="http://www.sitepoint.com/blogs/2010/04/27/5-common-javascript-myths/" target="_blank">questo articolo</a> che ho trovato molto interessante perché mi ha aperto gli occhi su alcuni aspetti di javascript che non conoscevo.</p>
<p>Mi ha molto colpito il fatto che javascript è largamente utilizzato anche fuori dai browser.</p>
<p>I 5 miti da sfatare sono questi:</p>
<ul>
<li>javascript = java (chi non ha mai sentito questa affermazione? <img src='http://jblog.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="5 miti da sfatare su javascript" />  )</li>
<li>javascript è un linguaggio &#8220;giocattolo&#8221;</li>
<li>javascript si trova solo nei browser</li>
<li>javascript è inconsistente e pieno di bug</li>
<li>javascript non è &#8220;orientato agli oggetti&#8221;</li>
</ul>
<p>Per approfondire i motivi per cui queste affermazioni sono sbagliate non ti resta che continuare a leggere l&#8217;articolo su sitepoint.com!</p>
<img src="http://jblog.it/?ak_action=api_record_view&id=888&type=feed" alt=" 5 miti da sfatare su javascript"  title="5 miti da sfatare su javascript" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2010/05/14/5-miti-da-sfatare-su-javascript_888.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Steve Jobs, Adobe Flash e HTML5</title>
		<link>http://jblog.it/2010/05/03/steve-jobs-adobe-flash-e-html5_851.html</link>
		<comments>http://jblog.it/2010/05/03/steve-jobs-adobe-flash-e-html5_851.html#comments</comments>
		<pubDate>Mon, 03 May 2010 05:00:52 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Grafica]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[player]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=851</guid>
		<description><![CDATA[Fra le news di Apple.com è stato pubblicato un articolo in cui Steve Jobs, dopo una lunga argomentazione, spiega i motivi per cui i dispositivi Apple non saranno dotati della tecnologia Adobe Flash.]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-859" title="steve jobs, adobe flash, html5" src="http://jblog.it/wp-content/uploads/2010/05/2383695697_78c257f25c_3b-copia.jpg" alt="2383695697 78c257f25c 3b copia Steve Jobs, Adobe Flash e HTML5" width="540" height="187" /><br />
<small>Photo by ex.libris | <a href="http://www.flickr.com/photos/exlibris/2383695697/" target="_blank">http://www.flickr.com/photos/exlibris/2383695697/</a></small></p>
<p>Come sempre le dichiarazioni di <strong>Steve Jobs</strong> hanno fatto tanto parlare, bloggare e twittare.</p>
<p>Fra le news di Apple.com è stato pubblicato <a title="Thoughts on flash" href="http://www.apple.com/hotnews/thoughts-on-flash/" target="_blank">un articolo</a> in cui Steve Jobs, <strong>dopo una lunga argomentazione</strong>, spiega i motivi per cui i dispositivi Apple non saranno dotati della tecnologia Adobe Flash:</p>
<blockquote><p>Flash was created during the PC era – for PCs and mice. Flash is a successful business for Adobe, and we can understand why they want to push it beyond PCs. But the mobile era is about low power devices, touch interfaces and open web standards – all areas where Flash falls short.</p></blockquote>
<p><span id="more-851"></span></p>
<blockquote><p>The avalanche of media outlets offering their content for Apple’s mobile devices demonstrates that Flash is no longer necessary to watch video or consume any kind of web content. And the 200,000 apps on Apple’s App Store proves that Flash isn’t necessary for tens of thousands of developers to create graphically rich applications, including games.</p></blockquote>
<blockquote><p>New open standards created in the mobile era, such as HTML5, will win on mobile devices (and PCs too). Perhaps Adobe should focus more on creating great HTML5 tools for the future, and less on criticizing Apple for leaving the past behind.</p></blockquote>
<p><!--adv300--></p>
<p>Il succo è questo:</p>
<ul>
<li>Flash è nato negli anni dei personal computer, intesi come &#8220;display + case + mouse + tastiera&#8221;</li>
<li>le funzionalità dei dispositivi Apple e delle centinaia di migliaia di  &#8220;apps&#8221; dimostrano che Flash non è indispensabile per raggiungere  determinati livelli di grafica e multimedialità</li>
<li><strong>questi sono gli anni dei dispositivi mobili</strong>, cioé dei dispositivi a basso consumo, touch screen, e che utilizzano gli standard web &#8220;aperti&#8221;, campi in cui Flash sembra essere inadatto e un po&#8217; arretrato</li>
</ul>
<p>Infine, Jobs conclude dicendo che <em>Adobe dovrebbe concentrarsi nel creare strumenti che sfruttino le potenzialità di HTML5</em>.</p>
<p>Partendo dal fatto che non sono un fanatico Apple, che ho solo un iPod (della prima generazione! <img src='http://jblog.it/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="Steve Jobs, Adobe Flash e HTML5" /> ), e che non ho nulla contro Adobe&#8230; <strong>secondo me, Steve Jobs ha ragione! E anche Microsoft la pensa così.<br />
</strong></p>
<h2>Audio e Video player</h2>
<p>Prima che i multimedia player venissero implementati con Flash, si faceva largo uso di <strong>Real Player</strong> e <strong>Windows Media</strong>. Funzionavano. Ma quanto tempo si perdeva a scaricare e installare i plugin e gli ActiveX!?</p>
<p>Se andava tutto liscio, in pochi minuti era tutto pronto; se per qualche strano motivo il browser o il sistema operativo non erano compatibili si rischiava di perdere delle ore fra riavvii, download e installazioni.</p>
<p><strong>Poi è arrivato Flash</strong> con un plugin di gran lunga più leggero, semplice e immediato nell&#8217;installazione.</p>
<p>La prima volta che ho visto un video player realizzato con Flash è stato su <strong>YouTube </strong>(probabilmente uno dei primi siti con un video player Flash) il cui successo, secondo me, è dovuto anche ai vantaggi del plugin di Flash.</p>
<p><strong>Gestire audio e video con Flash</strong> significa programmare in ActionScript un player che gestisca lo streaming e che permetta le operazioni più comuni (es. play, stop, volume). Oppure, se si prende la via più facile, si cerca un player realizzato da altri, si impara e si inserisce nella pagina.</p>
<p><strong>Gestire audio e video con Html5</strong> significa inserire nella pagina i tag <code>&lt;audio&gt;</code> e <code>&lt;video&gt;</code> (proprio come si fa per le immagini con il tag <code>&lt;img /&gt;</code>), segnalare al tag il file da riprodurre e basta! Queste sono le <strong>operazioni minime</strong> per riprodurre un file multimediale. Un player più complesso lo si può sempre realizzare con un po&#8217; di html, css e javascript.</p>
<p>Senza sprecare ulteriori parole, <strong>ecco cosa può fare l&#8217;HTML5</strong>:</p>
<ul>
<li>7 stupendi e funzionanti video player | <a href="http://speckyboy.com/2010/04/23/html5-video-libraries-toolkits-and-players/" target="_blank">http://speckyboy.com/2010/04/23&#8230;</a></li>
<li>Javascript Audio Interface | <a href="http://hyper-metrix.com/misc/jai/" target="_blank">http://hyper-metrix.com/misc/jai/</a></li>
<li>jPlayer, plugin jquery per la gestione di file audio| <a href="http://www.happyworm.com/jquery/jplayer/" target="_blank">http://www.happyworm&#8230;</a></li>
</ul>
<h2>Grafica e animazioni</h2>
<p>Flash ha il merito di aver introdotto molti ottimi strumenti che hanno permesso di realizzare <strong>siti graficamente complessi e ricchi di animazioni</strong>, mantenendo comunque una certa efficienza. Fra gli svantaggi c&#8217;era ancora la necessità del plugin e l&#8217;acquisto del software, però i risultati ottenuti erano sorprendenti.</p>
<p>Tuttavia <strong>javascript</strong>, grazie ai miglioramenti e alla maggiore compatibilità con i vari browser, ha iniziato ad essere sempre più utilizzato per ottenere le piccole interattività della pagina (es. tooltips, ridimensionamenti, validazione form).</p>
<p>Attualmente nel campo della grafica web e delle animazioni non si può dire che Flash sia obsoleto. Ci sono però delle animazioni realizzate con <strong>javascript e canvas</strong> che ti lascererebbero a bocca aperta! <img src='http://jblog.it/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="Steve Jobs, Adobe Flash e HTML5" /> </p>
<p>Se non ci credi dai uno sguardo a <a title="Chrome Experiments" href="http://www.chromeexperiments.com/" target="_blank">Chrome Experiments</a>: animazioni bellissime e complesse realizzate interamente con javascript e canvas.</p>
<h2>I nuovi tag HTML5 per il multimedia</h2>
<p>Come <em><strong>utenti </strong></em>e come <em><strong>web designer</strong></em>, il fatto di aver bisogno di plugin e ActiveX per far funzionare correttamente un sito o un&#8217;applicazione web è qualcosa di estremamente fastidioso e limitante.</p>
<p>Infatti, il <strong>maggior vantaggio dell&#8217;HTML5</strong> consiste proprio nella gestione di contenuti grafici e multimediali <strong>senza installare componenti aggiuntivi</strong>. In fondo era quello che volevamo, giusto?!</p>
<p>A questo proposito, ecco i <strong>nuovi tag HTML5</strong> per la gestione della grafica e dei contenuti multimediali:</p>
<p><code><strong>&lt;audio&gt;</strong></code>, gestisce i flussi audio (anche in streaming).</p>
<p><code><strong>&lt;canvas&gt;</strong></code>, contenitore per grafica creata con appositi script.</p>
<p><code><strong>&lt;source&gt;</strong></code>, tag generico per sorgenti multimediali di vario tipo (funziona come i tag <code>&lt;audio&gt;</code> e <code>&lt;video&gt;</code>).</p>
<p><code><strong>&lt;video&gt;</strong></code>, gestisce i flussi video (anche in streaming).</p>
<h3>Documentazioni utili</h3>
<ul>
<li>Documentazione ufficiale del W3C | <a href="http://www.w3.org/TR/html5/" target="_blank">http://www.w3.org/TR/html5/</a></li>
<li>Dive Into HTML5 by Mark Pilgrim | <a href="http://diveintohtml5.org/" target="_blank">http://diveintohtml5.org/</a></li>
<li>Native Audio in the browser | <a href="http://html5doctor.com/native-audio-in-the-browser/" target="_blank">http://html5doctor.com/native-audio&#8230;</a></li>
</ul>
<h3>Curiosità</h3>
<ul>
<li>HTML 5 or HTML5? | <a href="http://meiert.com/en/blog/20090911/html-5-or-html5/" target="_blank">http://meiert.com/en/blog/20090911/html-5-or-html5/</a></li>
<li>HTML5 Video Destruction | <a href="http://www.craftymind.com/factory/html5video/CanvasVideo.html" target="_blank">http://www.craftymind.com/factory/html5video&#8230;</a></li>
<li>HTML5 Canvas and Audio Experiment | <a href="http://9elements.com/io/projects/html5/canvas/" target="_blank">http://9elements.com/io/projects&#8230;</a></li>
</ul>
<img src="http://jblog.it/?ak_action=api_record_view&id=851&type=feed" alt=" Steve Jobs, Adobe Flash e HTML5"  title="Steve Jobs, Adobe Flash e HTML5" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2010/05/03/steve-jobs-adobe-flash-e-html5_851.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>20 servizi web e librerie per ottimizzare i componenti della pagina: immagini, javascript, css</title>
		<link>http://jblog.it/2009/06/10/ottimizzare-componenti-pagina-velocizzare-caricamento-immagini-css-script_640.html</link>
		<comments>http://jblog.it/2009/06/10/ottimizzare-componenti-pagina-velocizzare-caricamento-immagini-css-script_640.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 11:36:50 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Css]]></category>
		<category><![CDATA[Grafica]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ottimizzazione]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[classe php]]></category>
		<category><![CDATA[classi librerie]]></category>
		<category><![CDATA[csstidy]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[espressioni regolari]]></category>
		<category><![CDATA[ottimizzare]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[richieste http]]></category>
		<category><![CDATA[servizi web]]></category>
		<category><![CDATA[sprite css]]></category>
		<category><![CDATA[yui compressor]]></category>
		<category><![CDATA[yui library]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=640</guid>
		<description><![CDATA[Dopo gli articoli &#8220;ridurre le richieste HTTP (parte 1): come utilizzare la cache del browser&#8221; e &#8220;ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css&#8221; vorrei parlarti delle tecniche per l&#8217;ottimizzazione dei componenti più comuni di una pagina web: immagini, script e css.

In questo articolo non verranno descritti dei metodi per [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo gli articoli &#8220;<a 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>&#8221; e &#8220;<a href="http://jblog.it/2009/05/15/ridurre-richieste-http-parte-2-come-combinare-immagini-script-css-sprite-image-maps_405.html">ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css</a>&#8221; vorrei parlarti delle tecniche per l&#8217;ottimizzazione dei componenti più comuni di una pagina web: immagini, script e css.</p>
<p><img class="aligncenter size-full wp-image-657" title="forty-nine: compressed work week" src="http://jblog.it/wp-content/uploads/2009/10/ottimizzare.jpg" alt="forty-nine: compressed work week" width="500" height="333" /></p>
<p><span class="highlight_yellow"><strong>In questo articolo</strong> non verranno descritti dei metodi per la riduzione delle richieste HTTP ma parlerò delle modifiche e degli strumenti che ti permetteranno di ottimizzare i componenti della pagina per velocizzarne le relative richieste HTTP.</span><br />
<span id="more-640"></span><br />
<!--adv300--></p>
<h2>Ottimizzare le immagini</h2>
<p>Anche se l&#8217;ottimizzazione non riduce le richieste http, è comunque importante per <strong>abbassare i tempi di caricamento</strong> delle pagine.</p>
<p>Ottimizzare un&#8217;immagine non è immediato; spesso sono necessarie molte prove e test per individuare il <strong>giusto bilanciamento</strong> fra qualità e dimensione del file.</p>
<p>Generalmente la compressione di un immagine è un&#8217;operazione da eseguire <strong>manualmente </strong>prima di caricare l&#8217;immagine nel proprio sito. Per fare ciò esistono numerosi <strong>script e tool gratuiti</strong>. Eccone alcuni.</p>
<div style="padding-left:20px;">
<h4><a href="http://www.imagemagick.org/" target="_blank">ImageMagick</a></h4>
<p><img class="alignright size-full wp-image-648" title="ImageMagick logo" src="http://jblog.it/wp-content/uploads/2009/06/logo.jpg" alt="ImageMagick logo" width="114" height="118" />ImageMagick è un set di librerie per creare, modificare e comporre immagini bitmap. Può leggere, convertire e scrivere immagini in vari formati (es. <strong>DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, <a class="zem_slink" title="Portable Network Graphics" rel="wikipedia" href="http://en.wikipedia.org/wiki/Portable_Network_Graphics">PNG</a>, Postscript, SVG, e TIFF</strong>). ImageMagick, oltre alla rotazione e al ridimensionamento, permette di effettuare operazioni abbastanza complesse, applicare effetti speciali e tracciare forme.</p>
<p>Sul sito potrai trovare i libri consigliati (in lingua inglese) e tutto il necessario per iniziare a utilizzare queste librerie.</p>
<h4><a href="http://www.imagemagick.org/script/api.php" target="_blank">ImageMagick APIs</a></h4>
<p>ImageMagick include interfacce ed estensioni per utilizzare queste magnifiche librerie con i tuoi linguaggi di programmazione preferiti.</p>
<h4><a href="http://pmt.sourceforge.net/pngcrush/" target="_blank">PNGCrush</a></h4>
<p>PNGCrush è un tool per l&#8217;ottimizzazione di immagini PNG. Può essere eseguito dalla <strong>linea di comando di MSDOS, UNIX o LINUX</strong>. L&#8217;obiettivo principale è quello di ridurre la dimensione delle immagini PNG scegliendo vari livelli di compressione e filtri. Può essere anche utilizzato per purificare le immagini da tutte quelle informazioni aggiuntive lasciate dai vari software, o aggiungere altri tipi di blocchi.</p>
<h4><a href="http://jpegclub.org/jpegtran/" target="_blank">JPEGtran</a></h4>
<p>JPEGtran è una libreria per la trasformazioni di immagini JPEG con l&#8217;obiettivo di minimizzare la perdita informazioni e avere la maggior qualità possibile. Questa libreria comprende anche una funzione per determinare la miglior compressione per una certa immagine, in modo da evitare che si facciano numerosi test e verifiche.</p>
<p>Una <strong>guida </strong>sulle funzioni di questa libreria la puoi trovare <a href="http://www.gsp.com/cgi-bin/man.cgi?section=1&amp;topic=jpegtran" target="_blank">qui</a>.</p>
<h4><a href="http://tools.dynamicdrive.com/imageoptimizer/" target="_blank">Online Image Optimizer (GIF, JPG, and PNG)</a></h4>
<p><img class="alignright size-full wp-image-649" title="DynamicDrive Logo" src="http://jblog.it/wp-content/uploads/2009/06/logo.gif" alt="DynamicDrive Logo" width="200" height="30" />DynamicDrive ha sviluppato un ottimo tool per la compressione di immagini nei classici formati <strong>GIF, JPG e PNG</strong>. Questo è lo script originale sul quale sono nati numerosi servizi online per la compressione. Peccato che il limite sia di 300kb.</p>
<h4><a href="http://www.imageoptimizer.net/Pages/Home.aspx" target="_blank">Free Image Optimizer</a></h4>
<p><img class="alignright size-full wp-image-650" title="ImageOptimizer" src="http://jblog.it/wp-content/uploads/2009/06/banner.jpg" alt="ImageOptimizer" width="200" height="31" />Questo servizio web è un po&#8217; più evoluto rispetto a quello di <strong>DynamicDrive</strong> poiché non ti permette solo di compressare l&#8217;immagine ma anche di scegliere la dimensione di destinazione. Nel caso ti piacesse potrai scaricarne gratuitamente una versione trial.</p>
<h4><a href="http://luci.criosweb.ro/riot/" target="_blank">RIOT (Radical Image Optimization Tool)</a></h4>
<p><img class="alignright size-full wp-image-651" title="Radical Image Optimizer Tool" src="http://jblog.it/wp-content/uploads/2009/06/riot.jpg" alt="Radical Image Optimizer Tool" width="160" height="130" />RIOT è un <strong>software gratuito</strong> che ti aiuta a scegliere la miglior compressione osservandone i risultati in <strong>tempo reale</strong> grazie a un&#8217;interfaccia &#8220;dual view&#8221;. Grazie a questo software sarà facilissimo controllare la compressione, il numero di colori, le impostazioni, il formato delle immagini e molto altro. Compatibile con Windows 2000, XP e VISTA.</p>
<p>Sono disponibili anche le <strong>estensioni DLL </strong>per i più comuni linguaggi di programmazione (C, C++, Perl, PHP, Java, Phyton, ecc.).</p>
<h4><a href="http://www.softplatz.net/freeware/batch-image-compression/" target="_blank">Batch Image Compression Freeware</a></h4>
<p>Questa è un&#8217;enorme <strong>lista di software</strong> per la compressione e l&#8217;elaborazione di gruppi di immagini. Spazia dalla semplice conversione alla correzione di colore e occhi rossi. Assolutamente da vedere.</p>
</div>
<h2>Compressione di file CSS e Javascript</h2>
<p>Questa pratica (in inglese chiamata &#8220;minification&#8221;) consiste nel rimuovere dal codice tutti i caratteri non necessari in modo da ridurre la dimensione del file. Tecnicamente avviene quanto segue:</p>
<ul>
<li>vengono ristretti i nomi di variabili</li>
<li>caratteri di spaziatura come tab, a capo e spazio vengono eliminati (dove possibile)</li>
<li>vengono cancellati tutti i commenti</li>
</ul>
<p><strong>ATTENZIONE.</strong> Dopo la compressione il funzionamento degli script e i nomi delle funzioni rimangono invariati, quindi non è necessario modificare i file di template. In altre parole, i nomi delle variabili che vengono modificati sono i parametri locali delle funzioni, che non influenzano la modalità di chiamata delle funzioni.</p>
<h2>Offuscare il codice Javascript</h2>
<p><img class="alignright size-full wp-image-662" title="Offuscare javascript" src="http://jblog.it/wp-content/uploads/2009/06/2245309248_dc22bd13591.jpg" alt="Offuscare javascript" width="270" height="165" />Offuscare il codice (in inglese &#8220;obfuscate&#8221;, &#8220;obfuscation&#8221;) significa comprimerlo e trasformarlo in modo che risulti illeggibile (per i programmatori) per evitare che venga effettuato il cosiddetto reverse engineering, il procedimento attraverso cui è possibile leggere, capire ed utilizzare il codice di uno script.</p>
<p><strong>PRO:</strong> si raggiunge un ottimo livello di compressione, riducendo notevolmente la dimensione dello script.</p>
<p><strong>CONTRO:</strong> è un procedimento molto complesso attraverso cui si rischia di generare bug e malfunzionamenti; pertanto si consiglia di limitarsi esclusivamente a comprimere il codice anziché offuscarlo.</p>
<h2>Servizi web, librerie, software</h2>
<p>Ecco un po&#8217; di strumenti e servizi web per la compressione e l&#8217;offuscamento di file Javascript e CSS. Inizialmente trovi quelli riguardanti Javascript; in basso potrai vedere tutti quelli per la compressione di CSS.</p>
<h4><a href="http://yuilibrary.com/projects/yuicompressor/wiki" target="_blank">YUI Compressor</a></h4>
<p><img class="alignright size-full wp-image-652" title="YUI Library - Compressor" src="http://jblog.it/wp-content/uploads/2009/06/yuilibrary-masthead.png" alt="YUI Library - Compressor" width="180" height="46" />YUI Compressor è la più famosa libreria (open source) per la <strong>compressione di file CSS e Javascript</strong>. La compressione Javascript elimina commenti, caratteri di spaziatura e accorcia i nomi delle variabili. La compressione CSS utilizza un compressore basato su espressioni regolari.</p>
<h4><a href="http://www.crockford.com/javascript/jsmin.html" target="_blank">JSMin</a></h4>
<p>JSMin è un filtro che rimuove commenti e caratteri di spaziatura dai file <strong>Javascript</strong>. Generalmente la dimensione del file viene dimezzata. Questa libreria incoraggia i programmatori a esprimersi liberamente evitando che si preoccupino di risparmiare spazio. In fondo alla pagina puoi trovare i link per scaricare l&#8217;<strong>eseguibile MS-DOS.exe</strong> oppure i codici sorgenti in <strong>C, C#, Java, JavaScript, Perl, PHP, Python, OCAML, Ruby</strong>.</p>
<h4><a href="http://dojotoolkit.org/docs/shrinksafe" target="_blank">DojoToolkit ShrinkSafe</a></h4>
<p><img class="alignright size-full wp-image-653" title="Dojo Toolkit" src="http://jblog.it/wp-content/uploads/2009/06/images.jpg" alt="Dojo Toolkit" width="122" height="80" />Dojo, il famoso <strong>toolkit javascript</strong>, utilizza uno strumento per ridurre la dimensione, e quindi il tempo di caricamento, dei file <strong>Javascript</strong>. La particolarità sta nel fatto che invece di ricorrere alle solite espressioni regolari, Dojo Compressor è basato su <strong>Rhino</strong>, un javascript engine del progetto Mozilla. Quindi, poiché legge il flusso effettivo del codice javascript, può avere una visione migliore del contesto in cui una variabile viene letta e/o scritta, rispetto alle espressioni regolari.</p>
<h4><a href="http://dean.edwards.name/packer/" target="_blank">Packer</a></h4>
<p>Semplice servizio web per la <strong>compressione e l&#8217;offuscamento di codice Javascript</strong>. La libreria è disponibile anche per PHP e .NET. <strong>Download:</strong> <a href="http://dean.edwards.name/download/#packer" target="_blank">http://dean.edwards.name/download/#packer</a>.</p>
<h4><a href="http://web.2point1.com/2008/06/14/javascript-obfuscator-and-minifier/" target="_blank">JavaScript Obfuscator and Minifier</a></h4>
<p><strong>Librerie PHP</strong> per l&#8217;esecuzione da riga di comando. Richiedono la versione 5.2 (o superiore) di PHP CLI binary. Windows non è supportato e, a detta dello sviluppatore, non lo sarà mai.</p>
<p><strong>jsobf</strong>: compressa e offusca codice <strong>Javascript</strong>.</p>
<p><strong>jsfmt</strong>: effettua il <strong>processo inverso</strong> su un codice che ha subito compressione e offuscamento.</p>
<p><strong>Download</strong>: <a href="http://web.2point1.com/2008/09/07/jsfmt-and-jsobf-available-for-download/" target="_blank">http://web.2point1.com/2008/09/07/jsfmt-and-jsobf-available-for-download/</a>.</p>
<p><strong>Demo</strong>: <a href="http://timwhitlock.info/plug/examples/JavaScript/j_obfuscate.php" target="_blank">http://timwhitlock.info/plug/examples/JavaScript/j_obfuscate.php</a>.</p>
<h4><a href="http://farhadi.ir/works/smartoptimizer" target="_blank">SmartOptimizer</a></h4>
<p>SmartOptimizer (precedentemente chiamata JSmart) è una <strong>libreria PHP</strong> che si occupa di comprimere, offuscare, memorizzare in cache, fondere più file o stampare gli script direttamente nella pagina.</p>
<h4><a href="http://sourceforge.net/projects/packtag" target="_blank">pack:tag</a></h4>
<p><strong>Libreria JSP</strong> che compressa e combina risorse (come <strong>Javascript e CSS</strong>) e li memorizza nella cache del browser o in un file generato dinamicamente. Questo script si può inserire facilmente all&#8217;interno delle pagine e lavora in maniera trasparente sia all&#8217;utente sia allo sviluppatore.</p>
<h4><a href="http://tools.2vi.nl/" target="_blank">ObfuscateJS</a></h4>
<p><strong>Progetto Java</strong><strong> </strong>per la compressione e l&#8217;offuscamento di codice javascript. Si occupa di rimuovere caratteri di spaziatura e commenti, e di accorciare i nomi delle variabili locali.</p>
<h4><a href="http://jscompress.com/" target="_blank">JsCompress</a></h4>
<p>Servizio web per la compressione di <strong>codice javascript</strong>. Si può scegliere di eseguire la compressione con JsMin o con Packer. Molto interessante.</p>
<h4><a href="http://www.digitaloverload.co.uk/jsmin/" target="_blank">Javascript Minifier</a></h4>
<p>Servizio web (basato su JsMin) per la <strong>compressione di codice javascript</strong>. Puoi decidere se effettuare direttamente il download oppure visualizzare il risultato in una textarea.</p>
<h4><a href="http://www.javascriptobfuscator.com/" target="_blank">Free Javascript Obfuscator</a></h4>
<p>Servizio web che si occupa di <strong>comprimere e offuscare codice javascript</strong>. Offrendo diverse opzioni ti lascia libero di decidere completamente l&#8217;aspetto finale del codice.</p>
<h4><a href="http://www.daftlogic.com/projects-online-javascript-obfuscator.htm" target="_blank">Online Javascript Obfuscator</a></h4>
<p>Servizio web per la compressione e l&#8217;offuscamento di codice javascript.</p>
<h4><img class="alignright size-full wp-image-656" title="File CSS" src="http://jblog.it/wp-content/uploads/2009/06/page.png" alt="File CSS" width="128" height="128" /> <a href="http://www.ibloomstudios.com/articles/php_css_compressor" target="_blank">PHP CSS Compressor</a></h4>
<p>In questo articolo vengono fornite alcune <strong>righe di codice PHP</strong> da inserire direttamente nei <strong>file CSS</strong>. Questo codice provvede automaticamente alla compressione del contenuto del file CSS. In fondo all&#8217;articolo vengono descritte le modifiche da apportare al file .htaccess in modo che il file .css venga elaborato come file .php.</p>
<h4><a href="http://shygypsy.com/cssCompress/" target="_blank">CSS Compressor</a></h4>
<p>Servizio web per la <strong>compressione di codice CSS</strong>. L&#8217;applicazione è un&#8217;applet Java.</p>
<h4><a href="http://dotnetperls.com/Content/Minify-CSS.aspx" target="_blank">CSS Tidy</a></h4>
<p>Software, eseguibile da riga di comando, per la <strong>compressione di file CSS</strong>. La pagina del progetto è completa di tutta la documentazione necessaria per iniziare a utilizzarlo.</p>
<h2>Conclusione</h2>
<p><img class="alignright size-full wp-image-658" title="Analizza il tuo sito web" src="http://jblog.it/wp-content/uploads/2009/06/2349098787_2cd660c18c.jpg" alt="Analizza il tuo sito web" width="250" height="188" /><span class="highlight_green">Imparare a utilizzarli tutti è impossibile. Quindi, prima perder tempo tra download e righe di codice ti consiglio di <strong>analizzare il tuo sito</strong> per individuare i componenti che ne influenzano maggiormente le prestazioni.</span></p>
<p>Ad esempio, se il tuo sito è una <strong>galleria di immagini</strong> gestita con un paio di file javascript la cosa migliore da fare è scegliere il miglior tool per ottimizzare le foto, considerando anche il loro formato. Se, invece, hai un <strong>sito dinamico</strong> che fa un largo uso di javascript e tecniche Ajax, comprimere (e offuscare) il codice dei tuoi file javascript sarà fondamentale per migliorare il caricamento e la reattività del tuo sito web.</p>
<h4>Crediti</h4>
<ul>
<li><a title="Yahoo! Developer Network" href="http://developer.yahoo.com/" target="_blank">Yahoo! Developer Network</a> &#8211; <a title="Best Practices for Speeding Up Your Web Site" href="http://developer.yahoo.com/performance/rules.html" target="_blank">Best Practices for Speeding Up Your Web Site</a></li>
<li><strong>Foto1</strong>: forty-nine: <a title="forty-nine: compressed work week" href="http://www.flickr.com/photos/deadsquid/2614952166/" target="_blank">compressed work week</a> di <a href="http://www.flickr.com/photos/deadsquid/" target="_blank">dead_squid</a></li>
<li><strong>Foto2</strong>: <a title="fog over Istanbul skyscrapers" href="http://www.flickr.com/photos/whatcouldgowrong/2245309248/" target="_blank">fog over Istanbul skyscrapers</a> di <a href="http://www.flickr.com/photos/whatcouldgowrong/" target="_blank">WhatCouldPossiblyGoWrong?</a></li>
<li><strong>Foto3</strong>: <a title="MAGNIFYING GLASS" href="http://www.flickr.com/photos/andercismo/2349098787/" target="_blank">MAGNIFYING GLASS</a> di <a rel="dc:creator cc:attributionURL" href="http://www.flickr.com/photos/andercismo/" target="_blank">andercismo</a></li>
</ul>
<img src="http://jblog.it/?ak_action=api_record_view&id=640&type=feed" alt=" 20 servizi web e librerie per ottimizzare i componenti della pagina: immagini, javascript, css"  title="20 servizi web e librerie per ottimizzare i componenti della pagina: immagini, javascript, css" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/06/10/ottimizzare-componenti-pagina-velocizzare-caricamento-immagini-css-script_640.html/feed</wfw:commentRss>
		<slash:comments>0</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>Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript</title>
		<link>http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html</link>
		<comments>http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html#comments</comments>
		<pubDate>Wed, 20 May 2009 17:56:16 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Php e MySql]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[espressioni regolari]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=468</guid>
		<description><![CDATA[Ogni programmatore web prima o poi si scontra con la necessità di controllare se il formato dell&#8217;indirizzo email inserito dall&#8217;utente è valido.
Senza dubbio, il modo migliore per farlo consiste nell&#8217;utilizzo delle espressioni regolari, chiamate anche RegEx (da &#8220;regular expressions&#8221;).
Perché è il modo migliore? Anziché scrivere un&#8217;intera funzione composta da decine e decine di righe di [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript" href="http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html"><img class="alignright size-full wp-image-483" title="Logo Regex simile a FedEx" src="http://jblog.it/wp-content/uploads/2009/05/fts-regex-front.jpg" alt="Logo Regex simile a FedEx" width="252" height="144" /></a>Ogni programmatore web prima o poi si scontra con la necessità di controllare se il formato dell&#8217;indirizzo email inserito dall&#8217;utente è valido.</p>
<p>Senza dubbio, il <strong>modo migliore</strong> per farlo consiste nell&#8217;utilizzo delle espressioni regolari, chiamate anche RegEx (da &#8220;regular expressions&#8221;).</p>
<p><strong>Perché è il modo migliore? </strong>Anziché scrivere un&#8217;intera funzione composta da decine e decine di righe di codice, grazie alle RegEx basta defire il modello (o <strong>pattern</strong>) della stringa email e far eseguire il confronto da un&#8217;apposita funzione.<br />
<span id="more-468"></span></p>
<h2>Caratteristiche di un indirizzo email</h2>
<p>Il primo passo consiste nell&#8217;individuare le caratteristiche di un indirizzo email in modo da definirle successivamente in un modello (pattern).</p>
<p><img class="aligncenter size-full wp-image-472" title="Struttura di un indirizzo email" src="http://jblog.it/wp-content/uploads/2009/05/email_address.png" alt="Struttura di un indirizzo email" width="511" height="147" /></p>
<h3>Local part</h3>
<p>Questa parte, che indica spesso l&#8217;username, può essere costituita da:</p>
<ul>
<li>un massimo di 64 caratteri</li>
<li>lettere minuscole e maiuscole dell&#8217;alfabeto inglese, cioè a-z e A-Z</li>
<li>numeri, da 0 a 9</li>
<li>caratteri speciali <code>. ! # $ % &amp; ' * + - / = ? ^ _ ` { | } ~</code>. Alcuni servizi email non permettono di creare indirizzi solo con i caratteri speciali più comuni come &#8220;.&#8221; , &#8220;-&#8221;, e &#8220;_&#8221;</li>
</ul>
<p><strong>N.B.</strong> il carattere &#8220;.&#8221; non può trovarsi né all&#8217;inizio né alla fine.</p>
<h3>Domain name</h3>
<p>La parte successiva alla &#8220;@&#8221; è il nome del dominio (es. example.com) che può essere costituito da:</p>
<ul>
<li>un massimo di 255 caratteri</li>
<li>lettere minuscole dell&#8217;alfabeto inglese, cioè a-z</li>
<li>numeri, da 0 a 9</li>
<li>caratteri speciali &#8220;.&#8221; e &#8220;-&#8221;</li>
</ul>
<p><strong>N.B.</strong> il carattere &#8220;.&#8221; non può trovarsi né all&#8217;inizio né alla fine. Inoltre deve essere presente almeno un punto.</p>
<h2>Il pattern per un indirizzo email</h2>
<p><!--adv300--></p>
<p>Ora che sappiamo la struttura di un indirizzo email possiamo definire precisamente il pattern che verrà confrontato all&#8217;indirizzo email da controllare.</p>
<p>Definiamo un pattern per indirizzi email semplici che contengano sono lettere, numeri, punti &#8220;.&#8221;, underscore &#8220;_&#8221; e trattini &#8220;-&#8221;. In seguito vedremo come modificare i pattern in modo da accettare anche i caratteri speciali.</p>
<h3>Pattern per la &#8220;local part&#8221;</h3>
<p><img class="aligncenter size-full wp-image-477" title="Pattern per la local part" src="http://jblog.it/wp-content/uploads/2009/05/localpart_pattern2.png" alt="Pattern per la local part" width="487" height="128" />La <strong>prima parte</strong> impone che l&#8217;indirizzo <strong>inizi </strong>almeno con una lettera (maiuscola o minuscola) o con un numero. Vengono <strong>esclusi </strong>i caratteri con cui non può iniziare l&#8217;email.</p>
<p>La <strong>seconda parte</strong> è un po&#8217; più complicata:</p>
<ul>
<li>vengono definiti tutti i <strong>caratteri accettati</strong> dall&#8217;email</li>
<li>corrisponde a un punto seguito da a-z, A-Z, 0-9, &#8211; o 0</li>
<li>il codice &#8220;\.?&#8221; indica che i successivi caratteri possono (opzionalmente) essere preceduti da <strong>un solo punto</strong></li>
<li>la parte <code>[a-zA-Z0-9\-\_]</code> è seguita dal <strong>carattere +</strong> perché deve essere trovato un carattere del tipo a-z, A-Z, 0-9, &#8211; o 0 almeno una volta</li>
<li>viene racchiusa nelle <strong>parentesi tonde</strong> e seguita dal <strong>carattere *</strong> per impostare la condizione in base alla quale la seconda parte può essere presente facoltativamente</li>
</ul>
<h3>Pattern per il &#8220;domain name&#8221;</h3>
<p><img class="aligncenter size-full wp-image-479" title="Pattern per il domain name" src="http://jblog.it/wp-content/uploads/2009/05/domain_pattern1.png" alt="Pattern per il domain name" width="563" height="212" /></p>
<p>La <strong>prima parte</strong> impone che l&#8217;indirizzo <strong>inizi </strong>almeno con una lettera (maiuscola o minuscola) dell&#8217;alfabeto inglese. Vengono <strong>esclusi </strong>i caratteri con cui non può iniziare un nome di dominio.</p>
<p>Nella <strong>seconda parte</strong>, come per la &#8220;local part&#8221;:</p>
<ul>
<li>vengono definiti tutti i <strong>caratteri accettati</strong> dall&#8217;email</li>
<li>corrisponde a un punto seguito da a-z, A-Z, 0-9, &#8211; o 0</li>
<li>il codice &#8220;\.?&#8221; indica che i successivi caratteri possono (opzionalmente) essere preceduti da <strong>un solo punto</strong></li>
<li>la parte <code>[a-zA-Z0-9\-\_]</code> è seguita dal <strong>carattere +</strong> perché deve essere trovato un carattere del tipo a-z, A-Z, 0-9, &#8211; o 0 almeno una volta</li>
<li>viene racchiusa nelle <strong>parentesi tonde</strong> e seguita dal <strong>carattere *</strong> per impostare la condizione in base alla quale la seconda parte può essere presente facoltativamente</li>
</ul>
<p>La <strong>terza parte</strong> impone la presenza di un punto fra il nome del dominio e il codice del dominio di primo livello. In pratica, se il dominio è example.com, il punto di cui si impone la presenza è quello che si trova fra example e com.</p>
<p>L&#8217;<strong>ultima parte</strong> stabilisce il formato del codice del dominio di primo livello. Questo deve essere composto da <strong>almeno due caratteri</strong> e da sole lettere (del tipo a-z e A-Z) dell&#8217;alfabeto inglese.</p>
<h3>Lunghezza della &#8220;local part&#8221; e del &#8220;domain name&#8221;</h3>
<p>Purtroppo non è possibile imporre la lunghezza totale dei due segmenti (o almeno io non ci sono riuscito).</p>
<p>Scrivendo <code>(\.?[a-zA-Z0-9\-\_]){0,63}</code> la condizione <code>{0,63}</code> viene attribuita sia <code>\.</code> sia a <code>[a-zA-Z0-9\-\_]</code>. Quindi, l&#8217;indirizzo email risulterà troppo lungo se sia i punti sia i restanti caratteri corrispondenti a <code>[a-zA-Z0-9\-\_]</code> saranno più di 63. Ecco cosa succederebbe:</p>
<ul>
<li><code>punti&lt;=63, caratteri&lt;=63</code>: indirizzo ok</li>
<li><code>punti&gt;=63, caratteri&lt;=63</code>: indirizzo errato</li>
<li><span class="highlight_red"><code>punti&lt;=63, caratteri&gt;=63</code>: indirizzo ok<em> (non è ciò che vogliamo)</em></span></li>
<li><code>punti&gt;=63, caratteri&gt;=63</code>: indirizzo errato</li>
</ul>
<p>Il <strong>terzo caso</strong> non va bene a causa dei controlli sul numero dei caratteri. Infatti, se i caratteri sono più di 63 l&#8217;indirizzo email viene considerato corretto.</p>
<p>Ho fatto diverse prove ma ho sempre avuto esiti negativi. Come ho detto prima, probabilmente non ci sono riuscito io.</p>
<p><span class="highlight_green">Sono ben accetti suggerimenti e soluzioni alternative.</span></p>
<h4>La mia soluzione</h4>
<p>In seguito vedremo che per controllare se i due segmenti rispettano le dimensioni massime, rispettivamente 64 e 255, si possono scrivere un paio di righe di codice per:</p>
<ul>
<li>dividere l&#8217;indirizzo email in due in corrispondenza della @</li>
<li>controllare la lunghezza di ciascuna stringa</li>
</ul>
<h3>Accettare i caratteri speciali</h3>
<p>Per fare in modo che la tua funzioni accetti alcuni o tutti i caratteri speciali basterà sostituire la stringa <code>[a-zA-Z0-9\-\_]</code> (presente nella &#8220;local part&#8221;) con la stringa <code>[a-zA-Z0-9\-\_</code><code>\!\#\$\%\&amp;\'\*\+\/\=\?\^\`\{\|\}\~</code><code>]</code>.</p>
<p>Se non vuoi accettare alcuni caratteri bisogna eliminare il carattere speciale e il &#8220;\&#8221; che lo precede.</p>
<h2>Codice Javascript</h2>
<pre lang="js">function isEmail(string)
{
	/* Confronta la stringa con il pattern RegEx */
	if(string.search(/^[a-zA-Z0-9]+(\.?[a-zA-Z0-9\-\_]+)*\@[a-zA-Z]+(\.?[a-zA-Z0-9\-\_]+)*\.[a-zA-Z]{2,}$/)==-1)
	return false;

	/* Divide l'indirizzo in due parti: "local part" e "domain name" */
	var parts = string.split("@");

	/* Controlla se "local part" supera i 64 caratteri */
	if(parts[0].length&gt;64) return false;

	/* Controlla se "local part" supera i 255 caratteri */
	if(parts[1].length&gt;255) return false;

	return true;
}</pre>
<h2>Codice PHP</h2>
<pre lang="php">function isEmail($string)
{
	/* Confronta la stringa con il pattern RegEx */
	if(!eregi("[a-zA-Z0-9]+(\.?[a-zA-Z0-9\-\_]+)*\@[a-zA-Z]+(\.?[a-zA-Z0-9\-\_]+)*\.[a-zA-Z]{2,}$",$string))
	return false;

	/* Divide l'indirizzo in due parti: "local part" e "domain name" */
	$parts = explode("@",$string);

	/* Controlla se "local part" supera i 64 caratteri */
	if(strlen($parts[0])&gt;64) return false;

	/* Controlla se "local part" supera i 255 caratteri */
	if(strlen($parts[1])&gt;255) return false;

	return true;
}</pre>
<h2>Demo e download</h2>
<p>Per vedere lo script vai su <a href="http://test.jblog.it/email_checker/email_checker.txt" target="_blank">http://test.jblog.it/email_checker/email_checker.txt</a></p>
<p>Per vedere una demo vai su <a href="http://test.jblog.it/email_checker/" target="_blank">http://test.jblog.it/email_checker/</a></p>
<p>Per scaricare l’esempio vai su <a href="http://download.jblog.it/email_checker.zip" target="_blank">http://download.jblog.it/email_checker.zip</a></p>
<h2>Conclusione</h2>
<p>Le espressioni regolari sono un potente strumento, ma <strong>fanno lavorare la cpu</strong>.</p>
<p>Quindi, ti consiglio di utilizzare le espressioni regolari solo quando la stringa da controllare ha un <strong>formato complesso</strong> come, appunto, un indirizzo email o un numero di telefono. Se invece devi verificare che contenga solo caratteri numerici è meglio ricorrere a funzioni che controllano carattere per carattere.</p>
<p>Per quanto riguarda le funzioni email, personalmente le ritengo buone ma non le migliori. Le ho provate e sembrano funzionare adeguatamente. Per qualsiasi errore o malfunzionamento io sono qui&#8230; <span class="highlight_green">Sono graditi consigli, critiche e opinioni in genere.</span></p>
<h2>Crediti</h2>
<p><a title="Wikipedia" href="http://en.wikipedia.org/" target="_blank">Wikipedia (english)</a> &#8211; <a title="E-mail address" href="http://en.wikipedia.org/wiki/E-mail_address" target="_blank">E-mail address</a></p>
<p>Foto1 &#8211; <a href="#"><span style="text-decoration: line-through;">Formatear cadenas de Texto/String como númericas con o sin decimales – Regex – Expresiones Regulares</span></a></p>
<img src="http://jblog.it/?ak_action=api_record_view&id=468&type=feed" alt=" Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript"  title="Controllare il formato di un indirizzo email con le espressioni regolari (RegEx) in PHP e Javascript" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/05/20/controllare-formato-indirizzo-email-espressioni-regolari-regex-php-javascript_468.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css</title>
		<link>http://jblog.it/2009/05/15/ridurre-richieste-http-parte-2-come-combinare-immagini-script-css-sprite-image-maps_405.html</link>
		<comments>http://jblog.it/2009/05/15/ridurre-richieste-http-parte-2-come-combinare-immagini-script-css-sprite-image-maps_405.html#comments</comments>
		<pubDate>Fri, 15 May 2009 15:04:06 +0000</pubDate>
		<dc:creator>Giacomo</dc:creator>
				<category><![CDATA[Css]]></category>
		<category><![CDATA[Grafica]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ottimizzazione]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[base64]]></category>
		<category><![CDATA[classe php]]></category>
		<category><![CDATA[data:URL]]></category>
		<category><![CDATA[ottimizzare]]></category>
		<category><![CDATA[richieste http]]></category>
		<category><![CDATA[sprite css]]></category>

		<guid isPermaLink="false">http://jblog.it/?p=405</guid>
		<description><![CDATA[Dopo il precedente articolo su come utilizzare la cache del browser passiamo ad azioni più concrete per ridurre le richieste http: minimizzare il numero di componenti di una pagina. Dico &#8220;concrete&#8221; perché, mentre i comportamenti e le tecniche relative alla cache possono avere effetti diversi a seconda del browser e delle sue impostazioni, diminuire i [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css" href="http://jblog.it/2009/05/15/ridurre-richieste-http-parte-2-come-combinare-immagini-script-css-sprite-image-maps_405.html" target="_blank"><img class="alignright size-full wp-image-438" title="Ghepardo in corsa" src="http://jblog.it/wp-content/uploads/2009/05/2913134974_6d1839b33b.jpg" alt="2913134974 6d1839b33b Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css" width="300" height="154" /></a>Dopo il precedente articolo su <a title="Ridurre le richieste HTTP (parte 1): come utilizzare la cache del browser" rel="bookmark" href="http://jblog.it/2009/04/24/ridurre-richieste-http-come-utilizzare-cache-browser_124.html">come utilizzare la cache del browser</a> passiamo ad <strong>azioni più <em>concrete</em></strong><em> </em>per ridurre le richieste http: <strong>minimizzare il numero di componenti di una pagina</strong>. Dico &#8220;concrete&#8221; perché, mentre i comportamenti e le tecniche relative alla cache possono avere effetti diversi a seconda del browser e delle sue impostazioni, diminuire i componenti di una pagina è qualcosa che <strong>dipende esclusivamente dal webmaster</strong>, con risultati e prestazioni prevedibili.</p>
<h4>Gestire la cache è fatica sprecata?</h4>
<p><strong>Assolutamente no!</strong> Il fatto è che ogni utente che accede al sito la prima volta deve comunque attendere il caricamento completo della pagina e dei suoi componenti, che vengono subito memorizzati in cache. Il miglioramento di prestazioni si verifica a partire dalla seconda pagina che viene visitata in quanto i componenti vengono letti dalla cache, evitando di effettuare nuove (e inutili) richieste http.</p>
<h4>Vantaggi immediati</h4>
<p>Diminuire i componenti di una pagina consente di avere un notevole aumento delle prestazioni che <strong>migliora l&#8217;esperienza tutti gli utenti</strong>, vecchi e nuovi, dalla prima all&#8217;ultima pagina.</p>
<p><span class="highlight_yellow"><strong>In questo articolo</strong> vedremo alcune tecniche che <strong>riducono drasticamente</strong> il numero e il tempo di caricamento relativo a immagini, script e css. Queste tecniche non fanno altro che <strong>combinare questi componenti</strong> in modo da caricarne pochi ma più pesanti anziché molti ma leggeri. Parleremo di image maps, sprite css, dello schema data:URL, di generatori di sprite css, di come combinare automaticamente javascript e css, vedremo che a volte è meglio inserire il codice direttamente nella pagina html, e come è possibile evitare gli script duplicati.</span><span id="more-405"></span></p>
<h2>Pochi ma buoni</h2>
<p><!--adv300--></p>
<p><img class="alignright size-full wp-image-439" title="Olimpiadi Pechino - Ciclismo" src="http://jblog.it/wp-content/uploads/2009/05/cic02.jpg" alt="Olimpiadi Pechino - Ciclismo" width="270" height="180" />A primo impatto potrebbe sembrare un&#8217;assurdità affermare che &#8220;è meglio caricare un file da 300 kbyte anziché 10 file da 40kb&#8221;. Fortunatamente non lo è!</p>
<p>Infatti, se prendiamo 10 immagini e le copiamo all&#8217;interno di un solo file immagine, quest&#8217;ultimo file occuperà molto meno rispetto alla somma delle 10 immagini. <strong>Il motivo</strong> è che nei file vengono memorizzate tantissime informazioni oltre al contenuto che i software ci mostrano.</p>
<p><strong>Ad esempio</strong>, se apriamo una fotografia quello che vediamo è semplicemente un&#8217;immagine. Tuttavia, quel file contiene anche una serie di informazioni come: modello fotocamera, altezza, larghezza, risoluzione, ecc.</p>
<p>Caricare una sola immagine (ed un set di informazioni) è meglio che caricare dieci immagini (e dieci set di informazioni) perché:</p>
<ul>
<li>la dimensione del file più grosso è minore della somma di tanti file più piccoli</li>
<li>tante richieste http si riducono a una sola</li>
</ul>
<p>Mentre sulla riduzione delle richieste http possiamo essere d&#8217;accordo, credo che tu abbia qualche dubbio sul fatto che diminuisca la dimensione del file più grande. Bene, fai questo<strong> semplice esperimento</strong>:</p>
<ul>
<li>prendi un&#8217;immagine e fanne 10 copie</li>
<li>crea un&#8217;immagine grande abbastanza da contenere perfettamente 10 immagini uguali</li>
<li>confronta la dimensione dei 10 file immagine con quella del file immagine più grande</li>
</ul>
<h4>I componenti incriminati</h4>
<p>Generalmente si focalizza l&#8217;attenzione su immagini, javascript e css perché sono presenti in tutte le pagine e, se mal gestiti, non solo provocano un eccessivo numero di richieste http ma rallentano il normale caricamento delle pagine.</p>
<h2>Combinare le immagini: &#8220;image maps&#8221;</h2>
<p><img class="alignright size-full wp-image-440" title="Puzzle di gatti" src="http://jblog.it/wp-content/uploads/2009/05/312855876_abbdbcf21b.jpg" alt="Puzzle di gatti" width="270" height="162" />Se vogliamo inserire due immagini affiancate basta combinarle in un unico file immagine e inserire quest&#8217;ultimo all&#8217;interno della pagina.</p>
<p>I problemi nascono nel momento in cui, ad esempio, vogliamo applicare un diverso link a ciascuna immagine. Infatti, essendo un&#8217;unica immagine, non possiamo racchiuderla all&#8217;interno di un tag &lt;a&gt;, ma dobbiamo <strong>&#8220;mappare&#8221; le immagini</strong>.</p>
<p>Prima di illustrare i tre metodi è necessario descrivere gli <strong>strumenti a nostra disposizione</strong>.</p>
<h4>Il tag &lt;area&gt;</h4>
<p>Serve per creare le singole aree, cliccabili o meno, dell&#8217;immagine. Non richiede il tag di chiusura completo (&lt;/area&gt;).</p>
<p><strong>Formato</strong>. <code>&lt;area shape="..." coords="..." href="http://example.com/link1.html"&gt;</code></p>
<p><span class="highlight_green">Per creare<strong> documenti più accessibili</strong>, si può utilizzare il tag &lt;a&gt;&#8230;&lt;/a&gt; con gli stessi attributi di &lt;area&gt;. Infatti, grazie al tag &lt;a&gt; si può specificare un testo alternativo per l&#8217;area.</span></p>
<p><strong>Formato</strong>. <code>&lt;a </code><code>href="http://example.com/link1.html" </code><code>shape="..." coords="..." /&gt;Area1&lt;/a&gt;<br />
</code></p>
<p><strong>shape</strong>: (default, rect, circle, poly), cioè (default, rettangolo, cerchio, poligono). Specifica la forma di una regione.</p>
<p><strong>coords</strong>: coordinate. Specificano la posizione e la sagoma. Il numero e l&#8217;ordine dei valori dipendono dalla forma specificata da <em>shape</em>.</p>
<ul>
<li><em>rect</em>: left-x, top-y, right-x, bottom-y. I vertici opposti del rettangolo.</li>
<li><em>circle</em>: center-x, center-y, radius. Coordinate del centro e lunghezza del raggio.</li>
<li><em>poly</em>: x1, y1, x2, y2, &#8230;, xN, yN. Coordinate di tutti i vertici del poligono.</li>
</ul>
<p><strong>href</strong>: link associato alla regione.</p>
<p><strong>nohref</strong>: impostare con true per specificare che la regione non ha link associati, altrimenti non impostare.</p>
<h4>Il tag &lt;map&gt;</h4>
<p>Specifica una mappa da far richiamare da un oggetto. È richiesto il tag di chiusura &lt;/map&gt;.</p>
<p>All&#8217;interno dei tag &lt;map&gt;&#8230;&lt;/map&gt; si inseriscono tutte le aree relative alla mappa.</p>
<p><strong>name</strong>. Assegna un nome alla mappa.</p>
<h4>Associare una mappa a un elemento</h4>
<p>Utilizzare l&#8217;attributo <strong>usemap</strong> fra gli attributi dell&#8217;elemento, specificando un URI.</p>
<p>Ricorda che un URI può essere un indirizzo del tipo http://www.example&#8230; o un id del tipo #nome-mappa.</p>
<p><strong>Formato</strong>. <code>&lt;img src="foto.jpg" alt="La mia foto" usemap="mappafoto" /&gt;</code></p>
<h3>Image maps lato client</h3>
<p>La presenza di usemap <strong>implica che l&#8217;oggetto sia un immagine</strong>. Se non lo è, i browser potrebbero comunque implementare un&#8217;interazione con l&#8217;utente simile a quella per le immagini. Purtroppo <strong>non tutti i browser</strong> eseguono correttamente la mappatura di un immagine o di un oggetto.</p>
<p>Un blocco &lt;map&gt; può contenere sia elementi &lt;area&gt; sia elementi a livello di blocco come &lt;a&gt; per aumentare la compatibilità con i browser più datati.</p>
<h4>Alcune osservazioni</h4>
<ol>
<li>Se sono presenti contemporaneamente &lt;a&gt; ed &lt;area&gt;, i browser recenti ignorano il tag &lt;area&gt;</li>
<li>Se due o più regioni si sovrappongono, la prima regione avrà la precedenza sulle altre</li>
<li>L&#8217;elemento &lt;map&gt; non è compatibile con i browser HTML 2.0</li>
</ol>
<h4>Demo e download</h4>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/imagemap_cs/" target="_blank">http://test.jblog.it/imagemap_cs/</a></p>
<p>In quest&#8217;altro esempio le aree sono rettangolari, circolari e poligonali. <a href="http://test.jblog.it/imagemap_cs2/" target="_blank">http://test.jblog.it/imagemap_cs2/</a></p>
<p>Per scaricare entrambi gli esempi vai a <a href="http://download.jblog.it/imagemap_cs_cs2.zip" target="_blank">http://download.jblog.it/imagemap_cs_cs2.zip</a></p>
<h4>Esempio 1</h4>
<p>Classico esempio con &lt;map&gt; all&#8217;interno dell&#8217;oggetto, ed i tag &lt;a&gt; all&#8217;interno di &lt;map&gt;.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;P&gt;&lt;OBJECT data="navbar1.gif" type="image/gif" usemap="#map1"&gt;
		&lt;MAP name="map1"&gt;
			Navigate the site:
			&lt;A href="guide.html" shape="rect" coords="0,0,118,28"&gt;Access Guide&lt;/a&gt; |
			&lt;A href="shortcut.html" shape="rect" coords="118,0,184,28"&gt;Go&lt;/A&gt; |
			&lt;A href="search.html" shape="circle" coords="184,200,60"&gt;Search&lt;/A&gt; |
			&lt;A href="top10.html" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;Top Ten&lt;/A&gt;
		&lt;/MAP&gt;
	&lt;/OBJECT&gt;&lt;/P&gt;
	&lt;/BODY&gt;
&lt;/HTML&gt;</pre>
<h4>Esempio 2</h4>
<p>Come utilizzare la mappa richiamandola con usemap, senza inglobarla all&#8217;interno dei tag &lt;object&gt;.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;P&gt;&lt;OBJECT data="navbar1.gif" type="image/gif" usemap="#map1"&gt;&lt;/OBJECT&gt;&lt;/P&gt;
	&lt;MAP name="map1"&gt;
		Navigate the site:
		&lt;A href="guide.html" shape="rect" coords="0,0,118,28"&gt;Access Guide&lt;/a&gt; |
		&lt;A href="shortcut.html" shape="rect" coords="118,0,184,28"&gt;Go&lt;/A&gt; |
		&lt;A href="search.html" shape="circle" coords="184,200,60"&gt;Search&lt;/A&gt; |
		&lt;A href="top10.html" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;Top Ten&lt;/A&gt;
	&lt;/MAP&gt;
&lt;/HTML&gt;</pre>
<h4>Esempio 3</h4>
<p>Utilizzo degli elementi &lt;area&gt;.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;P&gt;&lt;OBJECT data="navbar1.gif" type="image/gif" usemap="#map1"&gt;&lt;/OBJECT&gt;&lt;/P&gt;
	&lt;MAP name="map1"&gt;
		Navigate the site:
		&lt;AREA href="guide.html" alt="Access Guide" shape="rect" coords="0,0,118,28"&gt;
		&lt;AREA href="search.html" alt="Search" shape="rect" coords="184,0,276,28"&gt;
		&lt;AREA href="shortcut.html" alt="Go" shape="circle" coords="184,200,60"&gt;
		&lt;AREA href="top10.html" alt="Top Ten" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;
	&lt;/MAP&gt;
&lt;/HTML&gt;</pre>
<h4>Esempio 4</h4>
<p>Questo è un utilizzo concreto della condivisione di una mappa fra più immagini. Questo codice carica l&#8217;immagine più interna (navbar1.gif) se l&#8217;immagine esterna (navbar1.png) non viene processata correttamente dal browser. Ad entrambe le immagini viene associata la stessa mappa.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;P&gt;&lt;OBJECT data="navbar1.png" type="image/png" usemap="#map1"&gt;
		&lt;OBJECT data="navbar1.gif" type="image/gif" usemap="#map1"&gt;&lt;/OBJECT&gt;
	&lt;/OBJECT&gt;&lt;/P&gt;
	&lt;MAP name="map1"&gt;
		Navigate the site:
		&lt;A href="guide.html" shape="rect" coords="0,0,118,28"&gt;Access Guide&lt;/a&gt; |
		&lt;A href="shortcut.html" shape="rect" coords="118,0,184,28"&gt;Go&lt;/A&gt; |
		&lt;A href="search.html" shape="circle" coords="184,200,60"&gt;Search&lt;/A&gt; |
		&lt;A href="top10.html" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;Top Ten&lt;/A&gt;
	&lt;/MAP&gt;
&lt;/HTML&gt;</pre>
<h4>Esempio 5</h4>
<p>Utilizzo combinato di &lt;area&gt; e &lt;a&gt; per avere una maggiore compatibilità. I browser più recenti non considerano gli elementi &lt;area&gt;.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;P&gt;&lt;OBJECT data="navbar1.gif" type="image/gif" usemap="#map1"&gt;&lt;/OBJECT&gt;&lt;/P&gt;
	&lt;MAP name="map1"&gt;
		Navigate the site:
		&lt;AREA href="guide.html" alt="Access Guide" shape="rect" coords="0,0,118,28"&gt;
		&lt;AREA href="search.html" alt="Search" shape="rect" coords="184,0,276,28"&gt;
		&lt;AREA href="shortcut.html" alt="Go" shape="circle" coords="184,200,60"&gt;
		&lt;AREA href="top10.html" alt="Top Ten" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;
		&lt;A href="guide.html" shape="rect" coords="0,0,118,28"&gt;Access Guide&lt;/a&gt; |
		&lt;A href="shortcut.html" shape="rect" coords="118,0,184,28"&gt;Go&lt;/A&gt; |
		&lt;A href="search.html" shape="circle" coords="184,200,60"&gt;Search&lt;/A&gt; |
		&lt;A href="top10.html" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;Top Ten&lt;/A&gt;
	&lt;/MAP&gt;
&lt;/HTML&gt;</pre>
<h4>Esempio 6</h4>
<p>Come sovrapporre due aree. Da notare l&#8217;ultima coordinata specificata, il raggio). I due cerchi hanno lo stesso centro, ma il primo ha un raggio minore del secondo.</p>
<p>Il risultato è che posizionandosi sul primo (che non ha link) non appare la &#8220;manina&#8221;. Spostandosi leggermente fuori dal primo ci si posiziona sul secondo (che ha un link) ed appare la &#8220;manina&#8221;. In pratica, l&#8217;area specificata prima ha la <strong>precedenza</strong> sulle altre che sovrascrive.</p>
<pre lang="html">&lt;MAP name="map1"&gt;
	&lt;A shape="circle" coords="100,200,50"&gt;Non ho link&lt;/A&gt;
	&lt;A href="outer-ring-link.html" shape="circle" coords="100,200,250"&gt;Ho un link&lt;/A&gt;
&lt;/MAP&gt;</pre>
<h3>Image maps lato server</h3>
<p>A volte la mappatura delle immagini può essere <strong>troppo complicata</strong> da scrivere come html.</p>
<p>In questi casi è meglio ricorrere a tecniche lato server.</p>
<p>Partiamo dal <strong>codice html</strong>. Da notare l&#8217;attributo <strong>ismap</strong>.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;A href="map_script.php"&gt;
		&lt;IMG src="navbar1.png" alt="Navigazione" ismap /&gt;
	&lt;/A&gt;
&lt;/HTML&gt;</pre>
<p><strong>Come funziona?</strong> Quando ci si posiziona sull&#8217;immagine, il browser aggiunge all&#8217;url di &lt;a&gt;, quindi a map_script.php, le due coordinate. Ad esempio, se ci posizioniamo sul pixel di coordinate (18,46), il link del tag &lt;a&gt; verrà<strong> trasformato automaticamente</strong> da map_script.php a map_script.php?18,46.</p>
<p>Lo <strong>script lato server</strong> ha il compito di leggere i <strong>due parametri $_GET</strong> relativi alle coordinate e comportarsi a seconda dei valori letti.</p>
<pre lang="php">&lt;?php
/* $_GET array associativo. Ottiene le chiavi dell'array. */
$keys = array_keys($_GET);

/* Prende la prima chiave, la divide e inserisce i due valori in $x e $y */
list($x,$y) = explode(",",$keys[0]);

/* Comportamenti */
if(($x&gt;=0 &amp;&amp; $x&lt;=118) &amp;&amp; ($y&gt;=0 &amp;&amp; $y&lt;=28))	 include("guide.html");
elseif(($x&gt;118 &amp;&amp; $x&lt;=184) &amp;&amp; ($y&gt;=0 &amp;&amp; $y&lt;=28)) include("shortcut.html");
elseif( ($x&gt;=(184-30) &amp;&amp; $x&lt;=(184+30)) &amp;&amp; ($y&gt;=(200-30) &amp;&amp; $y&lt;=(200+30)) ) include("search.html");
elseif(($x&gt;220 &amp;&amp; $x&lt;=280) &amp;&amp; ($y&gt;=30 &amp;&amp; $y&lt;=54)) include("top10.html");
?&gt;</pre>
<p>Nel codice dell&#8217;esempio 1, l&#8217;area relatva a <strong>top10.html</strong> è un poligono. Non è semplice controllare se un punto è presente in un poligono. Bisogna trovare e utilizzare appositi algoritmi e funzioni. Potresti trovarli su <a title="Geometry Algorithms" href="http://www.geometryalgorithms.com/" target="_blank">geometryalgorithms.com</a> (che nel momento in cui scrivo è &#8220;temporaneamente sospeso&#8221;).</p>
<h4>Script, demo e download</h4>
<p>Per vedere e scaricare lo script vai a <a href="http://test.jblog.it/imagemap_ss/map_script.txt" target="_blank">http://test.jblog.it/imagemap_ss/map_script.txt</a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/imagemap_ss/" target="_blank">http://test.jblog.it/imagemap_ss/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/imagemap_ss.zip" target="_blank">http://download.jblog.it/imagemap_ss.zip</a></p>
<h3>Image maps lato client e lato server</h3>
<p>Per avere la compatibilità con i vecchi browser è bene combinare le due tecniche.</p>
<pre lang="html">&lt;HTML&gt;
	&lt;HEAD&gt;&lt;TITLE&gt;The cool site!&lt;/TITLE&gt;&lt;/HEAD&gt;
	&lt;BODY&gt;
	&lt;A href="map_script.php"&gt;
		&lt;IMG src="navbar1.gif" alt="Navigazione" usemap="#map1" ismap /&gt;
	&lt;/A&gt;
	&lt;MAP name="map1"&gt;
		Navigate the site:
		&lt;A href="guide.html" shape="rect" coords="0,0,118,28"&gt;Access Guide&lt;/a&gt; |
		&lt;A href="shortcut.html" shape="rect" coords="118,0,184,28"&gt;Go&lt;/A&gt; |
		&lt;A href="search.html" shape="circle" coords="184,200,60"&gt;Search&lt;/A&gt; |
		&lt;A href="top10.html" shape="poly" coords="276,0,276,28,100,200,50,50,276,0"&gt;Top Ten&lt;/A&gt;
	&lt;/MAP&gt;
	&lt;/BODY&gt;
&lt;/HTML&gt;</pre>
<h3>Il testo alternativo</h3>
<p>I tag &lt;a&gt; con il testo all&#8217;interno si utilizzano per avere un testo alternativo nel caso in cui l&#8217;immagine non venga caricata.</p>
<p>Naturalmente questo comportamento non è gestito dal browser, infatti il testo dei link appare sempre.</p>
<p><strong>Per nasconderlo</strong> è necessario operare con i css. Consiglio anche di guardare le tecniche di &#8220;image replacement&#8221;.</p>
<h4>Script, demo e download</h4>
<p>Per vedere lo script vai a <a href="http://test.jblog.it/imagemap_css/map_script.txt" target="_blank">http://test.jblog.it/imagemap_css/map_script.txt</a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/imagemap_css/" target="_blank">http://test.jblog.it/imagemap_css/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/imagemap_css.zip" target="_blank">http://download.jblog.it/imagemap_css.zip</a></p>
<h2>Lo schema data:URL</h2>
<p>Questa tecnica permette di <strong>inserire i dati direttamente nel codice html</strong>, risparmiando quindi la relativa richiesta http.</p>
<p>Scopriamo le carte e vediamo subito un <strong>esempio</strong>.</p>
<pre lang="html">&lt;IMG ALT="Foto" SRC="data:image/gif; base64,
	R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwhhx4dbgYKAAA7B72VFgl2Tf7452
	AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
	ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
	a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
	ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
	F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH" /&gt;</pre>
<p>Dopo la paura iniziale, in genere ci si domanda: <strong>cosa sono quei caratteri e come faccio a inserirli?</strong></p>
<p>Quell&#8217;ammasso di caratteri è la <strong>codifica in base64</strong> dell&#8217;immagine. In pratica, è il contenuto del file immagine codificato in base64.</p>
<p>Per<strong> codificare un&#8217;immagine in base64</strong> si utilizza una semplice <strong>funzione php</strong>: <em>base64_encode</em>.</p>
<p>L&#8217;ultima questione riguarda il tipo <strong>MIME</strong> che si può ottenere in due modi:</p>
<ul>
<li>utilizzando la funzione <strong>mime_content_type</strong>. Deve essere abilitata l&#8217;<strong>estensione php_mime_magic.dll</strong>.</li>
<li>leggendo le informazioni su un file grazie le funzioni <a title="File Information" href="http://it2.php.net/manual/en/book.fileinfo.php"><strong>File Information</strong></a> di php. Era un&#8217;estensione PECL, ma ora non lo è più. Bisogna utilizzare la <strong>libreria esterna magic_open</strong></li>
</ul>
<p>Nel caso non si possano utilizzare queste funzioni si dovrà <strong>scrivere manualmente</strong>.</p>
<h4>Come inserire un&#8217;immagine in base64 (senza funzioni per il tipo MIME)</h4>
<pre>&lt;img src="data:image/jpeg;base64,&lt;?
echo base64_encode(file_get_contents("img.jpg")); ?&gt;" alt="Immagine" /&gt;</pre>
<h4>Come inserire un&#8217;immagine in base64 (con funzioni per il tipo MIME)</h4>
<pre>&lt;? $mime = mime_content_type("img.jpg"); ?&gt;
&lt;img src="data:&lt;? echo $mime; ?&gt;;base64,&lt;?
echo base64_encode(file_get_contents("img.jpg")); ?&gt;" alt="Immagine" /&gt;</pre>
<h4>Script, demo e download</h4>
<p>Per vedere lo script vai a <a href="http://test.jblog.it/img_base64/index.txt" target="_blank">http://test.jblog.it/img_base64/index.txt</a><a href="http://test.jblog.it/imagemap_css/map_script.txt" target="_blank"></a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/img_base64/" target="_blank">http://test.jblog.it/img_base64/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/img_base64.zip" target="_blank">http://download.jblog.it/img_base64.zip</a></p>
<h2>Gli sprite CSS</h2>
<p><img class="alignright size-full wp-image-453" title="Icone per webdesigner" src="http://jblog.it/wp-content/uploads/2009/05/developpers_icons_preview2.jpg" alt="Icone per webdesigner" width="282" height="140" />Partiamo dalla situazione più comune. Supponiamo di voler realizzare un menù composto da 5 pulsanti grafici che cambino colore quando si passa sopra col mouse. La cosa più logica sarebbe quella di creare 10 immagini: 5 per il pulsante in modalita &#8220;normale&#8221;, 5 per il pulsante in modalità &#8220;mouse sopra&#8221;.</p>
<p>Poiché caricare 10 immagini significa effettuare <strong>10 richieste http</strong>, utilizziamo la tecnica degli sprite CSS.</p>
<p><strong>Questa tecnica</strong> consiste nel:</p>
<ul>
<li>creare un file immagine abbastanza grande da contenere tutte e 10 le immagini del menù (come ho detto all&#8217;inizio dell&#8217;articolo, è meglio un&#8217;immagine grande anziché tante piccole immagini)</li>
<li>impostare questa immagine come sfondo agli elementi del menù (cioè &lt;a&gt;, &lt;li&gt;, &lt;div&gt;, ecc.)</li>
<li>per ogni elemento impostare la proprietà <strong>background-position</strong> per spostare lo sfondo all&#8217;interno dell&#8217;elemento in modo da avere l&#8217;immagine desiderata</li>
</ul>
<p>Gli <strong>utilizzi </strong>di questa tecnica sono infiniti: dal menù al singolo rollover, dalla serie di immagini allineate al contenitore con gli angoli arrotondati.</p>
<p><strong>VANTAGGI</strong></p>
<ul>
<li>riduce notevolmente le <strong>richieste http</strong> e migliora il caricamento delle pagine</li>
<li>elimina del tutto i <strong>ritardi </strong>relativi ai rollover poiché non viene caricata una nuova immagine ma viene spostato lo sfondo</li>
</ul>
<p><strong>SVANTAGGI</strong></p>
<ul>
<li>richiede un po&#8217; più di <strong>lavoro </strong>nell&#8217;impostazione dei css e nella creazione delle immagini</li>
<li>non è sempre possibile combinare in una sola immagine tutte le immagini del sito, a causa delle difficoltà che si incontrano nel <strong>posizionamento dello sfondo</strong> con le regole dei css</li>
</ul>
<h4>Esempio 1</h4>
<p>Inserire le immagini con il <strong>tag &lt;img&gt;</strong>. Questo metodo è a dir poco geniale poiché permette di inserire le immagini come si è sempre fatto col vantaggio di ridurre le richieste http. In pratica viene impostato lo <strong>sfondo al tag &lt;img&gt;</strong>.</p>
<p>L&#8217;articolo completo è di <a title="CssGlobe" href="http://cssglobe.com/" target="_blank">CssGlobe</a>. Lo puoi trovare <a title="Creating easy and useful CSS Sprites" href="http://cssglobe.com/post/3028/creating-easy-and-useful-css-sprites" target="_blank">qui</a>.</p>
<p>Abbiamo bisogno di un&#8217;immagine gif trasparente 1px x 1px (spacer.gif), e l&#8217;immagine sprite (tuttelefoto.jpg).</p>
<p><img class="size-full wp-image-429 alignnone" title="tuttelefoto.jpg - Immagine utilizzata come sfondo degli elementi" src="http://jblog.it/wp-content/uploads/2009/05/tuttelefoto.jpg" alt="tuttelefoto Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css" width="210" height="140" /></p>
<p><em>tuttelefoto.jpg &#8211; L&#8217;immagine sprite che utilizzeremo</em></p>
<pre lang="html">&lt;html&gt;
&lt;head&gt;&lt;title&gt;Sprite CSS - Esempio 1&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
	&lt;img src="spacer.gif" id="foto1" alt="Foto1" /&gt;
	&lt;img src="spacer.gif" id="foto2" alt="Foto2" /&gt;
	&lt;img src="spacer.gif" id="foto3" alt="Foto3" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>L&#8217;immagine trasparente serve per far assumere al tag &lt;img&gt; il suo normale comportamento (ad es. in modo che quando selezioni l&#8217;immagine si colora l&#8217;area di &lt;img&gt;).</p>
<p><strong>Codice css</strong></p>
<pre lang="css">#foto1, #foto2, #foto3 { background:url(tuttelefoto.jpg) no-repeat; }
#foto1 { width:100px; height:50px; background-position:0px 0px; }
#foto2 { width:120px; height:90px; background-position:0px -50px; }
#foto3 { width:90px; height:130px; background-position:-120px 0px; }</pre>
<p><strong>Demo e download</strong></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/img_sprite1/" target="_blank">http://test.jblog.it/img_sprite1/</a><a href="http://test.jblog.it/img_base64/" target="_blank"></a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/img_sprite1.zip" target="_blank">http://download.jblog.it/img_sprite1.zip</a><a href="http://download.jblog.it/img_base64.zip" target="_blank"></a></p>
<h4>Esempio 2</h4>
<p>Un&#8217;altro modo per inserire delle immagini è impostarle come sfondo ad elementi flottanti.</p>
<p><img class="size-full wp-image-431 alignnone" title="spriteimg" src="http://jblog.it/wp-content/uploads/2009/05/spriteimg.png" alt="spriteimg Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css" width="150" height="80" /></p>
<p><em>spriteimg.png &#8211; L&#8217;immagine sprite che utilizzeremo</em></p>
<pre lang="html">&lt;html&gt;
&lt;head&gt;&lt;title&gt;Sprite CSS - Esempio 2&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
	&lt;a href="#" id="feedburner"&gt;&lt;/a&gt;
	&lt;a href="#" id="subscribe"&gt;&lt;/a&gt;
	&lt;a href="#" id="bookmarks"&gt;&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><strong>Demo e download</strong></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/img_sprite2/" target="_blank">http://test.jblog.it/img_sprite2/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/img_sprite2.zip" target="_blank">http://download.jblog.it/img_sprite2.zip</a></p>
<p><strong>Codice css</strong></p>
<pre lang="css">#feedburner { margin-right:20px; background:url(spriteimg.png) no-repeat -5px -5px; float:left; width:91px; height:29px; }
#subscribe { margin-right:20px; background:url(spriteimg.png) no-repeat -5px -35px; float:left; width:127px; height:18px; }
#bookmarks { background:url(spriteimg.png) no-repeat -5px -55px; float:left; width:127px; height:18px; }</pre>
<h4>Esempio 3</h4>
<p>Gli sprite css sono ideali per sviluppare menù di navigazione.</p>
<p><img class="size-full wp-image-432 alignnone" title="spriteimg1" src="http://jblog.it/wp-content/uploads/2009/05/spriteimg1.png" alt="spriteimg1 Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css" width="700" height="60" /></p>
<p><em>spritemenu.png &#8211; L&#8217;immagine sprite che utilizzeremo</em></p>
<pre lang="html">&lt;html&gt;
&lt;head&gt;&lt;title&gt;Sprite CSS - Esempio 3&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
	&lt;ul id="navmenu"&gt;
		&lt;li id="nav_homepage"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li id="nav_informazioni"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li id="nav_catalogo"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li id="nav_indirizzi"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li id="nav_contact"&gt;&lt;a href="#"&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><strong>Codice css</strong></p>
<pre lang="css">#navmenu ul { list-style:none; }
#navmenu li { float:left; list-style:none; }
#navmenu a { display:block; height:30px; width:135px; background:url(spritemenu.png) no-repeat;  }

#nav_homepage a:link, #nav_homepage a:visited { background-position:0px 0px; }
#nav_informazioni a:link, #nav_informazioni a:visited { background-position:-270px 0px; }
#nav_catalogo a:link, #nav_catalogo a:visited { background-position:-560px 0px; }
#nav_indirizzi a:link, #nav_indirizzi a:visited { background-position:-420px 0px; }
#nav_contact a:link, #nav_contact a:visited { background-position:-135px 0px; }

#nav_homepage a:hover, #nav_homepage a:focus, #nav_homepage a:active { background-position:0px -30px; }
#nav_informazioni a:hover, #nav_informazioni a:focus, #nav_informazioni a:active { background-position:-270px -30px; }
#nav_catalogo a:hover, #nav_catalogo a:focus, #nav_catalogo a:active { background-position:-560px -30px; }
#nav_indirizzi a:hover, #nav_indirizzi a:focus, #nav_indirizzi a:active { background-position:-420px -30px; }
#nav_contact a:hover, #nav_contact a:focus, #nav_contact a:active { background-position:-135px -30px; }</pre>
<p><strong>Demo e download</strong></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/img_sprite3/" target="_blank">http://test.jblog.it/img_sprite3/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/img_sprite3.zip" target="_blank">http://download.jblog.it/img_sprite3.zip</a></p>
<h2>Generatori di Sprite CSS</h2>
<p>I generatori di sprite css <strong>semplificano la creazione</strong> di un&#8217;immagine abbastanza grande da contenere tutte le immagini da utilizzare nel proprio sito. Questi, secondo me, sono i migliori.</p>
<p><strong>Generatore di Sprite CSS</strong><br />
<a href="http://spritegen.website-performance.org/" target="_blank">http://spritegen.website-performance.org/</a><br />
<a href="https://launchpad.net/css-sprite-generator" target="_blank">https://launchpad.net/css-sprite-generator</a> <em><strong>(codice sorgente)</strong></em></p>
<p><strong>CSS Sprites Generator</strong><br />
<a href="http://www.csssprites.com/" target="_blank">http://www.csssprites.com/</a></p>
<p><strong>CSS sprites for humanoid beings (and the like)</strong><br />
<a href="http://printf.ru/spritr/" target="_blank">http://printf.ru/spritr/</a></p>
<p><strong>SmartSprites (Alpha!)</strong><br />
<a href="http://smartsprites.osinski.name/" target="_blank">http://smartsprites.osinski.name/</a></p>
<h2>Combinare javascript e css</h2>
<p><img class="alignright size-full wp-image-445" title="Cubetti di legno" src="http://jblog.it/wp-content/uploads/2009/05/288478628_56ed41bc2c.jpg" alt="Cubetti di legno" width="270" height="405" />Spesso una pagina richiama <strong>più di uno script e più di un css</strong>. Per ridurre le richieste http relative ai css (o agli script) basta copiare il contenuto di tutti i file css (o script) in un unico file.</p>
<p>Il bello di questa tecnica è che, a differenza delle immagini, è quasi sempre possibile <strong>combinare tutti i file dello stesso tipo in un unico file</strong>. Il &#8220;quasi&#8221; è dovuto al fatto che alcuni script, se inseriti nello stesso file, potrebbero dare dei problemi. Quindi è sempre meglio testare il funzionamento dello script combinato. Se si verificano dei problemi, basta <strong>escludere dalla fusione</strong> i file &#8220;incompatibili&#8221;.</p>
<p>La combinazione degli script in un unico file può essere eseguita in due modi:</p>
<ul>
<li><strong>manualmente</strong>, cioé copiando il contenuto di ogni script all&#8217;interno di un file più grande</li>
<li><strong>dinamicamente</strong>, ricorrendo a semplici script lato server</li>
</ul>
<p>Gli <strong>script lato server</strong> che vedremo sono strutturati in <strong>5 fasi</strong>:</p>
<ul>
<li>lettura dei nomi dei file da includere passati come parametri $_GET</li>
<li>impostazione delle opzioni</li>
<li>inclusione effettiva dei file</li>
<li>stampa dei campi di intestazione con la funzione header() per la gestione della cache, il tipo mime, ETag</li>
<li>stampa del contenuto finale del file</li>
</ul>
<h3>Script php: combinare più file css</h3>
<p>La particolarità dello script relativo ai file css è che per ogni file da includere è necessario <strong>specificare l&#8217;attributo media</strong> (all, screen, print, ecc.), cioé quell&#8217;attributo che indica il tipo di dispositivo per cui deve valere quel file css. <strong>Non è necessario specificare l&#8217;estensione</strong> dei file poiché viene aggiunta automaticamente all&#8217;interno dello script.</p>
<p><strong>Attenzione.</strong> Non passare nomi di file contenenti il carattere &#8220;.&#8221; in quanto, nelle richieste $_GET, viene convertito automaticamente in &#8220;_&#8221;.</p>
<p><strong>Codice html</strong></p>
<pre lang="html">&lt;link rel="stylesheet" type="text/css"
href="combined.css?file1:all&amp;file2:screen&amp;file3:print" /&gt;</pre>
<p><strong>Impostare Apache</strong></p>
<p>Poiché lo script che ha l&#8217;estensione <strong>.css</strong> è necessario impostare il server Apache affinché processi il file combined.css come un file .php. Basterà aggiungere un paio di righe.</p>
<pre>&lt;FilesMatch "combined.css$"&gt;
	AddHandler application/x-httpd-php .css
&lt;/FilesMatch&gt;</pre>
<h4>Script, demo e download</h4>
<p>Per vedere lo script vai a <a href="http://test.jblog.it/combine_css/combine.txt" target="_blank">http://test.jblog.it/combine_css/combine.txt</a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/combine_css/combine.css?file1:all&amp;file2:screen&amp;file3:print" target="_blank">http://test.jblog.it/combine_css/combine.css?file1:all&amp;file2:screen&amp;file3:print</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/combine_css.zip" target="_blank">http://download.jblog.it/combine_css.zip</a></p>
<h3>Script php: combinare più file javascript</h3>
<p><strong>Non è necessario specificare l&#8217;estensione</strong> dei file poiché viene aggiunta automaticamente all&#8217;interno dello script.</p>
<p><strong>Attenzione.</strong> Non passare nomi di file contenenti il carattere &#8220;.&#8221; in quanto, nelle richieste $_GET, viene convertito automaticamente in &#8220;_&#8221;.</p>
<h4>Codice html</h4>
<pre lang="html">&lt;script type="application/javascript" src="combined.js?file1&amp;file2&amp;file3"&gt;&lt;/script&gt;</pre>
<h4>Impostare Apache</h4>
<p>Poiché lo script che ha l&#8217;estensione <strong>.js</strong> è necessario impostare il server Apache affinché processi il file combined.js come un file .php. Basterà aggiungere un paio di righe.</p>
<pre>&lt;FilesMatch "combined.js$"&gt;
	AddHandler application/x-httpd-php .js
&lt;/FilesMatch&gt;</pre>
<h4>Script, demo e download</h4>
<p>Per vedere lo script vai a <a href="http://test.jblog.it/combine_js/combine.txt" target="_blank">http://test.jblog.it/combine_js/combine.txt</a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/combine_js/combine.js?file1&amp;file2&amp;file3" target="_blank">http://test.jblog.it/combine_js/combine.js?file1&amp;file2&amp;file3</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/combine_js.zip" target="_blank">http://download.jblog.it/combine_js.zip</a></p>
<h2>Stampare javascript e css nel codice html</h2>
<p>Sappiamo che per utilizzare codice javascript o css ci sono 3 modi:</p>
<ol>
<li>stamparli direttamente nel codice html</li>
<li>dividerli su più file esterni (da richiamare)</li>
<li>stamparne alcuni e richiamare gli altri</li>
</ol>
<h4>Il terzo metodo</h4>
<p>Come succede in tante occasioni, la &#8220;via di mezzo&#8221; è da preferire. La successiva domanda è: <strong>su che criterio si scelgono</strong> i file da stampare nel codice html e quelli da richiamare esternamente?</p>
<p>Sinceramente, non saprei dirlo con precisione. Probabilmente esistono degli studi che potrebbero aiutarti in questo. Secondo me, il codice da stampare nel documento html è quello che presumibilmente <strong>potrebbe essere utilizzato prima</strong>. Ad esempio:</p>
<ul>
<li>per <strong>javascript</strong>, il codice e le funzioni che verranno eseguite nell&#8217;<strong>evento &#8220;onload&#8221; dell&#8217;oggetto &#8220;document&#8221;</strong></li>
<li>per i <strong>css</strong>, il codice che serve a formattare gli <strong>elementi principali della pagina</strong>, come html, layout, contenitori, ecc.</li>
</ul>
<h4>Come automatizzare il tutto</h4>
<p>Fortunatamente, questa tecnica si può automatizzare con un paio di righe di codice lato server (php).</p>
<pre lang="html">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Javascript e Css nella pagina&lt;/title&gt;

&lt;style type="text/css"&gt;
&lt;?
	/* Array dei file css */
	$css_array = array("file3.css","file2.css");
	foreach($css_array as $css)
	{
		if(file_exists($css))
		include($css);
		echo "\n\n";
	}
?&gt;
&lt;/style&gt;

&lt;script type="application/javascript"&gt;
//&lt;![CDATA[
&lt;?
	/* Array dei javascript */
	$js_array = array("file1.js","file3.js");
	foreach($js_array as $js)
	{
		if(file_exists($js))
		include($js);
		echo "\n\n";
	}
?&gt;
//]]&gt;
&lt;/script&gt;

&lt;!-- File css esterni --&gt;
&lt;link rel="stylesheet" type="text/css" href="file1.css" /&gt;

&lt;!-- File javascript esterni --&gt;
&lt;script type="application/javascript" src="file2.js"&gt;&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Javascript e Css nella pagina&lt;/h1&gt;
	&lt;p&gt;Guarda il codice html&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h4>Script, demo e download</h4>
<p>Per vedere lo script vai a <a href="http://test.jblog.it/inhtml/inhtml.txt" target="_blank">http://test.jblog.it/inhtml/inhtml.txt</a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/inhtml/" target="_blank">http://test.jblog.it/inhtml/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/inhtml.zip" target="_blank">http://download.jblog.it/inhtml.zip</a></p>
<h2>Eliminare gli script duplicati</h2>
<p><img class="alignright size-full wp-image-446" title="Do not duplicate" src="http://jblog.it/wp-content/uploads/2009/05/331357312_893ef9e791.jpg" alt="Do not duplicate" width="270" height="180" />Quando si gestiscono <strong>grandi progetti</strong> si rischia di stampare e richiamare gli stessi script.</p>
<p>Alcuni browser, come Firefox, evitano di effettuare una nuova richiesta http per un file che è stato già scaricato. Purtroppo Internet Explorer non lo fa. Allora è necessario trovare una soluzione che valga per tutti.</p>
<p>Una semplice soluzione consiste nel fare una <strong>funzione php </strong>che riceva il nome del file da linkare e si occupi di stampare i tag &lt;script&gt;. Per registrare gli script che vengono inseriti di volta in volta si utilizza un array in modo che la funzione, prima di inserire uno script, controlla se il nome dello script non è già presente nell&#8217;array.</p>
<p>Normalmente per inserire script e css si dovrebbe scrivere:</p>
<pre>&lt;link rel="stylesheet" type="text/css" href="print_style.css" media="print" /&gt;
&lt;script src="library.js" type="application/javascript"&gt;&lt;/script&gt;</pre>
<p><strong>Classe PHP: noDuplicate (per php 4 e php 5)<br />
</strong></p>
<p>Ti descrivo brevemente la classe &#8220;noDuplicate&#8221;.</p>
<p><strong>La struttura</strong></p>
<pre lang="php">class noDuplicate
{
	/* Array dei file javascript */
	var $js_array = array();

	/* Array dei file css */
	var $css_array = array();

	/* Stampa i file specificati. */
	function incScript() { ... }

	/* Privata: registra il file e stampa il link al file javascript */
	function __js($file) { ... }

	/* Privata: registra il file stampa il link al file css */
	function __css($file) { ... }
}</pre>
<p><strong>Creare l&#8217;oggetto</strong></p>
<pre lang="php">$noDuplicateObj = new noDuplicate();</pre>
<p><strong>La funzione incScript()</strong></p>
<ul>
<li>il primo argomento deve essere &#8220;js&#8221; o &#8220;css&#8221;</li>
<li>dal secondo argomento in poi accetta da uno a più file <strong>dello stesso tipo</strong></li>
<li>se si devono inserire file <strong>.css</strong> è necessario passarli nella forma [nomefile]:[media] (ad es. &#8220;style.css:print&#8221;). Se vengono passati nella forma normale (&#8220;style.css&#8221;,&#8221;file.css&#8221;) verrà automaticamente impostato &#8220;all&#8221; come media</li>
</ul>
<pre lang="php">// singolo file
$noDuplicate-&gt;incScript("css","file2.css:all");
$noDuplicate-&gt;incScript("js","file1.js");

// più di un file
$noDuplicate-&gt;incScript("css","file2.css:all","mystyle.css:screen");
$noDuplicate-&gt;incScript("js","file1.js","jquery.js","prototype.js");

// file css senza specificare il "media"
$noDuplicate-&gt;incScript("css","file1.css","file3.css");<strong>
</strong></pre>
<p><strong>Risultato</strong></p>
<pre lang="html">&lt;!-- singolo file --&gt;
&lt;link rel="stylesheet" type="text/css" href="file2.css" media="all" /&gt;
&lt;script src="file1.js" type="application/javascript"&gt;&lt;/script&gt;

&lt;!-- più di un file --&gt;
&lt;link rel="stylesheet" type="text/css" href="file2.css" media="all" /&gt;
&lt;link rel="stylesheet" type="text/css" href="mystyle.css" media="screen" /&gt;
&lt;script src="file1.js" type="application/javascript"&gt;&lt;/script&gt;
&lt;script src="jquery.js" type="application/javascript"&gt;&lt;/script&gt;
&lt;script src="prototype.js" type="application/javascript"&gt;&lt;/script&gt;

&lt;!-- file css senza specificare il "media" --&gt;
&lt;link rel="stylesheet" type="text/css" href="file1.css" media="all" /&gt;
&lt;link rel="stylesheet" type="text/css" href="file3.css" media="all" /&gt;</pre>
<h4>Script, demo e download</h4>
<p>Per vedere lo script vai a <a href="http://test.jblog.it/rem_duplicate/rem_duplicate.txt" target="_blank">http://test.jblog.it/rem_duplicate/rem_duplicate.txt</a></p>
<p>Per vedere una demo vai a <a href="http://test.jblog.it/rem_duplicate/" target="_blank">http://test.jblog.it/rem_duplicate/</a></p>
<p>Per scaricare l&#8217;esempio vai a <a href="http://download.jblog.it/rem_duplicate.zip" target="_blank">http://download.jblog.it/rem_duplicate.zip</a></p>
<h2>Conclusione</h2>
<p>Queste tecniche esprimono la massima utilità e potenza se utilizzate contemporaneamente. La riduzione di richieste http e, quindi, l&#8217;abbassamento dei tempi di caricamento saranno notevoli.</p>
<p>Spero di essere stato abbastanza esaustivo e chiaro. Se non lo sono stato basterà dirmelo in modo da ritoccare l&#8217;articolo nelle sezioni meno comprensibili.</p>
<p><span class="hightlight_green">Hai mai utilizzato una di queste tecniche? Gli script hanno funzionato correttamente? È stato semplice metterle in pratica? Hai avuto concreti miglioramenti?</span></p>
<h3>Prossimo appuntamento</h3>
<p>L&#8217;ultima questione sull&#8217;ottimizzazione dei siti web riguarda appunto l&#8217;ottimizzazione dei componenti da caricare cioé:</p>
<ul>
<li>compressione delle immagini, degli script e dei css</li>
<li>offuscamento del codice javascript</li>
<li>utilizzo di gzip per la compressione delle pagine html, script e css</li>
</ul>
<h4 class="highlight_red">Non perdere il prossimo articolo sull&#8217;ottimizzazione dei componenti delle pagine web: codice html, immagini, script e css.</h4>
<h2>Crediti</h2>
<ul>
<li><strong>Libro</strong>. Creare siti web ad alte prestazioni di <a href="http://stevesouders.com" target="_blank">Steve Soulders</a></li>
<li><a href="http://www.websiteoptimization.com" target="_blank">WebSiteOptimization</a> &#8211; <a href="http://www.websiteoptimization.com/speed/tweak/combine/" target="_blank">Combine Images to Save HTTP Requests</a></li>
<li><a href="http://developer.yahoo.com/" target="_blank">Yahoo Developer Network</a> &#8211; <a href="http://developer.yahoo.com/performance/rules.html" target="_blank">Best Practices for Speeding Up Your Web Site</a></li>
<li><a href="http://www.w3.org">W3C</a> &#8211; <a href="http://www.w3.org/TR/html401/struct/objects.html#h-13.6" target="_blank">Objects, Images, and Applets: Image maps</a></li>
<li><a href="http://www.ietf.org/" target="_blank">The Internet Engineering Task Force</a> &#8211; <a href="http://tools.ietf.org/html/rfc2397" target="_blank">The &#8220;data&#8221; URL scheme</a></li>
<li><a href="http://cssglobe.com/" target="_blank">CssGlobe</a> &#8211; <a href="http://cssglobe.com/post/3028/creating-easy-and-useful-css-sprites" target="_blank">Creating easy and useful CSS Sprites</a></li>
<li>Foto1: <a href="http://www.flickr.com/photos/jasephotos/2913134974/" target="_blank">Mast Farm Picnic</a> &#8211; 030 di <a href="http://www.flickr.com/photos/jasephotos/" target="_blank">JasonBechtel</a></li>
<li>Foto2: <a href="http://olimpiadi.blogosfere.it/2008/08/davide-rebellin-argento-la-prima-medaglia-italiana-di-queste-olimpiadi.html" target="_blank">Davide Rebellin Argento, la prima medaglia italiana di queste Olimpiadi</a> di <a href="http://olimpiadi.blogosfere.it/" target="_blank">olimpiadi.blogosfere.it</a></li>
<li>Foto3: <a href="http://www.flickr.com/photos/kaibara/312855876/" target="_blank">Cats Puzzle</a> di <a href="http://www.flickr.com/photos/kaibara/" target="_blank">kaibara87</a></li>
<li>Foto4: <a href="http://elementiks.com/downloads/developpers_icons_preview.jpg" target="_blank">icone per sviluppatori</a></li>
<li>Foto5: <a href="http://www.flickr.com/photos/egansnow/288478628/" target="_blank">Puzzle</a> di <a href="http://www.flickr.com/photos/egansnow/" target="_blank">Egan Snow</a></li>
<li>Foto6: <a href="http://www.flickr.com/photos/popilop/331357312/" target="_blank">Do not duplicate</a> di <a href="http://www.flickr.com/photos/popilop/">Sam UL</a></li>
</ul>
<img src="http://jblog.it/?ak_action=api_record_view&id=405&type=feed" alt=" Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css"  title="Ridurre le richieste HTTP (parte 2): come unire e combinare immagini, script, css" />]]></content:encoded>
			<wfw:commentRss>http://jblog.it/2009/05/15/ridurre-richieste-http-parte-2-come-combinare-immagini-script-css-sprite-image-maps_405.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>
