<?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>diploD &#187; ajax</title>
	<atom:link href="http://www.diplod.it/tag/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diplod.it</link>
	<description>by Davide Del Monte</description>
	<lastBuildDate>Fri, 13 Feb 2015 14:26:10 +0000</lastBuildDate>
	<language>it-IT</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Ajax con jquery: la chiamata perfetta. Locale e cross domain, SEO friendly.</title>
		<link>http://www.diplod.it/2014/07/18/ajax-con-jquery-la-chiamata-perfetta-locale-e-cross-domain-seo-friendly/</link>
		<comments>http://www.diplod.it/2014/07/18/ajax-con-jquery-la-chiamata-perfetta-locale-e-cross-domain-seo-friendly/#comments</comments>
		<pubDate>Fri, 18 Jul 2014 13:57:22 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[Ajax e Javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[chiamata]]></category>
		<category><![CDATA[cross domain]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonp]]></category>
		<category><![CDATA[perfetta]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=1452</guid>
		<description><![CDATA[I primi esempi di codice per fare una chiamata ajax erano brutti. Punto. C'era l'inevitabile if per gestire i diversi browser e qualche oggetto in più da maneggiare. Ora, grazie a jquery e a browser più umani, si riesce a gestire una chiamata ajax molto più agevolmente. Restano però alcuni aspetti critici: tra cui le chiamate cross domain e gli url SEO friendly.
Esiste quindi la chiamata perfetta? Si, ma come tutte le cose perfette, è sicuramente perfettibile.]]></description>
				<content:encoded><![CDATA[<p>I primi esempi di codice per fare una chiamata <strong>ajax</strong> erano brutti. Punto. C&#8217;era l&#8217;inevitabile if per gestire i diversi browser e qualche oggetto in più da maneggiare. Ora, grazie a <strong>jquery</strong> e a browser più umani, si riesce a gestire una chiamata ajax molto più agevolmente. Restano però alcuni aspetti critici: tra cui le chiamate <strong>cross domain</strong> e gli url <strong>SEO friendly</strong>.</p>
<p>Esiste quindi la <strong>chiamata perfetta</strong>? Si, ma come tutte le cose perfette, è sicuramente perfettibile.</p>
<p>Nell&#8217;esempio che segue c&#8217;è una pagina con due pulsanti: il primo esegue una chiamata ajax per caricare una pagina locale, il secondo esegue una chiamata cross-domain (nello specifico a Facebook) attraverso JSONP.</p>
<p>Sono arrivato all&#8217;esempio finale partendo da questi tre utilissimi spunti:</p>
<ul>
<li><a href="http://jquery-howto.blogspot.it/2013/09/jquery-cross-domain-ajax-request.html" target="_blank">4 jQuery cross domain ajax request methods</a></li>
<li><a href="http://kyleschaeffer.com/development/the-perfect-jquery-ajax-request/" target="_blank">The perfect jquery ajax request</a></li>
<li><a href="http://moz.com/blog/create-crawlable-link-friendly-ajax-websites-using-pushstate" target="_blank">Create crawlable, link-friendly ajax websites using pushState()</a></li>
</ul>
<p>Ed ecco il <a title="ajax chiamata perfetta" href="http://lab.diplod.it/ajaxcall/" target="_blank"><strong>risultato finale in funzione</strong></a>.</p>
<p><span id="more-1452"></span></p>
<p>Il codice html della pagina è il seguente:</p>
<p><code>&lt;div id="container"&gt;<br />
&lt;h1&gt;Esempi Chiamate Ajax con jQuery&lt;/h1&gt;<br />
&lt;a class="button" id="call" href="test.html" &gt;Esegui chiamata normale&lt;/a&gt;<br />
&lt;a class="button" id="call-cross" href="facebook.html"&gt;Esegui chiamata Cross Domain&lt;/a&gt;<br />
&lt;div id="ajax-panel"&gt;Questo div contiente il risultato della chiamata&lt;/div&gt;<br />
&lt;/div&gt;</code></p>
<p>Il codice javascript della chiamata locale è il seguente: di fatto viene usato il metodo $.ajax() per fare la chiamata. Nel <em>beforeSend</em> &#8211; codice eseguito prima di fare la chiamata vera e propria &#8211; viene eseguita una funzione che carica una immagine di cortesia; nel <em>success</em> &#8211; codice eseguito in caso di chiamata con esito positivo &#8211; viene elaborata la risposta, cambiando il contenuto di un div della pagina; nell&#8217;<em>error</em> &#8211; codice eseguito in caso di errore &#8211; viene mostrato un messaggio all&#8217;interno dello stesso div.</p>
<p><code>$("#call").click(function (e) {<br />
<strong>//SEO friendly</strong><br />
url = $(this).attr('href');<br />
<strong>//aggiorno l'indirizzo sulla barra del browser ed evito che si apra il link</strong><br />
history.pushState({}, '', url);<br />
e.preventDefault();<br />
<strong>//chiamata ajax</strong><br />
$.ajax({<br />
url: 'test.html',<br />
beforeSend: function () {<br />
<strong>// qui mettiamo un'immagine di caricamento: appare solo se dobbiamo caricare qualcosa di pesante</strong><br />
$('#ajax-panel').html('&lt;div class="loading"&gt;&lt;img src="http://lab.diplod.it/ajaxcall/images/ajax-loader.gif" alt="Loading..." /&gt;&lt;/div&gt;');<br />
},<br />
success: function (data) {<br />
<strong>// richiesta riuscita</strong><br />
$('#ajax-panel').empty();<br />
$('#ajax-panel').html(data);<br />
},<br />
error: function () {<br />
<strong>// richiesta fallita</strong><br />
$('#ajax-panel').html('&lt;p class="error"&gt;&lt;strong&gt;Oops!&lt;/strong&gt; Qualcosa &amp;egrave; andato storto.&lt;/p&gt;');<br />
}<br />
});<br />
</code><br />
Il codice della chiamata <strong>cross domain</strong> differisce di poco da quello precedente, se non per l&#8217;utilizzo di JSON<strong>P</strong> (attenzione: non JSON) come dataType.</p>
<p><code>$('#call-cross').click(function (e) {<br />
<strong>//SEO friendly</strong><br />
url = $(this).attr('href');<br />
<strong>//aggiorno l'indirizzo sulla barra del browser ed evito che si apra il link</strong><br />
history.pushState({}, '', url);<br />
e.preventDefault();<br />
<strong>//chiamata ajax</strong><br />
$.ajax({<br />
type: "POST",<br />
url: "https://graph.facebook.com/emergency.ong",<br />
dataType: "jsonp",<br />
beforeSend: function () {<br />
<strong>// qui mettiamo un'immagine di caricamento: appare solo se dobbiamo caricare qualcosa di pesante</strong><br />
console.log('loading..'); //scrivo qualcosa in console: si può omettere<br />
$('#ajax-panel').html('&lt;div class="loading"&gt;&lt;img src="http://lab.diplod.it/ajaxcall/images/ajax-loader.gif" alt="Loading..." /&gt;&lt;/div&gt;');<br />
},<br />
success: function (data) {<br />
<strong>// richiesta riuscita</strong><br />
console.log(data); //scrivo il risultato in console: si può omettere<br />
var obj = $.parseJSON(JSON.stringify(data));<br />
$('#ajax-panel').html('&lt;p&gt;Tutto ok&lt;/p&gt;&lt;p&gt;Descrizione dell\'oggetto JSON restituito: ' + obj.about + '&lt;/p&gt;');<br />
},<br />
error: function () {<br />
<strong>// richiesta fallita</strong><br />
$('#ajax-panel').html('&lt;p class="error"&gt;&lt;strong&gt;Oops!&lt;/strong&gt; Qualcosa &amp;egrave; andato storto.&lt;/p&gt;');<br />
}<br />
});<br />
});</code></p>
<p><strong>Vuoi provare l&#8217;esempio completo in azione e lavorarci su?</strong> <a title="chiamata ajax perfetta" href="http://www.diplod.it/wp-content/uploads/2014/07/AjaxCall.zip">Scarica tutti i sorgenti in uno zip</a> oppure <a title="chiamata ajax perfetta" href="http://lab.diplod.it/ajaxcall/" target="_blank">guardalo direttamente in funzione</a>.<a href="http://www.diplod.it/wp-content/uploads/2014/07/AjaxCall.zip"><br />
</a></p>
<p>Commenti e suggerimenti sono ben accetti. ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2014/07/18/ajax-con-jquery-la-chiamata-perfetta-locale-e-cross-domain-seo-friendly/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Componenti Ajax e UI Toolkit per applicazioni web RIA</title>
		<link>http://www.diplod.it/2010/07/19/componenti-ajax-e-ui-toolkit-per-applicazioni-web-ria/</link>
		<comments>http://www.diplod.it/2010/07/19/componenti-ajax-e-ui-toolkit-per-applicazioni-web-ria/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 06:42:17 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[Ajax e Javascript]]></category>
		<category><![CDATA[Applicazioni Web]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[toolkit]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=1087</guid>
		<description><![CDATA[Volete stupire con componenti dinamici pronti all'uso? Creare applicazioni web avanzate non è poi così laborioso, oggi si trovano un sacco di risorse in rete. Ecco una breve panoramica.]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.diplod.it/wp-content/uploads/2010/07/toolkit.png"><img class="size-full wp-image-1130 aligncenter" title="toolkit" src="http://www.diplod.it/wp-content/uploads/2010/07/toolkit.png" alt="" width="415" height="212" /></a></p>
<p><strong>Volete stupire con componenti dinamici pronti all&#8217;uso?</strong> Creare <strong>applicazioni web</strong> avanzate non è poi così laborioso, oggi si trovano un sacco di risorse in rete. Una di queste è il<strong> <a title="DHTMLX" href="http://www.dhtmlx.com/" target="_blank">DHTMLX UI Toolkit</a></strong>, una serie di <strong>librerie javascript</strong> corredate da tantissimi esempi. La documentazione è ciò che fa la differenza: gli script non documentati e con pochi esempi sono quasi inutilizzabili, se non perdendo un sacco di ore per studiarseli. UI Toolkit viene distribuito in uno zip con diverse pagine di pratiche demo.</p>
<p>Per chi lavora in <strong>ambiente .NET</strong> molto interessante è questo <a title="Ajax Control Toolkit" href="http://ajaxcontroltoolkit.codeplex.com/" target="_blank"><strong>Ajax Control Toolkit</strong></a>, un insieme di controlli utilizzabili direttamente in <strong>Visual Studio</strong> con il drag and drop, per costruire form e applicazioni accattivanti. Da Codeplex si possono scaricare anche i sorgenti, corredati da diversi esempi. In <a title="Ajax control toolkit - esempi" href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/" target="_blank">questa pagina</a> si può avere una panoramica di tutte le funzionalità disponibili, sono davvero parecchie:</p>
<p><span id="more-1087"></span></p>
<ul>
<li><a id="ctl00_SamplesLinks_ctl01_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Accordion/Accordion.aspx">Accordion</a></li>
<li><a id="ctl00_SamplesLinks_ctl02_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/AlwaysVisibleControl/AlwaysVisibleControl.aspx">AlwaysVisibleControl</a></li>
<li><a id="ctl00_SamplesLinks_ctl03_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Animation/Animation.aspx">Animation</a></li>
<li><a id="ctl00_SamplesLinks_ctl04_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/AsyncFileUpload/AsyncFileUpload.aspx">AsyncFileUpload</a></li>
<li><a id="ctl00_SamplesLinks_ctl05_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/AutoComplete/AutoComplete.aspx">AutoComplete</a></li>
<li><a id="ctl00_SamplesLinks_ctl06_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Calendar/Calendar.aspx">Calendar</a></li>
<li><a id="ctl00_SamplesLinks_ctl07_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/CascadingDropDown/CascadingDropDown.aspx">CascadingDropDown</a></li>
<li><a id="ctl00_SamplesLinks_ctl08_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/CollapsiblePanel/CollapsiblePanel.aspx">CollapsiblePanel</a></li>
<li><a id="ctl00_SamplesLinks_ctl09_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ColorPicker/ColorPicker.aspx">ColorPicker</a></li>
<li><a id="ctl00_SamplesLinks_ctl10_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ComboBox/ComboBox.aspx">ComboBox</a></li>
<li><a id="ctl00_SamplesLinks_ctl11_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ConfirmButton/ConfirmButton.aspx">ConfirmButton</a></li>
<li><a id="ctl00_SamplesLinks_ctl12_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/DragPanel/DragPanel.aspx">DragPanel</a></li>
<li><a id="ctl00_SamplesLinks_ctl13_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/DropDown/DropDown.aspx">DropDown</a></li>
<li><a id="ctl00_SamplesLinks_ctl14_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/DropShadow/DropShadow.aspx">DropShadow</a></li>
<li><a id="ctl00_SamplesLinks_ctl15_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/DynamicPopulate/DynamicPopulate.aspx">DynamicPopulate</a></li>
<li><a id="ctl00_SamplesLinks_ctl16_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/FilteredTextBox/FilteredTextBox.aspx">FilteredTextBox</a></li>
<li><a id="ctl00_SamplesLinks_ctl17_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/HoverMenu/HoverMenu.aspx">HoverMenu</a></li>
<li><a id="ctl00_SamplesLinks_ctl18_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/HTMLEditor/HTMLEditor.aspx">HTMLEditor</a></li>
<li><a id="ctl00_SamplesLinks_ctl19_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ListSearch/ListSearch.aspx">ListSearch</a></li>
<li><a id="ctl00_SamplesLinks_ctl20_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/MaskedEdit/MaskedEdit.aspx">MaskedEdit</a></li>
<li><a id="ctl00_SamplesLinks_ctl21_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ModalPopup/ModalPopup.aspx">ModalPopup</a></li>
<li><a id="ctl00_SamplesLinks_ctl22_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/MultiHandleSlider/MultiHandleSlider.aspx">MultiHandleSlider</a></li>
<li><a id="ctl00_SamplesLinks_ctl23_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/MutuallyExclusiveCheckBox/MutuallyExclusiveCheckBox.aspx">MutuallyExclusiveCheckBox</a></li>
<li><a id="ctl00_SamplesLinks_ctl24_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/NoBot/NoBot.aspx">NoBot</a></li>
<li><a id="ctl00_SamplesLinks_ctl25_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/NumericUpDown/NumericUpDown.aspx">NumericUpDown</a></li>
<li><a id="ctl00_SamplesLinks_ctl26_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/PagingBulletedList/PagingBulletedList.aspx">PagingBulletedList</a></li>
<li><a id="ctl00_SamplesLinks_ctl27_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/PasswordStrength/PasswordStrength.aspx">PasswordStrength</a></li>
<li><a id="ctl00_SamplesLinks_ctl28_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/PopupControl/PopupControl.aspx">PopupControl</a></li>
<li><a id="ctl00_SamplesLinks_ctl29_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Rating/Rating.aspx">Rating</a></li>
<li><a id="ctl00_SamplesLinks_ctl30_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ReorderList/ReorderList.aspx">ReorderList</a></li>
<li><a id="ctl00_SamplesLinks_ctl31_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ResizableControl/ResizableControl.aspx">ResizableControl</a></li>
<li><a id="ctl00_SamplesLinks_ctl32_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/RoundedCorners/RoundedCorners.aspx">RoundedCorners</a></li>
<li><a id="ctl00_SamplesLinks_ctl33_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Seadragon/Seadragon.aspx">Seadragon</a></li>
<li><a id="ctl00_SamplesLinks_ctl34_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Slider/Slider.aspx">Slider</a></li>
<li><a id="ctl00_SamplesLinks_ctl35_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/SlideShow/SlideShow.aspx">SlideShow</a></li>
<li><a id="ctl00_SamplesLinks_ctl36_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/Tabs/Tabs.aspx">Tabs</a></li>
<li><a id="ctl00_SamplesLinks_ctl37_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/TextBoxWatermark/TextBoxWatermark.aspx">TextBoxWatermark</a></li>
<li><a id="ctl00_SamplesLinks_ctl38_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ToggleButton/ToggleButton.aspx">ToggleButton</a></li>
<li><a id="ctl00_SamplesLinks_ctl39_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/UpdatePanelAnimation/UpdatePanelAnimation.aspx">UpdatePanelAnimation</a></li>
<li><a id="ctl00_SamplesLinks_ctl40_SamplesLink" href="http://www.asp.net/ajax/ajaxcontroltoolkit/Samples/ValidatorCallout/ValidatorCallout.aspx">ValidatorCallout</a></li>
</ul>
<p>Per chi vuole essere indipendente da javascript e piattaforma tecnologica, esiste questo <strong><a title="Vaddin Toolkit" href="http://vaadin.com/home" target="_blank">Vaadin</a></strong>, tutto basato su <strong>Java</strong>. Quest&#8217;ultimo molto più simile ai più noti framewok come <a title="Mootools" href="http://mootools.net/" target="_blank">Mootools</a> o <a title="JQuery" href="http://jquery.com/" target="_blank">JQuery</a>: dispone di diversi componenti elementari che opportunamente combinati tra loro danno vita ad applicazioni web avanzate.</p>
<p>Da segnalare infine questo <a title="iwebkit" href="http://iwebkit.net/" target="_blank">iWebKit</a>, utile per chi vuole cimentarsi nella realizzazione di siti e applicazioni concepite specificatamente per iPhone.</p>
<p>Risorse di questo tipo ne esistono davvero a bizzeffe, ma <strong>non è facile distinguere</strong> quelle che sono effettivamente utilizzabili <strong>out of the box</strong> da quelle che invece necessitano di altro e magari nascondono limiti tali da sconsigliarne l&#8217;utilizzo. Personalmente ho utilizzato in un ambiente di produzione l&#8217;UI Toolkit di DHTMLX e posso confermare che si tratta di librerie pronte all&#8217;uso, davvero comode e funzionali. Ho intenzione di provare a breve l&#8217;Ajax Control Toolkit per .NET e vi farò sapere le mie considerazioni. <strong>Mi piacerebbe ovviamente sentire le vostre e capire se esistono altri strumenti oltre a quelli citati, che magari avete utilizzato direttamente</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2010/07/19/componenti-ajax-e-ui-toolkit-per-applicazioni-web-ria/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Un esempio di applicazione ajax ottimizzata per dispositivi mobili: xml e javascript.</title>
		<link>http://www.diplod.it/2010/04/22/un-esempio-di-applicazione-ajax-ottimizzata-per-dispositivi-mobili-xml-e-javascript/</link>
		<comments>http://www.diplod.it/2010/04/22/un-esempio-di-applicazione-ajax-ottimizzata-per-dispositivi-mobili-xml-e-javascript/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 17:43:48 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[Ajax e Javascript]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[cellulari]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[web20]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=1066</guid>
		<description><![CDATA[Ajax è sempre cool, se poi lo affianchi a iPhone &#038; Co. è ancora più cool. Perchè non vedere un esempio di applicazione web fruibile da cellulare che va a interrogare i dati contenuti in un file xml? Pensiamo ai webservices, ormai l'xml è un po' ovunque. Dobbiamo solo sfruttarlo.]]></description>
				<content:encoded><![CDATA[<p><strong><a title="ajax - wikipedia" href="http://it.wikipedia.org/wiki/AJAX" target="_blank">Ajax </a></strong>è sempre <strong>cool</strong>, se poi lo affianchi a iPhone &amp; Co. è ancora più cool. Perchè non vedere un esempio di applicazione web fruibile da cellulare che va a interrogare i dati contenuti in un file xml? Pensiamo ai <a title="Webservice - wikipedia" href="http://it.wikipedia.org/wiki/Web_service" target="_blank"><strong>webservices</strong></a>, ormai l&#8217;xml è un po&#8217; ovunque. Dobbiamo solo sfruttarlo.</p>
<p>Alcune utili consigli per chi sviluppa applicazioni ajax destinate ad essere fruibili attraverso dispositivi mobili:</p>
<ul>
<li><strong>Blackberry</strong>: il browser deve essere abilitato per usare javascript. Inoltre, se si fa largo uso dello script lato client, è bene evitare di spuntare tra le opzioni il flag &#8220;Termina script in esecuzione lenti&#8221;, un semplice <a title="bubble sort - wikipedia" href="http://it.wikipedia.org/wiki/Bubble_sort" target="_blank">Bubble Sort</a> lo manderebbe in tilt.</li>
<li><strong>Nokia </strong>(symbian): nel browser standard il metodo <em>open(&#8220;GET&#8221;,&#8221;xml/test2.xml&#8221;,true)</em> funziona solo in modalità asincrona, ovvero con l&#8217;ultimo parametro settato a true; scaricando il browser <a title="Opera Mini" href="http://www.opera.com/mobile/" target="_blank">Opera Mini</a> invece non ci sono problemi in entrambi i casi: sincrono/asincrono.</li>
<li><strong>iPhone</strong>: che dire.. finora nessun problem riscontrato: browser e processore appartengono a una categoria superiore.</li>
</ul>
<p>Purtroppo non ho ancora avuto modo di fare test su dispositivi con <a title="Android" href="http://www.android.com/" target="_blank">Android</a>..</p>
<p>Ma veniamo al dunque.. Tutto prende il via dagli <a title="W3C - ajax examples" href="http://www.w3schools.com/ajax/ajax_examples.asp" target="_blank">esempi sul sito W3C</a>, utilissimi per fare pratica.</p>
<p>L&#8217;obiettivo è realizzare una applicazione che va a interrogare un file xml, riportante i dati di produzione (magari estratti direttamente dal gestionale aziendale), visualizzandoli in maniera ottimizzata per schermi di modeste dimensioni.</p>
<p>L&#8217;esempio con il risultato finale è <a title="Esempio XML Ajax" href="http://lab.diplod.it/xml2" target="_blank">visibile qui</a>.</p>
<p>Questa è la struttura dela file XML:<br />
<code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;db&gt;<br />
&lt;item&gt;<br />
&lt;period&gt;04.2010&lt;/period&gt; &lt;!-- Periodo: mese o giorno --&gt;<br />
&lt;logunit id="0010"&gt;Italy Milan&lt;/logunit&gt; &lt;!-- Divisione di produzione--&gt;<br />
&lt;delivered matcode="000123"&gt;268&lt;/delivered&gt; &lt;!-- Quantita' spedita --&gt;<br />
&lt;finished matcode="100123"&gt;265&lt;/finished&gt; &lt;!-- Quantita' versata --&gt;<br />
&lt;description&gt;Product One&lt;/description&gt; &lt;!-- Descrizione codice materiale  --&gt;<br />
&lt;update&gt;15.04.2010 - 16:43&lt;/update&gt; &lt;!-- Ultimo aggiornamento --&gt;<br />
&lt;/item&gt;<br />
&lt;/db&gt;<br />
</code><br />
<span id="more-1066"></span>Supponiamo di voler offrire all&#8217;utente un menù per selezionare la divisione logistica su cui fare l&#8217;analisi e filtrare così i dati relativi alla singola divisione raggruppati in righe in base agli intervalli temporali, cliccando sulla singola riga è poi possibile vedere il dettaglio.</p>
<p>Ecco il codice della pagina web, con il suo javascript:<br />
<code>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Mobile Web Access&lt;/title&gt;<br />
&lt;script type="text/javascript"&gt;<br />
var xmlDoc;<br />
var x; //array dove memorizzo la risposta xml<br />
//inizio chiamata<br />
if (window.XMLHttpRequest)<br />
{<br />
xhttp=new XMLHttpRequest();<br />
if (xhttp.overrideMimeType) {<br />
xhttp.overrideMimeType('text/xml');<br />
}<br />
}<br />
else // Internet Explorer 5/6<br />
{<br />
xhttp=new ActiveXObject("Microsoft.XMLHTTP");<br />
}<br />
xhttp.onreadystatechange = alertContents; //gestione eventuali errori<br />
xhttp.open("GET","xml/test2.xml",true); //chiamata asincrona<br />
xhttp.send("");<br />
// Questo metodo viene eseguito in modo asincrono quando arriva la risposta dal server<br />
function alertContents() {<br />
if (xhttp.readyState == 4) {<br />
if (xhttp.status == 200) {<br />
processResponse(); //gestione risposta<br />
}<br />
else {<br />
document.write('&lt;small&gt;There was a problem with the request, sorry. Try later or contact your system administrator..&lt;/small&gt;');<br />
}<br />
}<br />
}<br />
function processResponse() {<br />
xmlDoc=xhttp.responseXML;<br />
x=xmlDoc.getElementsByTagName("item");<br />
}<br />
//mostra i dati nel div in alto<br />
function show(i) {<br />
logunit=(x[i].getElementsByTagName("logunit")[0].childNodes[0].nodeValue);<br />
logunitID=(x[i].getElementsByTagName("logunit")[0].getAttribute("id"));<br />
period=(x[i].getElementsByTagName("period")[0].childNodes[0].nodeValue);<br />
description=(x[i].getElementsByTagName("description")[0].childNodes[0].nodeValue);<br />
delivered=(x[i].getElementsByTagName("delivered")[0].childNodes[0].nodeValue);<br />
deliveredCode=(x[i].getElementsByTagName("delivered")[0].getAttribute("code"));<br />
finished=(x[i].getElementsByTagName("finished")[0].childNodes[0].nodeValue);<br />
finishedCode=(x[i].getElementsByTagName("finished")[0].getAttribute("code"));<br />
update=(x[i].getElementsByTagName("update")[0].childNodes[0].nodeValue);<br />
txt="&lt;strong&gt;Logistic Unit&lt;/strong&gt;: "+logunitID+" - "+logunit+"&lt;br /&gt;&lt;strong&gt;Period&lt;/strong&gt;: "+period+"&lt;br /&gt;&lt;strong&gt;Description&lt;/strong&gt;: "+description+"&lt;br /&gt;&lt;img style='float:left; margin-right: 2px;' src='icon.png' alt='icon'/&gt;&lt;strong&gt;Delivered&lt;/strong&gt;: "+delivered+"&lt;br /&gt;&lt;strong&gt;Finished&lt;/strong&gt;: "+finished+"&lt;br /&gt;&lt;div style='border: 1px dotted #fff; padding: 2px; background: #f9f9f9; color: #666;'&gt;&lt;small&gt;&lt;em&gt;Last update: "+update+"&lt;/em&gt;&lt;/small&gt;&lt;br/&gt;&lt;small&gt;&lt;a href='#item"+i+"'&gt;Go Down To List..&lt;/a&gt; | &lt;a href='#show' onclick='show(" + (i-1) + ")'&gt;Prev..&lt;/a&gt; | &lt;a href='#show' onclick='show(" + (i+1) + ")'&gt;Next..&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;"  ;<br />
document.getElementById("show").innerHTML=txt;<br />
}<br />
//crea tabella coi record relativi alla singola divisione<br />
function createTable(t) {<br />
document.getElementById("show").innerHTML="&lt;em&gt;"+t+": click on a table row to display the full production information.&lt;/em&gt;";<br />
txt="&lt;table style='border: 2px solid #ccc; width: 100%;'&gt;";<br />
altStyle=0;<br />
for (var i=0;i&lt;x.length;i++)<br />
{<br />
if (x[i].getElementsByTagName("logunit")[0].getAttribute("id")==t) {<br />
altStyle++;<br />
if (altStyle % 2 == 0) { txt=txt+"&lt;tr style='background: #e3efff;' onclick='show(" + i + ")'&gt;"; }<br />
else { txt=txt+"&lt;tr style='border-bottom: 1px dotted #ccc;' onclick='show(" + i + ")'&gt;"; }<br />
txt=txt+"&lt;td id='item"+i+"'&gt;&lt;img src='cal.png' alt='ico'/&gt;&lt;a href='#show'&gt;";<br />
txt=txt+(x[i].getElementsByTagName("period")[0].childNodes[0].nodeValue);<br />
txt=txt+"&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;img src='car.png' alt='ico'/&gt;&lt;a href='#show'&gt;";<br />
txt=txt+(x[i].getElementsByTagName("description")[0].childNodes[0].nodeValue);<br />
txt=txt+"&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;";<br />
}<br />
}<br />
txt=txt+"&lt;/table&gt;";<br />
document.getElementById("table-content").innerHTML=txt;<br />
}<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;img src='mobile-logo.gif' alt='logo' /&gt;&lt;br/&gt;<br />
&lt;div id='show' style='background: #e3efff; padding: 3px; margin: 3px 0; border: 2px solid #ccc;'&gt;&lt;em&gt;Select Logistic Unit then click on a table row to display the full production information.&lt;/em&gt;&lt;/div&gt;<br />
&lt;!--Per aggiungere una divisione, modificare questo menu --&gt;<br />
&lt;img src='industry.png' alt='ico'/&gt;&lt;a href='#show' onclick='createTable("0010")'&gt;Italy Milan&lt;/a&gt; | &lt;img src='industry.png' alt='ico'/&gt;&lt;a href='#show' onclick='createTable("0020")'&gt;Italy Rome&lt;/a&gt; | &lt;img src='industry.png' alt='ico'/&gt;&lt;a href='#show' onclick='createTable("0030")'&gt;USA&lt;/a&gt; | &lt;img src='industry.png' alt='ico'/&gt;&lt;a href='#show' onclick='createTable("0040")'&gt;Germany&lt;/a&gt; | &lt;img src='industry.png' alt='ico'/&gt;&lt;a href='#show' onclick='createTable("0050")'&gt;China&lt;/a&gt; | &lt;img src='industry.png' alt='ico'/&gt;&lt;a href='#show' onclick='createTable("0060")'&gt;Brasil&lt;/a&gt;<br />
&lt;!-- fine menu selezione divisione --&gt;<br />
&lt;div id='table-content'&gt;&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
</code></p>
<p>Il codice è interamente commentato, e più che descriverlo a parole vale la pena scorrerlo e leggere i commenti. <strong>Se vuoi scaricare l&#8217;esempio completo, con sorgenti e immagini: </strong><a title="xml ajax - esempio" href="http://www.diplod.it/wp-content/uploads/2010/04/xml-demo.zip"><strong>ecco lo zip</strong></a>.</p>
<p>La scelta di incorporare css e javascript all&#8217;interno della stessa singola pagina è voluta, per ottimizzare il caricamento da parte di dispositivi mobili. Certo questa è solo una base di partenza, dalla quale si potrebbero sviluppare altre funzionalità: l&#8217;esigenza di avere dati disponibili anche su <strong>dispositivi mobili</strong> è sempre più sentita; è inevitabile che in <strong>futuro</strong> si debba far fronte a queste richieste.<br />
In fondo è pure divertente!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2010/04/22/un-esempio-di-applicazione-ajax-ottimizzata-per-dispositivi-mobili-xml-e-javascript/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
