<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6763137151780788364</atom:id><lastBuildDate>Fri, 27 Sep 2024 03:54:39 +0000</lastBuildDate><category>ajax</category><category>css</category><category>ExtJS</category><category>Google</category><category>xml</category><category>Open Social</category><category>Prototype</category><category>Smarty</category><category>low performance</category><category>php</category><category>wordpress</category><title>css, javascript, ajax, design, web2.0</title><description></description><link>http://styledimension.blogspot.com/</link><managingEditor>noreply@blogger.com (Ska)</managingEditor><generator>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-90743056326172464</guid><pubDate>Fri, 12 Jun 2009 13:37:00 +0000</pubDate><atom:updated>2009-06-12T15:06:11.825+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><category domain="http://www.blogger.com/atom/ns#">low performance</category><title>Javascript  per &quot;Low Performance&quot;</title><description>In quest&#39; articolo vedremo alcune ottimizzazioni che è possibile apportare al codice javascript allo scopo di migliorare le prestazioni in termini di esecuzione, specie in contesti &quot;low-performance&quot;.&lt;br /&gt;Il tool più utilizzato per testare le performance del codice Javascript è indubbiamente Firebug.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Iterazioni&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Un primo problema di performance è creato dai cicli for; questo genere di iterazioni posso essere migliorate in termini di speed up, sostituendoli dove possible (purtroppo questo non è sempre possibile) con un ciclo do ... while con decremento. Cioè&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border: 1px solid lightgrey&quot;&gt;&lt;table class=&quot;zeroBorder&quot; id=&quot;e4ex&quot; width=&quot;100%&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;33%&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;for(i=0:i &lt; data.length;i++){&lt;br /&gt;// iteration code ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign=&quot;middle&quot; width=&quot;33%&quot; align=&quot;center&quot;&gt;&lt;b&gt;diventa&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;&lt;td width=&quot;33%&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;j=data.length;&lt;br /&gt;do{&lt;br /&gt;// iteration code ...&lt;br /&gt;}while(--j);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Chiamate a funzioni&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La maggiore quantità di overhead è generato dalle chiamate a funzioni.&lt;br /&gt;Se ad esempio una funzione è richiamata all&#39; interno di un ciclo iterativo, questo può creare un maggior tempo di processamento.&lt;br /&gt;In questo caso il problema si può risolvere evitando la chiamata a funzione e spostando fisicamente il corpo della funzione all&#39; interno del ciclo iterativo.&lt;br /&gt;Ovviamente questa modifica se da un lato migliora le performance rispetto al&#39; esecuzione del codice, dall&#39; altro peggiore la leggibilità del codice, introducendo spesso ridondanze nel codice.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border: 1px solid lightgrey&quot;&gt;&lt;table class=&quot;zeroBorder&quot; id=&quot;bbav&quot; width=&quot;100%&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;33%&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(i=0:i &lt; data.length;i++){&lt;br /&gt;    doSomething();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;doSomethink(){&lt;br /&gt;// body code ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign=&quot;middle&quot; width=&quot;33%&quot; align=&quot;center&quot;&gt;&lt;b&gt;diventa&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;&lt;td width=&quot;33%&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(i=0;i &lt; data.length;i++){&lt;br /&gt;// body code ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Divisioni e parte intera&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In javascript per ottenere la parte intera di una divisione si ricorre a Math.floor; una chiamata a funzione che come si è detto sopra produce un overhead non indifferente.&lt;br /&gt;La stessa operazione, ragiondando in binario, può essere fatta effettuata con uno &quot;bit-shift&quot;.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border: 1px solid lightgrey&quot;&gt;&lt;table class=&quot;zeroBorder&quot; id=&quot;i0o_&quot; width=&quot;100%&quot; border=&quot;0&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;33%&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var numb = 10;&lt;br /&gt;var res = Math.floor(numb/4);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign=&quot;middle&quot; width=&quot;33%&quot; align=&quot;center&quot;&gt;&lt;b&gt;diventa&lt;/b&gt;&lt;br /&gt;&lt;/td&gt;&lt;td width=&quot;33%&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var numb = 10;&lt;br /&gt;var res = numb &gt;&gt; 2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Come si può vedere sopra si fa a meno della chiamata a funzione ottenendo lo stesso risultato.&lt;br /&gt;&lt;br /&gt;Ovviamente quelli descritti qui sopra vogliono solo essere degli spunti; sono applicabili tante altre migliorie al codice per ottimizzarne le risorse impiegate, sia in termini di CPU che in termini di memoria Ram.</description><link>http://styledimension.blogspot.com/2009/06/javascript-per-low-performance.html</link><author>noreply@blogger.com (Ska)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-5400229479629723242</guid><pubDate>Mon, 04 Aug 2008 10:10:00 +0000</pubDate><atom:updated>2008-12-10T00:26:38.556+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><category domain="http://www.blogger.com/atom/ns#">wordpress</category><title>10 Ajax plugin per Wordpress</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRBrZN2tqFYy_qpmSMsS2aPB5BFerPgQmFT8CeRhC8YavoBGpx2Cq18I_Nebh6rGhj7zXpm3hcE43UUxIKqiHMCt8ZdzHsflZRBAlMPPDUZkdTkxznbMKqqu65spcNQ26QEk2n5AgucnQ/s1600-h/wp-logo.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 139px; height: 139px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRBrZN2tqFYy_qpmSMsS2aPB5BFerPgQmFT8CeRhC8YavoBGpx2Cq18I_Nebh6rGhj7zXpm3hcE43UUxIKqiHMCt8ZdzHsflZRBAlMPPDUZkdTkxznbMKqqu65spcNQ26QEk2n5AgucnQ/s200/wp-logo.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5230608452216187810&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Quello che distingue &lt;a href=&quot;http://wordpress.org/&quot;&gt;Wordpress&lt;/a&gt; dalle altre piattaforme per Blogger facendone di questo un vero punto di forza, è la possibilità di poter aggiungere plugin e widget al proprio blog, arricchendolo di funzionalità e contenuti utili alla navigazione dell&#39; utente (commenti, ricerche, ecc ...), ma anche all&#39; amministratore (statistiche, ranking, ecc ...).&lt;br /&gt;Qui sotto sono elencati 10 plugin &quot;ajax style&quot; e relativi link:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://wordpress.org/extend/plugins/ajax-comment-preview/&quot;&gt;Ajax comment preview&lt;/a&gt;: Permette ad un lettore di vedere un&#39; anteprima dell&#39; invio definitivo.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://dev.lipidity.com/feature/wp-plugin-gregarious&quot;&gt;Gregarious&lt;/a&gt;: Plugin per Social Bookmarking per aggiungere i bottoni &quot;digg it&quot;, reggit, Feedburner, FeedFlare ed altri ancora.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.lesterchan.net/portfolio/programming.php&quot;&gt;WP-Polls&lt;/a&gt;: Consente di aggiungere sistemi di sondaggio completamente personalizzabili.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.lesterchan.net/portfolio/programming.php&quot;&gt;WP-Post Rating&lt;/a&gt;: Per dare la possibilità al lettore di esprimere un giudizio su un post o su una pagina.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://firestats.cc/&quot;&gt;FireStats&lt;/a&gt;: sistema molto completo si statistiche. &lt;a href=&quot;http://demo.firestats.cc/firestats&quot;&gt;Qui&lt;/a&gt; è possibile vedere una demo.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.xdweb.net/wordpress/?page_id=14&quot;&gt;XDTalk&lt;/a&gt;: Aggiungendo questo plugin gli utenti on-line potranno conversare in realtime tra loro; un altro plugin di questo tipo è &lt;a href=&quot;http://pierre.sudarovich.free.fr/&quot;&gt;AJAX Shoutbox&lt;/a&gt; che aggiunge anche funzionalità di notifiche sui messaggi ricevuti.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.bravenewcode.com/crossroads-flickr-plugin/&quot;&gt;Crossroads&lt;/a&gt;: Utilizzando le Flickr API mostra immagini proveniente da Flickr in thumbnail cliccabili.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://dancameron.org/wordpress/wordpress-plugins/search-everything-wordpress-plugin&quot;&gt;Google Ajax Search&lt;/a&gt;: Consente al lettore di eseguire ricerche sui contenuti del proprio sito, su google o anche su flickr&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://wordpress.smullindesign.com/plugins/ajax-comments&quot;&gt;Ajax Comment 2.0&lt;/a&gt;: I commenti per un post vengono aggiornati in tempo reale, senza bisogno di ricare la pagina&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://archive.yongfook.com/2006/05/28/plug-n-play-google-map/&quot;&gt;Plug &#39;n&#39; Play Google Map&lt;/a&gt;: Questo plugin permette di indicare un valore di longitudine ed uno di latitudine per ogni post, così da poterli avere segnati su una google map. Molto utile per blog che trattano di eventi.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>http://styledimension.blogspot.com/2008/08/10-ajax-plugin-per-wordpress.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRBrZN2tqFYy_qpmSMsS2aPB5BFerPgQmFT8CeRhC8YavoBGpx2Cq18I_Nebh6rGhj7zXpm3hcE43UUxIKqiHMCt8ZdzHsflZRBAlMPPDUZkdTkxznbMKqqu65spcNQ26QEk2n5AgucnQ/s72-c/wp-logo.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-3517412213042527094</guid><pubDate>Sat, 26 Jul 2008 06:47:00 +0000</pubDate><atom:updated>2008-12-10T00:26:38.708+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">Smarty</category><title>Smarty: Introduzione</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtleW4O0KoqxVWKRuo0q_7gZTrouC1gGOO2gTOlNsjxA-cx2WfxFErJz5NVOe5bvSW73X4IIzSKtkgjM04t85OYFnlraad85dXR7ne8TgPjPVDajVb2OMSR4-lgcHVULYW09SE2cP6OEs/s1600-h/smarty-logo-orange.gif&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 192px; height: 70px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtleW4O0KoqxVWKRuo0q_7gZTrouC1gGOO2gTOlNsjxA-cx2WfxFErJz5NVOe5bvSW73X4IIzSKtkgjM04t85OYFnlraad85dXR7ne8TgPjPVDajVb2OMSR4-lgcHVULYW09SE2cP6OEs/s320/smarty-logo-orange.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5227212522244025858&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Smarty è un motore di template per PHP che consente di separare la logica dal contenuto grafico dell&#39; applicazione. Per capire l&#39; utilità di una motore di template bisogna mettersi nella situazione in cui il programmatore PHP ed il web designer abbiamo ruoli diversi e non coincidano necessariamente nella  stessa persona. Attuando questa separazione il programmatore PHP è libero di cambiare l&#39; implementazione, ad esempio del codice responsabile del recupero dei dati da un database, senza influire sul codice html responsabile della formattazione e quindi della presentazione. Dualmente per il web designer. L&#39; unico requisito per l&#39; utilizzo di Smarty è avere un web service su cui gira PHP 4.0.6 o superiore. Scaricato Smarty da qui, bisogna prendere i file contenuti nella directory /libs/ della distribuzione:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;code&gt;&lt;br /&gt;Smarty.class.php&lt;br /&gt;Smarty_Compiler.class.php&lt;br /&gt;Config_File.class.php&lt;br /&gt;debug.tpl&lt;br /&gt;/internals/*.php (tutti)&lt;br /&gt;/plugins/*.php (tutti)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;In Smarty è possibile settare il path di sistema contenente le directory delle librerie, attraverso la costante SMARTY_DIR; questa andrà settata se l&#39; applicazione che si sta scrivendo non è in grado di trovare Smarty.class.php. Viceversa possiamo creare un&#39; istanza di Smarty in questo modo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;require(&#39;/usr/local/lib/php/Smarty/Smarty.class.php&#39;);&lt;br /&gt;$smarty = new Smarty;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;altrimenti bisognerà settare la costante SMARTY_DIR come detto sopra:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;define(&#39;SMARTY_DIR&#39;, &#39;/usr/local/lib/php/Smarty/&#39;);&lt;br /&gt;require(SMARTY_DIR . &#39;Smarty.class.php&#39;);&lt;br /&gt;$smarty = new Smarty;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Una volta sistemate le librerie, bisogna creare le directory richieste da Smarty per il suo corretto funzionamento; Smarty necessita di quattro directory chiamate (per default) templates, templates_c, configs e cache. Queste sono definite dalle proprietà della classe Smarty $template_dir, $compile_dir, $config_dir, e $cache_dir rispettivamente. I nostri template andranno posti nella directory /templates. Proviamo a creare un semplice template di esempio.&lt;br /&gt;Creiamo il template index.tpl che andremo a mettere dentro la directory /templates:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;code&gt;&lt;br /&gt;Hello, {$name}!&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Come si può capire quella tra parentesi graffe è una variabile Smarty.  Il significato di questo è avere un template che visualizzi sempre la frase &quot;Hello, ....!&quot;. In questo modo il template, e quindi la presentazione resterà sempre uguale, mentre l&#39; assegnazione della variabile name sarà a carico del programmatore PHP, o comunque a carico del codice PHP contenente la logica della presentazione. Ora creiamo il file index.php:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;// caricamento delle librerie di Smarty&lt;br /&gt;require(&#39;Smarty.class.php&#39;);&lt;br /&gt;&lt;br /&gt;$smarty = new Smarty;&lt;br /&gt;&lt;br /&gt;$smarty-&gt;template_dir = &#39;./templates/&#39;;&lt;br /&gt;$smarty-&gt;compile_dir = &#39;./templates_c/&#39;;&lt;br /&gt;$smarty-&gt;config_dir = &#39;./configs/&#39;;&lt;br /&gt;$smarty-&gt;cache_dir = &#39;./cache/&#39;;&lt;br /&gt;&lt;br /&gt;$smarty-&gt;assign(&#39;name&#39;,&#39;Ska&#39;);&lt;br /&gt;$smarty-&gt;display(&#39;index.tpl&#39;);&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Nell&#39; ordine:  &lt;ol id=&quot;iomc3&quot;&gt;&lt;li id=&quot;iomc4&quot;&gt;Si caricano le librerie di Smarty&lt;/li&gt;&lt;li id=&quot;e:31&quot;&gt;Si istanzia l&#39; oggetto Smarty&lt;/li&gt;&lt;li id=&quot;e:310&quot;&gt;Si settano le directory per il funzionamento di Smarty&lt;/li&gt;&lt;li id=&quot;fu2l&quot;&gt;Si assegna la variabile name&lt;/li&gt;&lt;li id=&quot;fu2l0&quot;&gt;Si mostra il template con le variabili settate  &lt;/li&gt;&lt;/ol&gt;Nel punto 4 e nel punto 5 si vede l&#39; utilizzo dei due metodi più usuali di Smarty: assign e display. Con &lt;span style=&quot;font-weight: bold;&quot;&gt;assign&lt;/span&gt; si assegnano le variabili; richiede due argomenti di tipo stringa, il primo è il nome della variabile Smarty, mentre il secondo è il valore che vogliamo assegnare alla variabile.&lt;br /&gt;Con &lt;span style=&quot;font-weight: bold;&quot;&gt;display&lt;/span&gt; si visualizza il template; l&#39; unico argomento richiesto da questo metodo è il nome del file di template. Richiamando da browser il file index.php vedremo la formattazione html del template creato con la variabile assegnata; cioè vedremo:&lt;br /&gt;&lt;br /&gt;Hello, Ska!</description><link>http://styledimension.blogspot.com/2008/07/smarty-introduzione.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtleW4O0KoqxVWKRuo0q_7gZTrouC1gGOO2gTOlNsjxA-cx2WfxFErJz5NVOe5bvSW73X4IIzSKtkgjM04t85OYFnlraad85dXR7ne8TgPjPVDajVb2OMSR4-lgcHVULYW09SE2cP6OEs/s72-c/smarty-logo-orange.gif" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-3624746820212478538</guid><pubDate>Wed, 23 Jul 2008 21:24:00 +0000</pubDate><atom:updated>2008-07-23T23:01:10.929+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><category domain="http://www.blogger.com/atom/ns#">ExtJS</category><title>ExtJS: Widget</title><description>ExtJS include un ampia gamma di widget javascript da utilizzare per la realizzazione di interfacce utente. In questo esempio ne vedremo solo alcuni, rimandando al &lt;a href=&quot;http://extjs.com/deploy/dev/examples/samples.html&quot;&gt;sito&lt;/a&gt; per una conoscenza più completa di tali widget.&lt;br /&gt;Il primo widget che prenderemo in esame è &lt;span style=&quot;font-weight: bold;&quot;&gt;MessageBox&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;Ext.onReady(function() {&lt;br /&gt;&lt;br /&gt;  Ext.get(&#39;mb1&#39;).on(&#39;click&#39;, function(e){&lt;br /&gt;      Ext.MessageBox.confirm(&#39;Confirm&#39;, &#39;Are you sure you want to do that?&#39;, showResult);&lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  Ext.get(&#39;mb2&#39;).on(&#39;click&#39;, function(e){&lt;br /&gt;      Ext.MessageBox.show({&lt;br /&gt;          title: &#39;Address&#39;,&lt;br /&gt;          msg: &#39;Please enter your address:&#39;,&lt;br /&gt;          width:300,&lt;br /&gt;          buttons: Ext.MessageBox.OKCANCEL,&lt;br /&gt;          multiline: true,&lt;br /&gt;          fn: showResultText,&lt;br /&gt;          animEl: &#39;mb2&#39;&lt;br /&gt;      });  &lt;br /&gt;  });&lt;br /&gt;&lt;br /&gt;  function showResult(btn){&lt;br /&gt;      var strMsg = &#39;You clicked the &#39;+btn+&#39; button&#39;;&lt;br /&gt;      Ext.MessageBox.show({&lt;br /&gt;          title: &#39;Button Click&#39;,&lt;br /&gt;          msg: strMsg&lt;br /&gt;      });&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;  function showResultText(btn, text){&lt;br /&gt;      var strMsg = &#39;You clicked the &#39;+btn+&#39; button and entered the text &#39;+text+&#39;.&#39;;&lt;br /&gt;      Ext.MessageBox.show({&lt;br /&gt;          title: &#39;Button Click&#39;,&lt;br /&gt;          msg: strMsg&lt;br /&gt;      });&lt;br /&gt;  };&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Nel listato di sopra (&lt;a href=&quot;http://stackoverflow.altervista.org/Test/ext/MessageBox/MessageBox.html&quot;&gt;qui&lt;/a&gt; è possibile vedere il risultato finale) si vedono due esempi di uso di MessageBox; il primo è una semplice MessageBox di tipo Yes/No. In questo caso si usa il metodo Ext.MessageBox.confirm() passandogli come argomenti il titolo della MessageBox, il messaggio all&#39; interno e l&#39; azione da intraprendere sulla scelta di Yes.&lt;br /&gt;La seconda MessageBox è invece una inputbox nella quale è possibile avere l&#39;inserimento di un input da parte dell&#39; utente. In questo caso si usa il metodo Ext.MessageBox.show(), nel quale i parametri vengono specificati usando un &quot;letterale oggetto&quot; che contiene un insieme di proprietà e valori. Un letterale oggetto è un particolare pattern di javascript che consente di creare dinamicamente un oggetto generico che contenga al suo interno una lista di coppie nome/valore rappresentanti le proprietà di tale oggetto.&lt;br /&gt;La demo completa è scaricabile &lt;a href=&quot;http://stackoverflow.altervista.org/Test/ext/MessageBox/MessageBox.rar&quot;&gt;qua&lt;/a&gt; (bisogna scompattare il file rar allo stesso livello della directory contenente ExtJS)&lt;br /&gt;Un altro widget molto interessante è &lt;span style=&quot;font-weight: bold;&quot;&gt;Grid&lt;/span&gt; che consente di creare una tabella in pieno stile ajax.&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;Ext.onReady(function() {&lt;br /&gt;&lt;br /&gt;  var myData = [ [1, &#39;Sergio&#39;,&#39;Mania&#39;,30,&#39;9/1&#39;],&lt;br /&gt;                       [2, &#39;Mario&#39;,&#39;Rossi&#39;,28,&#39;9/12&#39;],&lt;br /&gt;                       [3, &#39;Giovanni&#39;,&#39;Italia&#39;,24,&#39;10/1&#39;],&lt;br /&gt;                       [4, &#39;Mauro&#39;,&#39;Franceschini&#39;,34,&#39;7/4&#39;],&lt;br /&gt;                       [5, &#39;Sebastiano&#39;,&#39;Schiavone&#39;,29,&#39;5/22&#39;] ];&lt;br /&gt;&lt;br /&gt;  var myReader = new Ext.data.ArrayReader({}, [&lt;br /&gt;                       {name: &#39;id&#39;, type: &#39;int&#39;},&lt;br /&gt;                       {name: &#39;nome&#39;},&lt;br /&gt;                       {name: &#39;cognome&#39;},&lt;br /&gt;                       {name: &#39;eta&#39;, type: &#39;int&#39;},&lt;br /&gt;                       {name: &#39;data&#39;, type: &#39;date&#39;, dateFormat: &#39;n/j&#39;} ]);&lt;br /&gt;&lt;br /&gt;  var grid = new Ext.grid.GridPanel({&lt;br /&gt;          store: new Ext.data.Store({&lt;br /&gt;              data: myData,&lt;br /&gt;              reader: myReader&lt;br /&gt;          }),&lt;br /&gt;          columns: [&lt;br /&gt;              {header: &#39;Id&#39;, width: 50, sortable: true, dataIndex: &#39;id&#39;},&lt;br /&gt;              {header: &#39;Nome&#39;, width: 150, sortable: true, dataIndex: &#39;nome&#39;},&lt;br /&gt;              {header: &#39;Cognome&#39;, width: 150, sortable: true, dataIndex: &#39;cognome&#39;},&lt;br /&gt;              {header: &#39;Età&#39;, width: 50, sortable: true, dataIndex: &#39;eta&#39;},&lt;br /&gt;              {header: &#39;Data&#39;, width: 100, sortable: true, renderer: Ext.util.Format.dateRenderer(&#39;m/d/Y&#39;), dataIndex: &#39;data&#39;}&lt;br /&gt;          ],&lt;br /&gt;          renderTo: &#39;grid-example&#39;,&lt;br /&gt;          title: &#39;My First Grid&#39;,&lt;br /&gt;          width: 517,&lt;br /&gt;          frame: true&lt;br /&gt;  });&lt;br /&gt;  grid.getSelectionModel().selectFirstRow();&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Dal codice di esempio di sopra si può vedere come sia semplice creare una tabella con extjs, comprendente le funzioni di ordinamento per colonna.&lt;br /&gt;La demo dell&#39; esempio di sopra è visualizzabile &lt;a href=&quot;http://stackoverflow.altervista.org/Test/ext/Grid/Grid.html&quot;&gt;qui&lt;/a&gt;, mentre i sorgenti sono scaricabili da &lt;a href=&quot;http://stackoverflow.altervista.org/Test/ext/Grid/Grid.rar&quot;&gt;qui&lt;/a&gt;.</description><link>http://styledimension.blogspot.com/2008/07/extjs-widget.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-2973135019694242622</guid><pubDate>Tue, 22 Jul 2008 07:23:00 +0000</pubDate><atom:updated>2008-07-22T11:30:21.371+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><category domain="http://www.blogger.com/atom/ns#">ExtJS</category><title>ExtJS: Introduzione</title><description>ExtJS è un framework in javascript client-side per la realizzazione di applicazioni web.&lt;br /&gt;Il cuore di questa libreria è l&#39; oggetto Element con il quale potremo referenziare un elemento sulla nostra pagina; sostanzialmente è quello che faremmo con il seguente codice in javascript classico:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var myDiv = document.getElementById(&#39;myDiv&#39;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;In ExtJS invece scriveremo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;var myDiv = Ext.get(&#39;myDiv&#39;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;E&#39; da sottolineare che:&lt;br /&gt;&lt;br /&gt;    * Usando il javascript classico, non è garantito il cross-browser, che al contrario è garantito da ExtJS&lt;br /&gt;    * Element.get() tramite una cache interna assicura che chiamate multiple allo stesso oggetto siano molto veloci&lt;br /&gt;    * Le azioni più comunemente applicate ai nodi DOM sono garantite da metodi diretti e cross-browser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La selezione di un nodo DOM, può venire agevolmente tramite una libreria autonoma compresa in ExtJS chiamata DOMQuery. Il metodo Element.select() usa internamente questa libreria.&lt;br /&gt;Ad esempio potremo scrivere:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;Ext.select(&#39;p&#39;).highlight();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;per selezionare contemporaneamente tutti i paragrafi p presenti nella pagina.&lt;br /&gt;Diamo un occhiata alla gestione degli eventi.&lt;br /&gt;L&#39; evento più importante, che sicuramente sarà presente in ogni pagina dove vorremo utilizzare ExtJS, è sicuramente Ext.onReady(); questo viene invocato automaticamente non appena il DOM finisce di essere caricato, garantendo così, che tutti gli elementi della pagina che andrete a referenziare siano disponibili al momento dell&#39;esecuzione dello script.&lt;br /&gt;Se invece siamo interessati a programmare la risposta ad un evento, ad esempio di un click su un pulsante:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;Ext.get(&#39;myButton&#39;).on(&#39;click&#39;, function(){ alert(&quot;Hai fatto click sul pulsante&quot;); });&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Quindi considerando il seguente blocco di codice:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;Ext.onReady(function() {&lt;br /&gt;    Ext.get(&#39;myButton&#39;).on(&#39;click&#39;, function(){&lt;br /&gt;        alert(&quot;Hai fatto click sul pulsante&quot;);&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Avremo che questo verrà caricato all&#39; inizio, ma la funzione all&#39; interno del metodo &#39;on&#39; verrà eseguita solo allo scatenarsi dell&#39; evento di click sul pulsante &#39;myButton&#39;; cioè la funzione all&#39; interno di on è definita sin dall&#39; inzio, ma non eseguita fino allo scatenarsi dell&#39; evento.&lt;br /&gt;Naturalmente si può anche fare a meno della sintassi in-line, cioè della definizione della funzione all&#39; interno della stessa chiamata del metodo, e scrivere più ordinatamente:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;Ext.onReady(function() {&lt;br /&gt;    var buttonClicked = function() {&lt;br /&gt;        alert(&quot;Hai fatto click sul pusante myButton&quot;);&lt;br /&gt;    }&lt;br /&gt;    Ext.get(&#39;myButton&#39;).on(&#39;click&#39;, buttonClicked);&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;.</description><link>http://styledimension.blogspot.com/2008/07/extjs-introduzione-extjs-un-framework.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-6898259597199068106</guid><pubDate>Fri, 18 Jul 2008 14:41:00 +0000</pubDate><atom:updated>2008-12-10T00:26:38.945+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">Open Social</category><category domain="http://www.blogger.com/atom/ns#">xml</category><title>OpenSocial</title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiICDZgaKstRIjbC-14HgELTxN0tSX0hS8K5C5PEBMBVxIYQkZXDnqVrsxPOQVKofsUaJVCDlF6rBTT6fKE-Gss8ygl_ygii5UpE6wh5wPps-3Oj0WGFjZf8yQQsGohBGu_EMvxYM2t-bs/s1600-h/opensocial.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiICDZgaKstRIjbC-14HgELTxN0tSX0hS8K5C5PEBMBVxIYQkZXDnqVrsxPOQVKofsUaJVCDlF6rBTT6fKE-Gss8ygl_ygii5UpE6wh5wPps-3Oj0WGFjZf8yQQsGohBGu_EMvxYM2t-bs/s200/opensocial.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5225416961441786866&quot; /&gt;&lt;/a&gt;&lt;br /&gt;OpenSocial è un inseme di API comuni che consentono la realizzazione di &quot;social application&quot; per molto siti web, cioè dal punto di vista dello sviluppatore è possibile scrivere un&#39; applicazione che funzioni contemporaneamente su più siti che rispettano le specifiche dettate da OpenSocial (MySpace, Hi5, iLike, Orkut ...).&lt;br /&gt;L&#39; approccio per la scrittura di una applicazione OpenSocial è sostanzialmente quello dei google gadget, ovvero un documento xml contenente al proprio interno un frammento HTML/Javascript; la differenza con google gadget sta nel fatto che le OpenSocial API offrono l&#39; ambiente necessario per accedere facilmente hai dati dei social network.&lt;br /&gt;Vediamo un esempio. Supponiamo di voler realizzare un widget che recuperi la friends list.&lt;br /&gt;Per prima cosa creiamo il file js che dovrà contenere il codice javascript.&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;gadgets.util.registerOnLoadHandler(init);&lt;br /&gt;   function init() {&lt;br /&gt;       loadFriends();&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;In questo modo abbiamo creato una funzione di init che viene richiamata quando l&#39; applicazione viene caricata.&lt;br /&gt;Definiamo ora loadFriends():&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;function loadFriends() {&lt;br /&gt;   var req = opensocial.newDataRequest();&lt;br /&gt;   req.add(req.newFetchPersonRequest(&#39;VIEWER&#39;), &#39;viewer&#39;);&lt;br /&gt;   req.add(req.newFetchPeopleRequest(&#39;VIEWER_FRIENDS&#39;), &#39;viewerFriends&#39;);&lt;br /&gt;   req.send(onLoadFriends);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Con opensocial.newDataRequest() possiamo creare un oggetto di tipo richiesta, per poi popolarlo con i data di cui abbiamo bisogno; nel nostro caso &#39;viewer&#39; e viewer&#39; s friends.&lt;br /&gt;Tramite la send usiamo una funzione di callback, pre prendere i dati ritornati dal server e mostrarli sulla pagina.&lt;br /&gt;Quindi creiamo onLoadFriends():&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function onLoadFriends(data) {&lt;br /&gt;   var viewer = data.get(&#39;viewer&#39;).getData();&lt;br /&gt;   var viewerFriends = data.get(&#39;viewerFriends&#39;).getData();&lt;br /&gt;   html = new Array();&lt;br /&gt;   html.push(&#39;&amp;lt;ul&gt;&#39;);&lt;br /&gt;   viewerFriends.each(function(person) {&lt;br /&gt;       html.push(&#39;&amp;lt;li&gt;&#39; + person.getDisplayName() + &quot;&amp;lt;/li&gt;&quot;);&lt;br /&gt;   });&lt;br /&gt;   html.push(&#39;&amp;lt;/ul&gt;&#39;);&lt;br /&gt;   document.getElementById(&#39;friends&#39;).innerHTML = html.join(&#39;&#39;);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Come si vede abbiamo raccolto i dati provenienti dal server in risposta alla nostra richiesta, e li stiamo formattando in HTML per inserirli dentro il div &#39;friends&#39; che andremo a creare nella parte html del file xml:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;code language=&quot;javascript&quot;&gt;&lt;br /&gt;   &amp;lt;module&gt;&lt;br /&gt;       &amp;lt;moduleprefs title=&quot;Gifts part 1 - Friends&quot;&gt;&lt;br /&gt;           &amp;lt;require feature=&quot;opensocial-0.7&quot;&gt;&lt;br /&gt;           &amp;lt;/require&gt;&lt;br /&gt;           &amp;lt;content type=&quot;html&quot;&gt;&lt;br /&gt;           &amp;lt;!--[CDATA[                 &lt;br /&gt;               &amp;lt;script src=&quot;http://opensocial-resources.googlecode.com/svn/samples/tutorial/tags/api-0.7/gifts_1_friends.js&quot;&gt;&lt;br /&gt;               &amp;lt;/script&gt;&amp;lt;br /&gt;                &lt;br /&gt;               &amp;lt;script&gt; gadgets.util.registerOnLoadHandler(init); &lt;br /&gt;               &amp;lt;/script&gt;&lt;br /&gt;                &lt;br /&gt;               &amp;lt;div id=&quot;&#39;main&#39;&quot;&gt; Your friends: &amp;lt;div id=&quot;&#39;friends&#39;&quot;&gt;&amp;lt;/div&gt; &amp;lt;/div&gt;&amp;lt;br /&gt;         ]]--&gt;&lt;br /&gt;       &amp;lt;/content&gt;&lt;br /&gt;   &amp;lt;/moduleprefs&gt;&lt;br /&gt;&amp;lt;/module&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://styledimension.blogspot.com/2008/07/opensocial.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiICDZgaKstRIjbC-14HgELTxN0tSX0hS8K5C5PEBMBVxIYQkZXDnqVrsxPOQVKofsUaJVCDlF6rBTT6fKE-Gss8ygl_ygii5UpE6wh5wPps-3Oj0WGFjZf8yQQsGohBGu_EMvxYM2t-bs/s72-c/opensocial.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-7087279908015477695</guid><pubDate>Thu, 13 Sep 2007 17:53:00 +0000</pubDate><atom:updated>2008-07-22T08:35:55.883+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><category domain="http://www.blogger.com/atom/ns#">Prototype</category><title>Xml Request con Prototype</title><description>Prototype è un framework che consente di sviluppare applicazioni web dinamiche. In particolare, come si può leggere anche su &lt;a href=&quot;http://it.wikipedia.org/wiki/Prototype_JavaScript_Framework&quot;&gt;wikipedia&lt;/a&gt;, offre supporto per l&#39; utilizzo di AJAX  e per la programmazione ad aoggetti in javascript, nonchè per dei toolkits sviluppati con questo framework, che contengono effetti già pronti per ogni evenienza, come ad esempio &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;.&lt;br /&gt;In questo post vedremo come poter fare semplicemente una richiesta xml con prototype, risparmiando tempo e fatica, e guadagno in leggibilità del codice.&lt;br /&gt;In Prototype la request è fatta creando l&#39; istanza all&#39; oggetto Ajax.Request:&lt;br /&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;keywords&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;p  style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px;color:white;&quot;&gt;&lt;span class=&quot;keywords&quot;&gt;&lt;br /&gt;new&lt;/span&gt; Ajax.Request&lt;span class=&quot;brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&#39;/some_url&#39;&lt;/span&gt;, { method:&lt;span class=&quot;string&quot;&gt;&#39;get&#39;&lt;/span&gt; }&lt;span class=&quot;brackets&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Per gestire il responso alla request, saranno necessarie le callback, questi metodi di callback saranno passati nelle opzioni quando si crea la request, nel seguente modo:&lt;br /&gt;&lt;br /&gt;&lt;p  style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px;color:white;&quot;&gt;&lt;span class=&quot;keywords&quot;&gt;&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;new&lt;/span&gt; Ajax.Request&lt;span class=&quot;brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&#39;/some_url&#39;&lt;/span&gt;,&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt; {&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt;method:&lt;span class=&quot;string&quot;&gt;&#39;get&#39;&lt;/span&gt;,&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt;onSuccess: &lt;span class=&quot;keywords&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;brackets&quot;&gt;(&lt;/span&gt;transport&lt;span class=&quot;brackets&quot;&gt;)&lt;/span&gt;{&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt;&lt;span class=&quot;keywords&quot;&gt;var&lt;/span&gt; response = transport.responseText || &lt;span class=&quot;string&quot;&gt;&quot;no response text&quot;&lt;/span&gt;;&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;     &lt;/span&gt;alert&lt;span class=&quot;brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&quot;Success! \n\n&quot;&lt;/span&gt; + response&lt;span class=&quot;brackets&quot;&gt;)&lt;/span&gt;;&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt;},&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt;onFailure: &lt;span class=&quot;keywords&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;brackets&quot;&gt;)&lt;/span&gt;{ alert&lt;span class=&quot;brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&#39;Something went wrong...&#39;&lt;/span&gt;&lt;span class=&quot;brackets&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;font-family:monospace;&quot;&gt;&lt;/span&gt;}&lt;span class=&quot;brackets&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;brackets&quot;&gt;&lt;/span&gt;;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;brackets&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Nell&#39; esempio di sopra sono specificati solo due callback, onSuccess e onFailure, le altre disponibili sono le seguenti:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;onUninitialized&lt;/code&gt;,&lt;/li&gt;&lt;li&gt;&lt;code&gt;onLoading&lt;/code&gt;,&lt;/li&gt;&lt;li&gt;&lt;code&gt;onLoaded&lt;/code&gt;,&lt;/li&gt;&lt;li&gt;&lt;code&gt;onInteractive&lt;/code&gt;,&lt;/li&gt;&lt;li&gt;&lt;code&gt;onComplete&lt;/code&gt; and&lt;/li&gt;&lt;li&gt;&lt;code&gt;onException&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;Un&#39; altra opzione di cui possiamo disporre nella creazione della request, è parameters. Questo è necessario nel caso di variabile GET o POST da passare alla pagina php responsabile della request.&lt;br /&gt;Un esempio completo è il seguente:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;function getRequest(){&lt;br /&gt;&lt;br /&gt;var txtid = document.formdiprova.txtProva.value;&lt;br /&gt;var pars = &quot;account=&quot;+escape(account)+&quot;&amp;id=&quot;+escape(txtid)+&quot;&amp;amp;amp;rand=&quot;+Math.random();&lt;br /&gt;&lt;br /&gt;new Ajax.Request(&quot;./php/status.php&quot;,&lt;br /&gt;{&lt;br /&gt;  method:&#39;get&#39;,&lt;br /&gt; parameters: pars,&lt;br /&gt;  onSuccess: function(data){&lt;br /&gt;    var response = data.responseText || &quot;no response text&quot;;&lt;br /&gt;   $(&quot;divdiprova).innerHTML = response;&lt;br /&gt;  },&lt;br /&gt; onLoading: function(){&lt;br /&gt;  $(&quot;divimg&quot;).style.backgroundImage = &quot;url(\&quot;./ico/loading.gif\&quot;)&quot;;&lt;br /&gt; },&lt;br /&gt;  onFailure: function(){ alert(&#39;Something went wrong...&#39;) }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;Nell&#39; esempio di sopra si può vedere che la stringa pars che verrà poi assegnata all&#39; opzione parameters, rappresenta le varibili get ( nel nostro caso abbiamo specificato get nell&#39; opzione method ). Inoltre abbiamo specificato la callback onSuccess, al verificarsi della quale verrà mostrato il risultato dello script php; la callback onLoading, con la quale verrà mostrata una gif di caricamento durante l&#39; attesa dei risultat; la callback onFailure che mostrerà un alert nel momento in cui la richiesta non dovesse andare a buon fine.&lt;br /&gt;Da notare l&#39; uso dell&#39; operatore $(&#39;...&#39;) di prototype, equivalente a document.getElementById(&#39;...&#39;) e con il quale è possibile accedere a qualsiasi elemento della pagina con un id impostato.</description><link>http://styledimension.blogspot.com/2007/09/xml-request-con-prototype.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-179022612699702076</guid><pubDate>Mon, 09 Apr 2007 07:53:00 +0000</pubDate><atom:updated>2008-07-27T23:52:50.205+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">xml</category><title>Google Gadget</title><description>Come recita l&#39; &lt;a href=&quot;http://www.google.com/apis/gadgets/index.html&quot;&gt;index&lt;/a&gt; di google gadgets API, si tratta di un semplice modo per creare piccole applicazioni utilizzabili su molti siti. Google provvede a fornire hosting e banda gratuiti ed una semplice maniera per inviare i gadget nella public directory.&lt;br /&gt;Inoltre è presente una ottima &lt;a href=&quot;http://www.google.com/apis/gadgets/docs-home.html&quot;&gt;documentazione&lt;/a&gt;, molto completa e dettagliata.&lt;br /&gt;Sostanzialmente un google gadget non è altro che un file xml, con la seguente struttura:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;Module&amp;gt;&lt;br /&gt;&amp;lt;ModulePrefs title=&quot;MyFirstGadget&quot; height=&quot;250&quot; scaling=&quot;false&quot; /&amp;gt;&lt;br /&gt;&amp;lt;Content type=&quot;html&quot;&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;            .&lt;br /&gt;            .&lt;br /&gt;.&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/Content&amp;gt;&lt;br /&gt;&amp;lt;/Module&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;Come si può intuire il corpo del gadget andrà tra &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;!--[CDATA[&lt;/span&gt; e &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;]]--&gt;&lt;/span&gt;i puntini di sospensione.&lt;br /&gt;Il corpo del gadget si costruisce in HTML e javascript come una normalissima pagina web.&lt;br /&gt;Ad esempio supponiamo di voler fare un applicazione che abbia una scritta, e che questa al click di un pulsante cambi colore:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: rgb(153, 187, 85); padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;Module&amp;gt;&lt;br /&gt;&amp;lt;ModulePrefs title=&quot;MyFirstGadget&quot; height=&quot;250&quot; scaling=&quot;false&quot; /&amp;gt;&lt;br /&gt;&amp;lt;Content type=&quot;html&quot;&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;label id=&quot;color_label&quot;&amp;gt;Check on this button&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input type=&quot;button&quot; name=&quot;btnchange&quot; value=&quot;Change!&quot; onclick=&quot;change();&quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;function change(){&lt;br /&gt; document.getElementById(&quot;color_label&quot;).style.color = &quot;red&quot;;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/Content&amp;gt;&lt;br /&gt;&amp;lt;/Module&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Questo naturalmente è un semplice esempio, ma solo seguendo &lt;a href=&quot;http://www.google.com/apis/gadgets/docs-home.html&quot;&gt;la guida allo sviluppo&lt;/a&gt;, ci si può rendere conto delle funzionalità e delle potenzilità di queste API, quindi rimando ad una lettura di tale documentazione.&lt;br /&gt;&lt;a href=&quot;http://www.google.it/ig/add?moduleurl=http://sergiosicari.googlepages.com/postit.xml&amp;amp;source=imag&quot;&gt;Qui puoi aggiungere alla tua home page un gadget per prendere note al volo che ho creato io (Postit).&lt;/a&gt;&lt;br /&gt;Per pubblicare un gadget, bisogno per prima cosa disporre di uno spazio sul web dove poter ospitare il file xml ed eventuali altri file ( immagini, altri xml, ecc ... ) a cui fa riferimento l&#39; xml principale. Il link deve essere inserito in questa &lt;a href=&quot;http://www.google.com/ig/submit&quot;&gt;pagina&lt;/a&gt;, dopo aver seguito scrupolosamente le istruzioni sui campi obbligatori.</description><link>http://styledimension.blogspot.com/2007/04/google-gadget.html</link><author>noreply@blogger.com (Ska)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-3044316665099366822</guid><pubDate>Mon, 26 Mar 2007 10:58:00 +0000</pubDate><atom:updated>2007-03-26T12:58:42.657+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><title>XMLHttpRequest, POST Request</title><description>In un post precedente si è visto come usare l&#39; oggetto XMLHttpRequest per effettuare una richiesta di tipo GET ad un script lato server e recuperare i risultati.&lt;br /&gt;Ora si vedrà invece un esempio di richiesta di tipo POST che potrà tornare utile nel caso si abbia a che fare con form.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Naturalmente tutto quanto detto sopra è solo un esempio per dare una spiegazione su come utilizzare l&#39; oggetto XMLHttpRequest.&lt;br /&gt;Il discorso si può estendere all&#39; explorer, modificando lo script js nel seguente modo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;var myRequest = null;&lt;br /&gt;&lt;br /&gt;function CreateXmlHttpReq(handler) {&lt;br /&gt;  var xmlhttp = null;&lt;br /&gt;  try {&lt;br /&gt;    xmlhttp = new XMLHttpRequest();&lt;br /&gt;  } catch(e) {&lt;br /&gt;    try {&lt;br /&gt;        xmlhttp = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);&lt;br /&gt;    } catch(e) {&lt;br /&gt;        xmlhttp = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  xmlhttp.onreadystatechange = handler;&lt;br /&gt;  return xmlhttp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function myHandler() {&lt;br /&gt;    if (myRequest.readyState == 4 &amp;&amp; myRequest.status == 200) {&lt;br /&gt;        e = document.getElementById(&quot;result_div&quot;);&lt;br /&gt;        e.innerHTML = myRequest.responseText;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Il codice scritto sopra è uguale a quello del post precedente e può rimare uguale per  l&#39; esempio. Ora dobbiamo creare una funzione per fare la richiesta post:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;function doPost(){&lt;br /&gt;  myRequest = CreateXmlHttpReq(myHandler);&lt;br /&gt;  myRequest.open(&quot;POST&quot;, &quot;prova.php&quot;, true);&lt;br /&gt;  myRequest.setRequestHeader(&quot;Content-Type&quot;,&quot;application/x-www-form-urlencoded&quot;);&lt;br /&gt;  var body=&quot;f1=&quot;+document.frm.field1.value+&quot;&amp;f2=&quot;+document.frm.field2.value;&lt;br /&gt;  myRequest.setRequestHeader(&quot;Content-length&quot;, body.length);&lt;br /&gt;  myRequest.setRequestHeader(&quot;Connection&quot;, &quot;close&quot;);&lt;br /&gt;  myRequest.send(body);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Per finire l&#39; esempio creiamo lo script php dal lato server:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;echo &quot;f1=&quot;.$_POST[&#39;f1&#39;].&quot; e f2=&quot;.$_POST[&#39;f2&#39;];&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Per testare l&#39; esempio possiamo includere lo javascript descritto sopra in una pagina html e creare all&#39; interno di questa un form come questo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;form name=&#39;frm&#39; method=&#39;post&#39; action=&#39;prova.php&#39;&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;input name=&#39;f1&#39; value=&#39;&#39; size=&#39;25&#39;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;input name=&#39;f2&#39; value=&#39;&#39; size=&#39;25&#39;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Ed il div per visualizzare il risultato:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;div id=&#39;result_div&#39; style=&#39;position: relative; width: 200px; height: 20px;&#39;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://styledimension.blogspot.com/2007/03/xmlhttprequest-post-request.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-1786726570743818997</guid><pubDate>Sat, 10 Mar 2007 00:11:00 +0000</pubDate><atom:updated>2008-12-10T00:26:39.119+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ajax</category><title>XMLHttpRequest</title><description>XMLHttpRequest è un oggetto di javascript che permette di fare richieste HTTP in background sia di tipo GET che di tipo POST. L&#39; utilità di questo oggetto deriva dal fatto di poter visualizzare il risultato di una richiesta al server da parte del browser senza la necessità di dover aggiornare la pagina web.&lt;br /&gt;Quindi, per grandi linee, quello che si fa è creare una pagina html che tramite l&#39; oggetto XMLHttpRequest fa una richiesta ad un&#39; applicazione server che può essere scritta in un qualsiasi linguaggio server-side, che risponde alla richiesta.&lt;br /&gt;Nella seguente figura si può vedere la differenza tra il metodo classico e l&#39; ultilizzo di XMLHttpRequest e quindi di Ajax:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggBvDAZoClaoH3pL9PX4oLJCiTwFFJiaKEcz52-xmpD-Hj5vcs0QB-osMYyhJ0IZhUAjbybbHQo71Vw0n_BFgN3xuv2vFtJZW1NwDuOZJq_ZisnNLbXStT3QyjYg9uHarfnxGNMZEukb0/s1600-h/ajax-fig1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggBvDAZoClaoH3pL9PX4oLJCiTwFFJiaKEcz52-xmpD-Hj5vcs0QB-osMYyhJ0IZhUAjbybbHQo71Vw0n_BFgN3xuv2vFtJZW1NwDuOZJq_ZisnNLbXStT3QyjYg9uHarfnxGNMZEukb0/s400/ajax-fig1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5046185765142797506&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vediamo ora come si crea l&#39; oggetto XMLHttpRequest:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;function CreateXMLHttpRequest(handler){&lt;br /&gt;   var xmlhttp = null;&lt;br /&gt;   xmlhttp = new XMLHttpRequest();&lt;br /&gt;   xmlhttp.onreadystatechange = handler;&lt;br /&gt;   return xmlhttp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Quanto detto sopra non vale per l&#39; internet explorer ( vedremo più avanti come adattarlo anche per questo ).&lt;br /&gt;La funzione che abbiamo creato, prende in ingresso un solo argomento, il nome della funzione che vogliamo sia chiamata quando la richiesta viene eseguita.&lt;br /&gt;Ora che abbiamo la funzione per creare l&#39; oggetto XMLHttpRequest vediamo come utilizzarla:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;function esempio(){&lt;br /&gt;var myRequest = CreateXmlHttpReq(handler);&lt;br /&gt;myRequest.open(&quot;GET&quot;,&quot;prova.php&quot;);&lt;br /&gt;myRequest.send(null);&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;La terza riga di codice setta l&#39; oggetto creato nella seconda riga in modo da far eseguire una richiesta GET al file prova.php, mentre nell&#39; ultima riga la richiesta viene inviata.&lt;br /&gt;Ora bisogna creare la funzione handler che verrà chiamata per gestire la richiesta:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;function handler() {&lt;br /&gt;    if (myRequest.readyState == 4 &amp;&amp; myRequest.status == 200) {&lt;br /&gt;        alert(myRequest.responseText);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;La proprietà readState ci dice per quale motivo è stato chiamato in base al valore che assume secondo questi possibili valori che può assumere:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;    0 - uninitialized&lt;br /&gt;    1 - loading&lt;br /&gt;    2 - loaded&lt;br /&gt;    3 - interactive&lt;br /&gt;    4 - complete&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Nel nostro frammento di codice, nell&#39; if, controlliamo che la richiesta sia stata eseguita e completata, a questo punto verrà settata anche la proprietà status, contenente il valore dello stato della risposta HTTP, che è 200 per le richieste avvenute con successo.&lt;br /&gt;Per provare l&#39; esempio creiamo nella pagina html un pulsante che richiami la funzione  di sopra esempio():&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;input type=&quot;button&quot; value=&quot;Clicca per lanciare la richiesta&quot; onClick=&quot;esempio3()&quot; &amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;e, infine, creare uno script php che accolga la richiesta e restituisca una risposta.&lt;br /&gt;Quindi creeremo il file prova.php:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;?php echo &quot;questa scritta è nello script php; &amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Naturalmente tutto quanto detto sopra è solo un esempio per dare una spiegazione su come utilizzare l&#39; oggetto XMLHttpRequest.&lt;br /&gt;Il discorso si può estendere all&#39; explorer, modificando lo script js nel seguente modo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;br /&gt;var myRequest = null;&lt;br /&gt;&lt;br /&gt;function CreateXmlHttpReq(handler) {&lt;br /&gt;  var xmlhttp = null;&lt;br /&gt;  try {&lt;br /&gt;    xmlhttp = new XMLHttpRequest();&lt;br /&gt;  } catch(e) {&lt;br /&gt;    try {&lt;br /&gt;        xmlhttp = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);&lt;br /&gt;    } catch(e) {&lt;br /&gt;        xmlhttp = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  xmlhttp.onreadystatechange = handler;&lt;br /&gt;  return xmlhttp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function myHandler() {&lt;br /&gt;    if (myRequest.readyState == 4 &amp;&amp; myRequest.status == 200) {&lt;br /&gt;        e = document.getElementById(&quot;result_div&quot;);&lt;br /&gt;        e.innerHTML = myRequest.responseText;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function esempio() {&lt;br /&gt;    var txt = document.example_form.txt.value;&lt;br /&gt;    myRequest = CreateXmlHttpReq(myHandler);&lt;br /&gt;    myRequest.open(&quot;GET&quot;,&quot;primo.php&amp;rand=&quot;+escape(Math.random());&lt;br /&gt;    myRequest.send(null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;E&#39; molto importante notare, nella funzione esempio(), la riga:&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;myRequest.open(&quot;GET&quot;,&quot;primo.php&amp;rand=&quot;+escape(Math.random());&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Il motivo della modifica di questa riga di codice, è sempre per sistemare la situazione con l&#39; explorer.&lt;br /&gt;Infatti questo fa il caching delle richieste HTTP con metodo GET, quindi richieste diverse fatte in questo modo potrebbero ritornare sempre lo stesso risultato.&lt;br /&gt;Per evitare questo usiamo una variabile, passata in modo GET allo script php, che abbia come valore un numero generato casualmente, in modo che l&#39; explorer pensi di aver a che fare con una pagina diversa ad ogni richiesta.&lt;br /&gt;L&#39; esempio completo è scaricabile da &lt;a href=&quot;http://www.fileden.com/files/2006/12/4/465575/esempio.rar&quot;&gt;qui&lt;/a&gt;.</description><link>http://styledimension.blogspot.com/2007/03/xmlhttprequest.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggBvDAZoClaoH3pL9PX4oLJCiTwFFJiaKEcz52-xmpD-Hj5vcs0QB-osMYyhJ0IZhUAjbybbHQo71Vw0n_BFgN3xuv2vFtJZW1NwDuOZJq_ZisnNLbXStT3QyjYg9uHarfnxGNMZEukb0/s72-c/ajax-fig1.png" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-6680501685094510461</guid><pubDate>Mon, 05 Mar 2007 11:10:00 +0000</pubDate><atom:updated>2007-03-05T13:36:24.672+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">css</category><title>Ombre in Css</title><description>In questo post vedremo una tecnica che permette di applicare le ombre utilizzando i css. Per prima cosa si dovrà creare con Photoshop o Gimp un&#39; ombra ( oppure prelevarla gia pronta da &lt;a href=&quot;http://www.fileden.com/files/2006/12/4/465575/Others/shadowAlpha.png&quot;&gt;qui&lt;/a&gt; ).&lt;br /&gt;La tecnica, per grandi linee, consiste nell&#39; inserire un immagine all&#39; interno di un div che ha come sfondo l&#39; ombra di cui sopra, e poi si gioca sulla proprietà margin dell&#39; immagine per creare l&#39; effetto di ombra.&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;#divimg{&lt;br /&gt; background: url(&#39;./shadowAlpha.png&#39;) no-repeat bottom right;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#divimg img{&lt;br /&gt; border: 2px solid white;&lt;br /&gt; margin: -4px 4px 4px -4px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Quindi nella pagina html ci dovrà essere un div con id divimg ed all&#39; interno il tag img. In questo modo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&amp;lt;div id=&quot;divimg&quot; style=&quot;width: 55px; height: 55px;&quot;&amp;gt;&lt;br /&gt;&amp;lt;img src=&quot;./al.jpg&quot;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Usando questa tecnica si può separare l&#39; immagine dall&#39; effetto, e quindi evitare di applicare ad ogni immagine l&#39; ombra.&lt;br /&gt;L&#39; esempio completo è scaricabile da &lt;a href=&quot;http://www.fileden.com/files/2006/12/4/465575/CssShadows.rar&quot;&gt;qui&lt;/a&gt;</description><link>http://styledimension.blogspot.com/2007/03/ombre-in-css.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-5713262178686320441</guid><pubDate>Sun, 25 Feb 2007 00:47:00 +0000</pubDate><atom:updated>2007-02-25T01:06:47.506+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">css</category><title>Trasparenza con i css</title><description>Spesso per creare degli effetti di trasparenza, si usa sovrapporre dei livelli, dove ognuno dei quali ha un immagine di sfondo creata appositamente con un effetto di trasparenza. Naturalmente, queste immagini si vanno a sommare a tutte le altre già presenti nella pagina, gravando ulteriormente su di essa.&lt;br /&gt;In questo post si vedrà come si possa realizzare una trasparenza utilizzando esclusivamente i css, senza utilizzare alcuna immagine.&lt;br /&gt;Il seguente frammento css verrà interpretato correttamente sia dall&#39; explorer che dal firefox:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;&lt;br /&gt;.opacity50{&lt;br /&gt;filter:alpha(opacity=50);&lt;br /&gt;-moz-opacity:.50;&lt;br /&gt;opacity:.50;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;la prima dichiarazione verrà utilizzata dall&#39; explorer e ignorata dal firefox, che invece interpreterà le successive due dichiarazioni.&lt;br /&gt;Da notare che la proprietà filter accetta valori da 0 a 100, dove quest&#39; ultimo rappresenta il colore di sfondo del livello ( o l&#39; immagine di sfondo del livello se presente ) reale senza alcuna trasparenza, mentre le altre due proprietà accettano valori tra 0.01 e 0.99.</description><link>http://styledimension.blogspot.com/2007/02/trasparenza-con-i-css.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-7632107142844555980</guid><pubDate>Fri, 23 Feb 2007 12:18:00 +0000</pubDate><atom:updated>2007-02-23T23:13:05.667+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">css</category><title>Soluzione al problema del box model</title><description>Quando esplicitiamo la larghezza di un elemento, se facciamo riferimento alle specifiche css, il valore  indica l&#39; area utile dell&#39; elemento, escluso i bordi ed il padding. Purtroppo l&#39; internet explorer, a differenza del firefox, non ha un corretto doctype e questo interpreterà tale valore erroneamente come la larghezza totale dell&#39; elemento, quindi con bordi e padding compresi.&lt;br /&gt;Esistono vari modi per poter superare questo problema. Un dimensionamento coerente può essere ottenuto in uno dei due modi seguenti:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Evitando di specificare le larghezze degli elementi,  bordi e padding&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Usando il &lt;a href=&quot;http://css-discuss.incutio.com/?page=BoxModelHack&quot;&gt;box model hack&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Naturalmente la prima soluzione non è sempre applicabile.&lt;br /&gt;La seconda soluzione può essere realizzata prendondo in considerazione l&#39; utilizzo della keyword &quot;!important&quot;.&lt;br /&gt;Consideriamo il seguente esempio:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;div{&lt;br /&gt;width: 300px;&lt;br /&gt;width: 400px;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;In  questo modo in qualsiasi browser la larghezza del div sarà 400px, perchè è l&#39; ultima larghezza specificata, quindi ci sarà il problema accennato sopra; il firefox interpreterà 400px come larghezza dell&#39; area utile, mentre l&#39; explorer, intenderà con 400px, l&#39; area dell&#39; elemento compreso di bordi, margini e padding.&lt;br /&gt;Con l&#39; uso della keyword &quot;!important&quot;, si può dare priorità ad una dichiarazione css.&lt;br /&gt;Questo si può sfruttare per risolvere il problema del box model descritto.&lt;br /&gt;Supponiamo di voler creare un div di 400px con 50px di padding ai lati, e che questo sia interpretato coerentemente in tutti i browser ( internet explorer compreso ).&lt;br /&gt;L&#39; utilità di &quot;!important&quot; sta nel fatto che questa keyword è interpretata da firefox  , ma non da explorer, quindi se modifichiamo l&#39; esempio di sopra nel seguente modo:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;div{&lt;br /&gt;width: 300px !important;&lt;br /&gt;width: 400px;&lt;br /&gt;padding: 0 50px;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;otterremo in entrambi i casi di 400px.&lt;br /&gt;Questa soluzione andrebbe bene nel caso della versione 5.x di explorer, ma affinchè vada bene anche per la versione 6, si deve ulteriormente modificare, in quando dalla versione 6 l&#39; explorer rispetta le specifiche css sulle dimensioni.&lt;br /&gt;Quindi per non avere una larghezza totale di 500px nel explorer 6, bisogna usare un altro piccolo hack.&lt;br /&gt;Quest&#39; ultimo consiste nel cercare di far vedere la seconda dichiarazione alla versione 5.x dell&#39; explorer, nascondendola invece alla versione 6. Per far questo è necessario mettere un commento vuoto prima dei &quot;:&quot; nella seconda dichiarazione:&lt;br /&gt;&lt;br /&gt;&lt;p style=&quot;border: 1px dashed white; background-color: #99bb55; padding-left: 10px; color: white;&quot;&gt;&lt;br /&gt;div{&lt;br /&gt;width: 300px !important;&lt;br /&gt;width /**/: 400px;&lt;br /&gt;padding: 0 50px;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Questa tecnica si può usare anche per l&#39; altezza ed è un metodo abbastanza semplice per ottenere un dimensionamento coerente con tutti i browser.</description><link>http://styledimension.blogspot.com/2007/02/soluzione-al-problema-del-box-model.html</link><author>noreply@blogger.com (Ska)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6763137151780788364.post-874890913049228262</guid><pubDate>Wed, 21 Feb 2007 12:49:00 +0000</pubDate><atom:updated>2008-12-10T00:26:39.492+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">css</category><title>Box model</title><description>Ogni elemento in una pagina html, oltre che l&#39; area utile, può avere bordi, margini e padding. Con la seguente figura si può vedere cosa si intende:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYWXb-tK388KSZv3LV0PKl5Ie8VmUa7BZcUR95IFOH-eYxGMHklynbM6WX3jgFjNgYPDsH6F1aNC0TsfR7UuNKOIu9do06n99sW6V5mBKwtRXhHuCvu97zHQVkhtqkMtZoNKVUvrw6trg/s1600-h/box_model.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYWXb-tK388KSZv3LV0PKl5Ie8VmUa7BZcUR95IFOH-eYxGMHklynbM6WX3jgFjNgYPDsH6F1aNC0TsfR7UuNKOIu9do06n99sW6V5mBKwtRXhHuCvu97zHQVkhtqkMtZoNKVUvrw6trg/s400/box_model.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5034713367452875026&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il box è quello indicato dal bordo con la scritta rossa, che è anche il border. La distanza tra il suo bordo e il suo contenitore (con bordo nero in grassetto, quello più esterno) è il margin. Il bordo nero solido è il border. Infine, la zona tra l&#39;area del contenuto ed il bordo ( scritta in rosso ) rappesenta il padding.&lt;br /&gt;Gli elementi CSS2 presentano due livelli primari di layout:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;margin-top: 0px;margin-bottom: 0px;&quot;&gt;&lt;br /&gt;&lt;li&gt;Elementi a livello di blocco&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Elementi a livello in-line&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Un elemento css a livello di blocco genera un riquadro rettangolare ( riquadro dell&#39; elemento ) che descrive la quantità di spazio occupata da un elemento. Per questo tipo di elemento lo sfondo si estende fino al limite esterno del bordo e le proprietà width e height si riferiscono alla sola larghezza del contenuto; padding, bordi e margini si aggiungono a tale valore.&lt;br /&gt;Per quanto riguarda gli elementi inline, essi hanno una line-height, ovvero l&#39;altezza della riga che si può valutare facendo riferimento alla seguente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ3cHzbtA39hnofLv1aRyjZ6RpgBw7IiVxpu0790iurk4VPOIy0PLz1zrLl6lXCNTCgtoa-aRzp_v5vNWpY_h5HKe0rDeyyBPX0Y2WLn5ki3vD4sxGxF6khihCNkqA0RiIAIpeQlC1GfI/s1600-h/css2_0731.gif&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ3cHzbtA39hnofLv1aRyjZ6RpgBw7IiVxpu0790iurk4VPOIy0PLz1zrLl6lXCNTCgtoa-aRzp_v5vNWpY_h5HKe0rDeyyBPX0Y2WLn5ki3vD4sxGxF6khihCNkqA0RiIAIpeQlC1GfI/s400/css2_0731.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5034806044257188130&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Come si vede è presente l&#39;area del contenuto, rappresentata dalla striscia in bianco, ed il riquadro inline rappresentato dalle striscette in griggio sopra e sotto l&#39; area del contenuto.</description><link>http://styledimension.blogspot.com/2007/02/box-model.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYWXb-tK388KSZv3LV0PKl5Ie8VmUa7BZcUR95IFOH-eYxGMHklynbM6WX3jgFjNgYPDsH6F1aNC0TsfR7UuNKOIu9do06n99sW6V5mBKwtRXhHuCvu97zHQVkhtqkMtZoNKVUvrw6trg/s72-c/box_model.gif" height="72" width="72"/><thr:total>0</thr:total></item></channel></rss>