Come e quando utilizzare il metodo serialize di jQuery?

Nei numerosi articoli che abbiamo scritto su jQuery, è sempre stato evidente come questo framework contribuisca a semplificare lo sviluppo del codice. In questo articolo vedremo come la conoscenza di tutti gli strumenti che ci vengono messi a disposizione possa ulteriormente renderci la vita più comoda ed il codice più elegante. Oggi analizzeremo il metodo serialize(); si tratta di uno strumento molto interessante il quale, applicato ad un form, preleva il contenuto dei campi e prepara una querystring pronta per essere inviata tramite una richiesta ajax.
Se ad esempio consideriamo un form che richiede il nome ed il cognome e lo completo con i miei dati, applicando serialize() a questo form (all’evento submit) otterrò questa stringa:
nome=Maurizio&cognome=Tarchini
Utile vero?
Ma passiamo alla pratica. Consideriamo un documento html contenente un form
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="jquery/jquery-1.4.2.js"></script>
    <title>Serialize</title>
</head>
<body>
    <form action="#"  id="input_form">
        nome: <input type="text" name="nome" /><br />
        cognome: <input type="text" name="cognome" /><br />
        email: <input type="text" name="email" /><br />
        <input type="submit" value="invia" name="submit" />
    </form>
</body>
</html>
Ora poniamo di voler inviare questi dati tramite una chiamata asincrona (se sei un po’ a digiuno di ajax, in questo articolo trovi tutto quello che c’è da sapere).
Quello che dovremo fare è prelevare il contenuto dei campi del form all’evento submit ed inviarli alla pagina di elaborazione. Il codice per fare questo potrebbe essere così (non ci starò sopra molto in quanto è tutto spiegato nei dettagli nell’articolo che ho segnalato precedentemente):
$(document).ready(function(){
    $("#input_form").submit(function(){
        var nome = $('input[name=nome]').val();
        var cognome = $('input[name=cognome]').val();
        var email = $('input[name=email]').val();
        var querystring = "nome="+nome+"&cognome="+cognome+"&email="+email;
        $.ajax({
            url: 'elaborazione.php',
            type: "POST",
            data: querystring,
            success: function(data) {
                //codice da eseguire
                    }
            });
            return false;
        });
    });
Come vedi, all’evento submit, vado a prelevare uno alla volta i dati contenuti nei campi del form.
In seguito creo la variabile querystring nel formato richiesto dal metodo ajax (nome=valore&nome=valore…).
Ora non ci interessa cosa farà il file elaborazione.php ne quello che dovrà svolgere la funzione passata nel parametro success. Quello che ci interessa invece è: Cosa succede se il nostro form ha 400 campi? Dovremo prelevare i valori dei 400 campi uno per uno e costruire una lunghissima e complicata querystring da passare al parametro data? No. Utilizzando il metodo serialize() potremo fare tutto con un’unica e semplice riga di codice.
Come utilizzare il metodo serialize?
Semplice. Invece di questo
$("#input_form").submit(function(){
    var nome = $('input[name=nome]').val();
    var cognome = $('input[name=cognome]').val();
    var email = $('input[name=email]').val();
    var querystring = "nome="+nome+"&cognome="+cognome+"&email="+email;
Basterà fare questo
$("#input_form").submit(function(){
    var querystring = $(this).serialize();
Il metodo serialize() si occuperà di leggere tutti i campi del form con id input_form (con this facciamo appunto riferimento a questo) e di creare la stringa con gli accoppiamenti nome campo – contenuto campo nel formato corretto e pronta per essere passata al parametro data del metodo ajax().
Puoi provare con questo esempio che non fa altro che stampare a video (all’evento submit) la querystring risultante dal contenuto dei campi
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="jquery/jquery-1.4.2.js"></script>
    <script type="text/javascript">
         $(document).ready(function(){
             $("#input_form").submit(function(){
                 var querystring = $(this).serialize();
                 $('#result').html(querystring);
                 return false;
                 });
        });
    </script>
    <title>Serialize</title>
</head>
<body>
    <form action="#" id="input_form">
        nome: <input type="text" name="nome" id="nome"/><br />
        cognome: <input type="text" name="cognome" id="cognome"/><br />
        email: <input type="text" name="email" id="email"/><br />
        <input type="submit" value="invia" name="submit" />
    </form>
    <p id="result"></p>
</body>
</html>
Attento, la querystring viene codificata
Una piccola nota per concludere. Se hai provato quest’ultimo script, ti sarai accorto che serialize() codifica (giustamente) i caratteri speciali. ad esempio l’email risulterà così:
nome%40sito.com
Per decodificare la stringa, PHP mette a disposizione la funzione urldecode().
echo urldecode('nome%40sito.com'); //restituisce "nome@sito.com"
Mentre nel codice mostrato precedentemente potremo agire in questo modo
$('#result').html(decodeURIComponent(querystring));
Conclusione
In questo articolo abbiamo visto un esempio di come semplificare ulteriormente lo sviluppo di codice. Se pensiamo a form molto lunghi, abbiamo visto come serialize() risolve con una sola riga di codice il problema di prelevarne il contenuto. Utilizzando questo metodo possiamo godere anche di un secondo vantaggio: L’eventuale aggiunta o rimozione di campi dal form non dovrà comportare nessuna modifica al codice jQuery, con effetti positivi sulla mantenibilità.
	            
	            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
 
                
31 commenti
Trackback e pingback
[...] This post was mentioned on Twitter by Antonino Scarfì and mtx_maurizio, Simone D'Amico. Simone D'Amico said: Come e quando…
[...] Il pulsante “login” invece é un po’ più complesso. Quando viene premuto bisognerà innanzitutto leggere il contenuto dei campi.…
[...] Mobile serializza i dati del [...]
[...] creare una stringa contenente tutti i valori presenti nel form (se non conosci questo metodo leggi questo articolo di…
[…] semplicità ricorrendo al metodo serialize() (una spiegazione su quando usare serialize è indicato qui), applicato ovviamente al nostro […]