Mar 132013
 

Oggi vedremo come usare l’autocomplete, via ajax su jQuery Mobile, la soluzione potrebbe essere interessante per risolvere, almeno in parte, alcuni problemi di spazio tipici delle applicazioni mobile.

La possibilità di partire con oggetti precostituiti è data dalle ultime versioni del nostro framework.

Tanto per iniziare creiamo la solita pagina jqm con all’interno del content una listview con il filter, queste opzioni dovrebbero essere già note da precedenti esperienze sul framework


<div data-role="page" id="page1">
<div data-role="header" data-position="fixed">
<h1>Page 1</h1>
</div>
<div data-role="content">
<h3>Citt&agrave; italiane</h3>
<ul id="autocomplete" data-role="listview" data-inset="true" data-filter="true" data-filter-placeholder="Cerca una città..." data-filter-theme="d"></ul>
</div>
<div data-role="footer" data-position="fixed">
<h3>Footer</h3>
</div>
</div>

 

La parte interessante sarà la funzione javascript che permetterà di gestire tutto. Per il bind degli eventi useremo l’evento pageinit e sull’oggetto che ha id autocomplete intercettiamo l’evento listviewbeforefilter per iniziare a pulire e settare qualche variabile:


$( document ).on( "pageinit", "#page1", function() {
$( "#autocomplete" ).on( "listviewbeforefilter", function ( e, data ) {
var $ul = $( this ),
$input = $( data.input ),
value = $input.val(),
html = "";
$ul.html( "" );

 

La parte successiva valuterà se è stata inserita una stringa nel filtro e se ha una lunghezza superiore a un carattere, se è così verrà effettuata una chiamata ajax a una pagina php che restituirà una stringa json.


if ( value && value.length > 1 ) {
$ul.html( "<li><div class='ui-loader'><span class='ui-icon ui-icon-loading'></span></div></li>" );
$ul.listview( "refresh" );
$.ajax({
url: "autocomplete2.php",
dataType: "json",
data: {q: $input.val()},
async:false,
success: function ( response ) {

 

 

Il passo successivo sarà ciclare sul json e appendere gli elementi alla lista, compiuto questo step faremo il refresh della lista per attribuire lo stile corretto:


success: function ( response ) {
$.each( response, function ( i, val ) {
html += "<li>" + val + "</li>";
});
$ul.html( html );
$ul.listview( "refresh" );
$ul.trigger( "updatelayout");
}

L’ultima porzione di codice ci permetterà di associare il click agli elementi della lista per nasconderli e mettere l’elemento selezionato nell’input.
In alternativa si potrebbe stampare liste di link e proseguire nella navigazione:

$('#autocomplete').on('click','li',function(){
$('#autocomplete').empty();
$('input[data-type="search"]').val($(this).text())
})

Per comodità la pagina php che produce il json:

error_reporting(0);
require('include/mysql.inc.php');
$return_arr=array();
$nome=$_GET['q'];
$sql='select nome, sigla from province where nome like "%'.mysql_real_escape_string($nome).'%" order by nome';
$fetch=mysql_query($sql);
while($row=mysql_fetch_array($fetch, MYSQL_ASSOC)){
array_push($return_arr,$row['nome']);
}
mysql_close($conn);
echo json_encode($return_arr);

L’esempio

Mar 112013
 

La seconda novità arrivata con la versione 1.3 di jQuery Mobile sono le tabelle!

In realtà in una versione adatta al mobile, ovvero dove l’intestazione della mia tabella, che normalmente è un intestazione di colonna di venta intestazione di riga per ciascuna delle righe della tabella.

Il codice è abbastanza famigliare a chi mastica html:


<table data-role="table" id="movie-table" data-mode="reflow">

Attenziona ovviamente al solito data-role, tabel, e al data-mode: reflow

La parte successiva riguarda l’intestazione della tabella,: ovviamente fatta a modo:


<tr>
<th data-priority="1">Ordine</th>
<th data-priority="persist">Titolo</th>
<th data-priority="2">Anno</th>
<th data-priority="3">Rating</th>
<th data-priority="4">Visite</th>
</tr>
</thead>

Per quanto riguarda invece il corpo della tabella riporteremo solo la prima riga di dati:


<tbody>
<tr>
<th>1</th>
<td>Citizen Kane</td>
<td>1941</td>
<td>100%</td>
<td>74</td>
</tr>

Di fronte  a questo codice per lo più noto, sara interessante vedere come viene renderizzata dai browser desktop e mobile una pagina vera:

esempio

Mar 092013
 

La versione 1.3 di jQuery Mobile (fine febbraio) ha portato con sé alcune importanti novità, una di queste è il panel.

Chiunque abbia provato a creare applicazioni mobile, soprattutto per smartphone, si sarà scontrato con la frustrante mancanza di spazio, magari quel maledetto menù orizzontale non c’è proprio modo di farlo stare. Da qui nasce l’idea del Panel, già da tempo percorribile tramite script di terze parti ma ora integrata nel framework. In pratica con un’icona normalmente collocata nell’angolo in alto a sinistra facciamo comparire, sopra la nostra pagina, un pannello che per esempio potrebbe contenere una lista di link, o in ogni caso dei contenuti a comparsa. Il codice in sé è piuttosto semplice, come sempre quando si tratta di integrare componenti esistenti.

Nell’intestazione collocheremo i soliti collegamenti alle librerie e al css. Poi predisponiamo tre pagine e un panel per navigare all’interno di esse, ovviamente questa soluzione in realtà sarebbe più utile con un numero di pagine superiore.

<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>

Poi predisponiamo tre pagine e un panel per navigare all’interno di esse, ovviamente questa soluzione in realtà sarebbe più utile con un numero di pagine superiore.
Avranno tutte la stessa struttura che riportiamo una sola volta:


<div data-role="page" id="page1">
<div data-role="panel" id="mypanel">
<ul data-role="listview">
<li><a href="#page1">Page 1</a></li>
<li><a href="#page2">Page 2</a></li>
<li><a href="#page3">Page 3</a></li>
</ul>
</div>
<div data-role="header" data-position="fixed">
<a href="#mypanel" data-icon="plus">Menu</a>
<h1>Page 1</h1>
</div>
<div data-role="content">
<p>Page 1</p>
</div>
<div data-role="footer" data-position="fixed">
<h3>Footer</h3>
</div>
</div>

Andando a premere sull’icona del panel comparirà la listview che ci permetterà di navigare attraverso il sito.
E’ consigliabile vedere l’esito su uno smartphone, rende l’idea molto di più del solito browser
L’esempio

Jan 192013
 

Possiamo usare il nuovo campo di input di html5, l’input type range, per acquisire un numero intero come input del nostro utente.

Come prima cosa prepariamo l’html della pagina con un form:


&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Page Title&lt;/title&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-1.7.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div data-role=&quot;page&quot; id=&quot;pagina&quot;&gt;
&lt;div data-role=&quot;header&quot;&gt;&lt;h1&gt;Slider&lt;/h1&gt;&lt;/div&gt;
&lt;div data-role=&quot;content&quot;&gt;
&lt;form action=&quot;#&quot; method=&quot;post&quot;&gt;
&lt;div data-role=&quot;fieldcontain&quot;&gt;
...
&lt;/div&gt;
&lt;/form&gt;
&lt;a href=&quot;#&quot; id=&quot;leggi&quot; data-role=&quot;button&quot;&gt;Leggi&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

Abbiamo già inserito anche un bottoncino per la lettura.

Inseriamo quindi l’input che ci interssa:


&lt;label for=&quot;myslider&quot;&gt;Slider&lt;/label&gt;
&lt;input type=&quot;range&quot; id=&quot;myslider&quot; value=&quot;3&quot; min=&quot;0&quot; max=&quot;10&quot;&gt;

E in ultimo un piccolo script per leggere i contenuti:


$(document).ready(function(e) {
$('#leggi').on('click',function(e){
var x=$('#myslider').val();
alert(x);
})
});

L’esempio

Jan 172013
 

Come in jQuery c’è la possibilità di andare a gestire (leggere, scrivere, rimuovere) i contenuti degli attributi data-, la stessa cosa possiamo farla con jQuery Mobile. La variante sostanziale è ne metodo da utilizzare: jqmData().

Il codice:


&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Page Title&lt;/title&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-1.7.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
$(document).ready(function(e) {
$('#set-data').on('click',function(e){
$('#store').jqmData('chiave','Contenuto inserito');
})
$('#get-data').on('click',function(e){
alert($('#store').jqmData('chiave'))
})
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div data-role=&quot;page&quot; id=&quot;pagina&quot;&gt;
&lt;div data-role=&quot;header&quot;&gt;&lt;h1&gt;JQMData&lt;/h1&gt;&lt;/div&gt;
&lt;div data-role=&quot;content&quot;&gt;
&lt;p id=&quot;store&quot;&gt;Paragrafo contenitore&lt;/p&gt;
&lt;a href=&quot;#&quot; id=&quot;set-data&quot; data-role=&quot;button&quot;&gt;Set data&lt;/a&gt;
&lt;a href=&quot;#&quot; id=&quot;get-data&quot; data-role=&quot;button&quot;&gt;Get data&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

Come si può vedere abbiamo due bottoni, uno per scrivere e uno per leggere, al document ready associamo il click e in base al click andiamoa scrivere/leggere nel paragrafo che nel nostro caso fa da contenitore

L’esempio

Jan 152013
 

Come sappiamo jQuery Mobile usa di base un meccanismo ajax per passare da una pagina all’altra.

Un problema implicito in questo schema è la possibilità di settare correttamente il title della pagina, cosa che sappiamo è assolutamente rilevante in un ottica SEO. Vediamo quindi come fare, l’html:

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Page Title&lt;/title&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-1.7.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div data-role=&quot;page&quot; id=&quot;prima&quot; data-title=&quot;Prima&quot;&gt;
&lt;div data-role=&quot;header&quot;&gt;&lt;h1&gt;Prima&lt;/h1&gt;&lt;/div&gt;
&lt;div data-role=&quot;content&quot;&gt;
&lt;a href=&quot;#seconda&quot; data-role=&quot;button&quot;&gt;Seconda&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-role=&quot;page&quot; id=&quot;seconda&quot; data-title=&quot;Seconda&quot;&gt;
&lt;div data-role=&quot;header&quot;&gt;&lt;h1&gt;Seconda&lt;/h1&gt;&lt;/div&gt;
&lt;div data-role=&quot;content&quot;&gt;
&lt;a href=&quot;#prima&quot; data-role=&quot;button&quot;&gt;prima&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

Come si può vedere la soluzione passa dall’inserimento dell’attributo data-title nel div con data-role-page

L’esempio

 

Dec 172012
 

Il metodo di jQuery Mobile change page serve per cambiare pagina, la cosa è banale se non fosse per il meccanismo ajax che governa il passaggio.

Prepariamo dunque la nostra solita pagina e invece di incorporare il link nell’html lo gestiamo da programmazione.


<!DOCTYPE html>
<html>
<head>
<title>Change Page</title>
<meta name="viewport"
content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css">
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
<script>
...
</script>
</head>
<body>
<div data-role="page">
<div data-role="header"><h1>Change page</h1></div>
<div data-role="content"><a href="#" id="change" data-role="button">Change Page</a></div>
</div>
</body>
</html>

Il binding dell’evento per gestire tutto da programmazione lo facciamo con javascript:

$(document).ready(function() {
$(‘#change’).on(‘click’, function(event) {
$.mobile.changePage(’43b-change-page.html’,{transition: ‘fade’});
});
});

usiamo il metodo on che è quello da preferire.

Per visualizzare il meccanismo ajax la pagina di destinazione conterrà solo l’html senza i link alle librerie:


<!DOCTYPE html>
<html>
<head>
<title>Linked Page</title>
</head>
<body>
<div data-role="page">
<div data-role="header">
<h1>Linked File</h1>
</div>

<div data-role="content">
<p><a href="43-change-page.html">Link to an original
file</a></p>
</div>

</div>
</body>
</html>

Tramite l’esempio si può vedere come venga applicato il parsing di jquery mobile e di conseguenza come ci sia un’iniezione di contenuti via ajax.

Dec 142012
 

Nello scenario di un massiccio ricorso ad ajax da parte di jQuery Mobile, è opportuno considerare lla necessità di visualizzare un messaggio che avverta del caricamento in corso delle nostra pagina chiamata, in modo che anche chi accederà con connessioni lente non abbia  il dubbio che la pagina non stia funzionando debitamente.

jQuery Mobile dispone già di tutto il necessario perché questo avvenga e sarà quindi necessario solamente intercettare l’evento e utilizzare la funziona opportuna.

Nella pagina predisporremo dunque due bottoni uno per mostrare il messaggio e l’altro per nasconderlo:

<a href="#" id="show" data-role="button">Show</a>
<a href="#" id="hide" data-role="button">Hide</a>

e mediante il metodo on andremo ad associare al click sui bottoni la visualizzazone del messaggio di attesa oppure la sua rimozione:

$('#show').on('click', function(){$.mobile.showPageLoadingMsg();})
$('#hide').on('click', function(){$.mobile.hidePageLoadingMsg();})

Questo link per fare il test.

Dec 122012
 

jQuery Mobile usa ajax come scelta preferienzale per caricare altri contenuti.

Usiamo come esempio questa semplice pagina:

<!DOCTYPE html>
<html>
<head>
<title>Linking AJAX</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css">
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
</head>
<body>
<div data-role="page">
<div data-role="header"><h1>Linking AJAX</h1></div>
<div data-role="content">
<p><a href="04b-link.html">Link to an external file</a></p>
<p><a href="04b-link.html" data-prefetch>Prefetch the external file</a></p>
</div>
</div>
</body>
</html>

Come si può vedere esaminadno il codice sorgente della pagina caricata, che non porta con sé il caricamento agli script necessari e al css, effettivamente lo schema utilizzato è ajax, il secondo link procede anche a un precaricamento, tecnica utile per velocizzare la fruizione dei contenuti ma della quale è bene non abusare.

Il codice della 04b-link.html:

<!DOCTYPE html>
<html>
<head>
<title>Linked Page</title>
</head>
<body>
<div data-role="page">
<div data-role="header"><h1>File linkato</h1></div>
<div data-role="content">
<p><a href="04-linking-ajax.html">Link al file originale</a></p>
</div>
</div>
</body>
</html>

Accedendo direttamente a questa pagina apparirà appunto completamente non formatta a riprova di quanto detto.

L’esempio

Dec 102012
 

jQuery Mobile normalmente utilizza ajax come tecnologia per il caricamento dei contenuti.

A questo bisogna ggiungere che una delle modalità caratteristiche di costruzione delle applicazioni e creare un unico file e inserire all’interno di questo diversi div con data-role=”page” che costituiscono le pagine vere e proprie del nostro sito.

Questa pagina, per esempio, usa ajax per passare dalla prima alla seconda pagine e viceversa: è la struttura di default di caricamento dei link.

<!DOCTYPE html>
 <html>
 <head>
 <title>Page Title</title>
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css">
 <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
 <script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
 </head>
 <body>

<div data-role="page" id="prima">
 <div data-role="header"><h1>Prima</h1></div>
 <div data-role="content">
 <a href="#seconda">Seconda</a>
 </div>
 </div>
 <div data-role="page" id="seconda">
 <div data-role="header"><h1>Seconda</h1></div>
 <div data-role="content">
 <a href="#prima">prima</a>
 </div>
 </div>
 </body>
 </html>

Questo pone un evidente problema sulla gestione dell’evento document.ready che si scatena una sola volta al caricamento della pagina completa.

L’evento che invece mi permette di intercettare il caricamento della singola pagina è “init”.

Modifichiamo i nostri due link in questo modo:

<a href="#seconda" data-role="button">Seconda</a>

...

<a href="#prima" data-role="button">prima</a>

e aggiungiamo uno script che tramite un alert segnala questa differenza:

<script>
 $(document).ready(function(e) {alert(0);});
 $(document).on('pageinit',function(){alert(1);});
 </script>

Al primo accesso alla prima pagina avremo due alert con contenuto 0 e 1,

all’accesso alla seconda pagina un solo alert con, ovviamente, 1.

L’esempio.