Form Submit in Ajax – Script per principianti

di SimoneRodriguez il 16 agosto 2007

in Scripts

ajax-logoSolitamente evito turorial e articoli troppo tecnici visto che “saper spiegare” è una cosa più difficile di quanto sembri. Questo volta però ho realizzato uno scriptino che permetterà a chiunque (o quasi) di implementare l’invio di un form in Ajax senza bisogno di particolari abilità.

Premesse
Per chi non lo sapesse, Ajax è una tecnica di sviluppo web che tramite l’oggetto XMLHttpRequest permette l’invio e ricezione di dati senza bisogno di ricaricare la pagina con evidenti benifici in termini di velocità e usabilità del sito.

L’implementazione è più facile di quanto sembri anche per form già esistenti; è inoltre possile gestire anche l’eventualità che il browser abbia i javascript disabilitati redirigendolo in un’apposita pagina.

A differenza di molti script che si trovano in rete,ho cercato di parametrizzare i campi fondamentali così da poter specificare il messaggio di ‘Loading’ e l’ID del DIV in cui visualizzare la risposta del Form.

1. Lo Script
Innanzi tutto avrete bisogno di questo script che dovrete uploadare nel vostro sito e linkare nella sezione head della pagina del form in questo modo:

<script src="js/ajaxsbmt.js" type="text/javascript"></script>

Non dimenticate di modificare il percorso del JS con quello della cartella in cui l’avete uploadato.

2. Il Form
L’unica cosa da aggiungere rispetto ad un form classico, è il richiamo alla funzione xmlhttpPost associata all’evento onsubmit.
Il richiamo alla funzione xmlhttpPost va personalizzata secondo le vostre esigenze:

  1. Il primo paramentro (‘response_ajax.asp’) si riferisce alla pagina che riceverà i dati del form e risponderà
  2. Il secondo parametro (‘MyForm’) si riferisce al nome del form da cui prelevare i dati
  3. Il terzo parametro (‘MyResult’) si riferisce all’ID del DIV che conterrà la risposta del form ed il messaggio di attesa.
  4. Il quarto paramentro (‘Wait…’) si riferisce al messaggio di attesa che apparità durante l’invio dei dati. Potete anche inserire del codice HTML magari per far apparire un’immagine di caricamento.
<form name="MyForm" action="response_normal.asp" method="post" onsubmit="xmlhttpPost('response_ajax.asp', 'MyForm', 'MyResult', 'Wait...'); return false;">
<input type="text" name="sample_text" value="Test" />
<input type="submit" name="send_button" value="Send" />
</form>

La cosa interessante è che nel caso in cui il browser avesse il javascript disabilitati, i dati verranno inviati comunque alla pagina specificata nella proprietà action rendendo questo script di fatto accessibile.

4. Conclusioni
Visto quanto è facile realizzare un form “moderno”? Ho cercato di semplificare la questione il più possibile ma se avete dubbi, domande o problemi, lasciate un commento.
Lo script è stato testato con Firefox 2 e Internet Explorer 6 ma se avete la possibilità di testarlo con altri browser vi prego di comunicarmelo.

http://www.simonerodriguez.com/wp-content/plugins/downloads-manager/img/icons/download.png Download: Script Ajax form submit (3.33KB)
Data: 21/02/2010
Click: 1449
Descrizione:

QUI trovate una DEMO

NON DIMENTICATE DI VOTARMI SU DIGG ->

5. Immagini per il ‘Loading’
La fase di invio/attesa dati può essere personalizzata con una bella gif, eccovene alcune.
Ricordate che passando del codice HTML tramite la funzione xmlhttpPost i doppi apici (“) devono essere sostituti con lo slash e l’apice (\’).

Aggiungo in fine questo fantastico sito AjaxLoad che permette in perfetto stile web 2.0 di crearsi la propria immagine di caricamento.

Condividi:
  • Print
  • Digg
  • Diggita
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • Netvibes
  • Twitter

Nessun articolo correlato.

{ 68 commenti… leggili aggiungine uno }

monica 3 settembre 2007 alle 10:36

ciao, volevo chiederti se questo script si poteva usare con lightbox.
Io apro tramite lightbox una pagina formOrder.php (dalla index.php) dove ho un form da compilare. Vorrei inviare i dati tramite ajax alla mia index. Io ho scritto così:
Perchè non funziona?

SimoneRodriguez 3 settembre 2007 alle 11:30

In linea di massima dovremme funzionare anche con lightbox ma non l’ho mai provato.
I problemi potrebbero essere molti, ma se mi passi il link gli dò un’occhiata.

monica 3 settembre 2007 alle 12:09

purtroppo ora non ho lo spazio dove mettertelo. Se vuoi ti poso mandare i file via mail perchè io ora li vedo solo in locale nel mio server di prova.

SimoneRodriguez 3 settembre 2007 alle 12:13

Dai manda… vediamo un pò

Luigi 6 settembre 2007 alle 17:39

Davvero fatto bene come script.
Volevo chiederti su quale sito o su quale libro ()esperienza a parte posso farmi una discreta cultura su Ajax, Javascript e compagnia bella.
Grazie

SimoneRodriguez 6 settembre 2007 alle 18:00

Grazie! Ma non sono un esperto, ho solo discrete competenze di programmazione che mi permette di “creare” ciò che mi serve attingendo da internet. E quando ci riesco lo metto a disposizione…
In poche parole non saprei cosa consigliarti : - ?

Luigi 10 settembre 2007 alle 11:22

Idem per me.
Competenze di programmazione e ricerca su internet per dritte utili a risolvere i miei problemi… : - )
Grazie comunque per la risposta al commento.

Gionni 13 settembre 2007 alle 10:36

Domandina: response_normal.asp è il file che inserisce eventuali dati nel db mentre response_ajax.asp si occupa soltanto di non ricaricare la pagina, ma fare apparire la voce di responso. O viceversa?
Se invece dei dati inseriti volessi far comparire un’altra scritta?
Ottima base per imparare, complimenti.

SimoneRodriguez 13 settembre 2007 alle 11:00

“response_normal.asp” è la pagina che riceverebbe i dati nel caso in cui il javascript fosse disabilitato, viceversa i dati saranno inviati tramite xmlhttpPost alla pagina “response_ajax.asp”.
Nel primo caso (…normal.asp) dovrai creare una pagina completa, nel secondo (…ajax.asp) sarà sufficiente processare i dati e magari rispondere.
Chiaramente, l’esempio visualizza i dati ricevuti, solo per far vedere che funziona; tu però puoi: ricevere i dati, inserirli ne DB, e con un “response.write” (nel caso dell’asp) dare conferma dell’avvenuto inserimento, tutto tramite response_ajax.asp
Ma questo è solo un altro esempio. Con i dati del form ci fai quello che ti serve e rispondi con quello che vuoi…

Gionni 13 settembre 2007 alle 11:39

Ed è qua che mi impapero. Con (..normal.asp) sappiamo come funziona, in (..ajax.asp), che per me è una novità, metto solo la parte di codice per processare i dati e l’eventuale risposta? E dopo il tutto come torna alla pagina iniziale? Attraverso lo script js?

SimoneRodriguez 13 settembre 2007 alle 11:49

Gionni è esattamente così, ricordati solo di creare (nella pagina che invia) e specificare (quando richiami la funzione xmlhttpPost) il DIV che ne conterrà la risposta.
Un gioco da ragazzi!

Gionni 13 settembre 2007 alle 12:01

Il Div di risposta se ho capito bene è ‘MyResult’, ma come mi devo regolare su (…ajax.asp) per farlo apparire sulla pagine del form? Idem per le icone di attesa.
So’ altamente ignorante in materia… (e curioso come pochi)

SimoneRodriguez 13 settembre 2007 alle 12:05

Si esatto, devi creare un DIV con ID MyResult… ma puoi anche cambiarlo purché ti ricordi poi di cambiarlo anche quando richiami la funzione xmlhttpPost.
Il messaggio o icona di attesa lo imposti nell’ultimo parametro (wait…).
Sia il messaggio di attesa che tutto cio che scriverò response_ajax.asp, apparirà nel DIV con ID MyResult.

Gionni 13 settembre 2007 alle 12:18

Non mi è chiaro come con il response.write, passo il ‘MyResult’ nel Div. Mi è oscuro il passaggio nel response… X - |
Tutto ok con il ‘Wait..’ ho visto nell’esempio che basta linkare l’immagine nella chiamata ajax del form.

Gionni 13 settembre 2007 alle 12:19

Non mi è chiaro come con il response.write, passo il ‘MyResult’ nel Div. Mi è oscuro il passaggio nel response… X - |
Tutto ok con il ‘Wait..’ ho visto nell’esempio che basta linkare l’immagine nella chiamata ajax del form.

SimoneRodriguez 13 settembre 2007 alle 12:31

Gionni più chiara di così non te la sò fare:
Se, per esempio, nel response_ajax.asp ci scrivi solo response.write “Ho ricevuto i dati”, inviando i dati dal form nel DIV MyResult apparirà la scritta “Ho ricevuto i dati”.

Gionni 13 settembre 2007 alle 12:57

Ah, pensavo ci fosse qualche riga di codice da aggiungere per specificare nel dettaglio… messa così… ci rimango male… 8 - ) mi sento stupido forte 8 - ) (sono come san tommaso, se non vedo il codice… nn credo, o meglio, non capisco)

SimoneRodriguez 13 settembre 2007 alle 13:29

Il bello è che è proprio facile!
Passa all’atto pratico e te ne renderai conto!
P.S. Dopo tutto sto popò di assistenza ti tocca offrirmi una birra o almeno un linketto nel blog! : - P

Gionni 13 settembre 2007 alle 13:35

Rispondo solo al P.s. Erano già previste in origine entrambe le cose ; - )

Luigi 13 settembre 2007 alle 14:01

Io l’ho implementato facilmente già al primo utilizzo, ma avrei lo stesso una domandina: ho provato a farlo funzionare in un form in cui la pagina che processa i dati risiede in un altro dominio (cioè inserendo http://www.altrodomnio.it/risposta.php tra i parametri di xmlhttpPost) e, contrariamente al caso di pagina di risposta sullo stesso dominio, non funziona: mi carica la pagina di risposta invece di aggiornare il div.
Sicuramente c’è una soluzione, ma volevo chiederti se riuscivi a darmi qualche dritta… : - ).
Se riesco, la birra te la offro io 8 - )

SimoneRodriguez 13 settembre 2007 alle 14:41

@Gionni: Sei un gran signore!
@Luigi: I motivi possono essere molti, anche di incompatibilità con altri script presenti. Difatti non appena il javascript va in errore va in modalità “degradata” ed invia il form in modo normale.
Più probabilmente, se ricordo bene, per motivi di sicurezza l’oggetto xmlHttpReq non permette interazione con domini diversi
In questi casi uso FireBug per fare un debug e spulciare un pò tutto.
Così alla cieca non saprei dirti di più!

Luigi 13 settembre 2007 alle 15:57

Ero al corrente degli stessi problemi…anche usando firebug ho notato che non c’era una soluzione immediata.
Mi consola che sei arrivato alle mie stesse conlusioni ; - )
Grazie comunque ancora per la risposta.
Se mai avrò un blog, un link è tuo!

Gionni 22 settembre 2007 alle 22:15

Ritorno sull’argomento… nei miei esperimenti è sorta una curiosità. Mi spiego, se dopo l’invio, voglio che il form torni bello pulito (o per strafare, anche farlo sparire e al suo posto apparire la conferma dell’inserimento), che devo modificare?

SimoneRodriguez 22 settembre 2007 alle 22:26

Potresti (come faccio io per il blog) pensare di gestire due diversi DIV: uno per la risposta ed uno per il form… ma credimi, si complica molto la cosa.
E’ più facile includere anche il form nel DIV facendolo riapparire se necessario (in caso di errore) oppure scomparire in caso di invio corretto. A parole è facile, nei fatti dovrai lavorarci un pò…

Luigi 16 ottobre 2007 alle 12:49

E’ quello che ho fatto io, con tanto di ricompletamento dei soli dati corretti.
E’ stato un lavoraccio X - | (per me che programo da poco), ma alla fine funziona : - D.
Io comunque non ho modificato NULLA dello script AJAX di Simone.
Ho lavorato solo sulla pagina di risposta al form, nel mio caso in PHP.

SimoneRodriguez 16 ottobre 2007 alle 12:57

Ottimo Luigi!
Mi fa piacere vedere che, anche con un minimo di conoscienze programmazione, si riesce ad adattare lo script alle diverse esigenze/linguaggi.

Stefano 20 novembre 2007 alle 12:09

Ciao Simone, complimenti per lo script: molto utile!
Solo un dubbio: nel caso nel form avessi 2 pulsanti SUBMIT, ad esempio

Vedo che anche cliccando su Conferma assume il valore di Cancella (o piu’ in generale l’ultimo valore “assumibile”).
Ti risulta?!?
Grazie mille!
Ste

Luigi 20 novembre 2007 alle 12:25

Io lo uso con entrambi i pulsanti, il classico “invia” e “cancella” e funziona bene.
Il pulsante “cancella”, però non è un submit, ma un tag input con type=”reset”, mentre “invia” è il classico input con type=”submit”.
Tu usi un submit per cancellare i campi del form?

Stefano 20 novembre 2007 alle 13:42

Hai ragione Luigi, “non sono stato spiegato” : - )
Ho un form con 4 pulsanti tutti submit:
type=”submit” name=”action” value=”CONFERMA” – mi consente di modificare i dati di un record
type=”submit” name=”action” value=”AGGIUNGI” – mi consente di aggiungere un record ex-novo nel db
type=”submit” name=”action” value=”CANCELLA” – mi consente di eliminare il record
name=”reset” value=”RESET” – mi resetta i valori del form
Cliccando su AGGIUNGI, il pulsante “action” assume comunque valore “CANCELLA”

Luigi 20 novembre 2007 alle 14:24

Capito.
Non sono così sgamato da dirti cosa non va nell’oggetto httprequest scritto da Simone (se davvero c’è qualcosa che non va…) o cosa dovresti fare per farlo funzionare come vuoi te.
Probabilmente c’è da lavorarci sopra.

Magari per capire meglio: quando dici “il pulsante “action” assume comunque valore “CANCELLA”" intendi che l’input submit assume sempre il valore cancella, giusto?

Stefano 20 novembre 2007 alle 14:36

Esatto! Assume sempre l’ultimo valore.
Ovvero se avessi…
type=”submit” name=”action” value=”CONFERMA” – mi consente di modificare i dati di un record
type=”submit” name=”action” value=”AGGIUNGI” – mi consente di aggiungere un record ex-novo nel db
type=”submit” name=”action” value=”CANCELLA” – mi consente di eliminare il record
il valore di action e’ “CANCELLA” indipendentemente da quale “submit” schiaccio
se avessi
type=”submit” name=”action” value=”CANCELLA” – mi consente di eliminare il record
type=”submit” name=”action” value=”CONFERMA” – mi consente di modificare i dati di un record
type=”submit” name=”action” value=”AGGIUNGI” – mi consente di aggiungere un record ex-novo nel db
il valore di action e’ “AGGIUNGI” (sempre indipendentemente da quale “submit” schiaccio).
Ancora grazie mille!
Ste

Luigi 20 novembre 2007 alle 14:50

Ho provato e ho risolto così e funge:
- prepara una pagina di risposta diversa, per esempio “conferma.php”, “aggiungi.php” e “cancella.php”
- nell’action del form, come valore passato all xmlhttpPost mettici una variabile a caso, chiamandola come vuoi, per sempio: target
- nei 3 bottoni di submit modifichi l’attributo ‘onclick’ in questo modo: per CONFERMA metti onclick=”target=’conferma.php’”, per AGGIUNGI metti onclick=”target=’aggiungi.php’” e idem per CANCELLA.

A quel punto la appena clicchi ti spara dentro la variabile target la pagina obiettivo per ogni diverso submit e ti produce il risultato desiderato.

Un po’ maccheronica come soluzione, lo ammetto, in quanto ti costringe ad avere uno script diverso per ogni submit, ma finchè non ti viene in mente qualcosa di meglio…

Col trucchetto dell’onclick sul submit potresti anche cambiare un valore del form che poi verrebbe passato in POST, ma queste prove le lascio a te…sono

Stefano 20 novembre 2007 alle 15:08

Luigi! Geniale!
piu’ semplicemente
<form name=’MyForm’ method=’POST’ action=’index.php’ onsubmit=”xmlhttpPost(‘index.php’,'MyForm’,'MyResult’,'Attendere prego…’); return false;”>
Tanti campi, tanti valori, tanti blah… blah… blah…
Quindi…
input type=’hidden’ name=’action’ value=”
input type=’submit’ name=’submit’ value=’Modifica’ onclick=”MyForm.action.value=’Modifica’”
input type=’submit’ name=’submit’ value=’Elimina’ onclick=”MyForm.action.value=’Elimina’”
input type=’submit’ name=’submit’ value=’Inserisci’ onclick=”MyForm.action.value=’Inserisci’”
input type=’reset’ name=’reset’ value=’reset’
quindi poi nella stessa pagina non controllo la variabile ‘$_POST[submit]‘ (mi perdonerai ma io uso php) ma la variabile ‘$_POST[action]‘
Grazie per lo spunto! buon pomeriggio!
Ste

Luigi 20 novembre 2007 alle 15:21

La tua è un’altra ottima soluzione.
Lieto di esserti stato di aiuto 8 - )

P.S. Ti perdono…anche io uso php : - D

Luigi 20 novembre 2007 alle 15:29

Piccolo consiglio: il valore di “action” viene usato di default per l’URL di destinazione del submit del form. Con javascript disattivato, un utente non potrebbe usare il tuo form.

Se la cosa non ti preoccupa rimani pure così, altrimenti il mio consiglio è di cambiare il value di un altro campo hidden del form, per esempio ‘azione’ , quindi di controllare poi il valore di $_POST['azione'].
Nell’action potresti risposta di default (che magari, se no ntrova settata la come si deve la $_POST['azione'] dice che per funzionare, il form ha bisogno di javascript attivato : - P ).

E’ solo un suggerimento di usabilità, non di funzionamento, in quanto la tua soluzione così com’è è tranquillamente operativa.

Stefano 20 novembre 2007 alle 15:44

Precisazione giustissima!
Grazie ancora!
Ste

Luigi 20 novembre 2007 alle 16:19

Prego
Mamma mia, come mi è sguillata la tastiera nell’ultimo commento X - |

SimoneRodriguez 21 novembre 2007 alle 00:04

Sono in francia per qualche giorno, ma è stupendo vedere che vi aiutate da soli!
Ciao ragazzi!!! : - D

Stefano 22 novembre 2007 alle 00:16

Ancora io!
Magari e’ solo un mio problema su cui sto perdendo tempo inutilmente ma ho l’impressione che non funziona con un campo type=’file’ name=’immagine’
Quando tento di caricare un’immagine (ovviamente ho gia’ verificato tutte le autorizzazioni sul server, grandezza max del file e tutti i blah blah blah…) non sembra funzionare.
Mi aspettavo che php (sempre lui) mi valorizzasse la $_FILES invece nulla…
Il tutto di contro funziona egregiamente senza ‘ajaxsbmt.js’ ma visto che c’e'… perche’ dovrei farne a meno?!?
Buona notte!
Stefano

Luigi 22 novembre 2007 alle 09:48

Qui non so come aiutarti.
Nella mia breve esperienza di programmazione non ho mai avuto a che fare con il campo input=”file”, per cui non so come si comporta normalmente con i valori postati in ambito php.
Tuttavia sono curioso: mi racconti come si comporta con e senza ajaxsbmt ?
…chissà che mi venga in mente un altro suggerimento sgudiblo da darti ; - )

SimoneRodriguez 22 novembre 2007 alle 13:27

Guarda, gli element file dovrebbero essere processati correttamente, però come ti consigliava Luigi ti conviene provare senza ajaxsbmt per vedere come si comporta.

Stefano 22 novembre 2007 alle 14:03

In realta’ la prova senza ajax e’ la prima che ho fatto e ovviamente funziona!
Questa mattina mi son documentato meglio e sembra che quello dell’upload di file è un problema implicito di ajax in quanto è l’oggetto httprequest che non ne permette l’invio.
se le cose stanno così l’unica soluzione rimane quella di nascondere la casellina type=’file’ all’interno di in iframe che e’ a sua volta contenuto nel frame principale: quando lancio l’upload in realta’ lo lancio solo x la pagina nell’iframe. Un po’ contorto ma credo possa funzionare. Quando ho completato il codice lo posto qui affinche’ ne facciate un buon uso.
Buon pomeriggio!
Stefano

Luigi 22 novembre 2007 alle 14:57

Tempo fa mi è passato sotto gli occhi un uploader di file in ajax (non ricordo dove).
Il comportamento, ovviamente, era perfettamente asincrono come il nostro amato form.
Puoi provare a cercarlo e implementarlo nel tuo form, oppure puoi darne una guardatina al codice per trovare la soluzione al problema.

Luigi 22 novembre 2007 alle 15:02

…ma ora che ricordo, era una soluzione che adottava un iframe. : - ?
Mi sa che sei sulla strada giusta.

Melo 10 gennaio 2008 alle 09:21

Nel js, al posto di usare il formname, perchè non usi il formid?
L’unica cosa che cambia (oltre ovviamente al nome del parametro formname), è la dichiarazione della variabile form all’interno della funzione getquerystring:
function getquerystring(formid) {
var form = document.getElementById(formid);
Il vantaggio che ne trarresti sarebbe quello di avere un form validato per la DTD strict, visto che l’attributo name non è permesso per il tag form in quella DTD!
Ciao

SimoneRodriguez 10 gennaio 2008 alle 09:24

Ottimo consiglio! Mi pare di ricordare che avessi avuto alcune problematiche, cmq provo e provvedo.
Grazie

RmX77 21 febbraio 2008 alle 18:41

Salve!
Ho implemento il vostro script nel mio sistema… e mi sono accorto che non riconosce i caratteri accentati nelle risposte di errore! E’ possibile risolvere questo problema!?!

SimoneRodriguez 21 febbraio 2008 alle 18:43

Esattamente che intendi per “risposte di errore”?

RmX77 21 febbraio 2008 alle 18:54

Ok! Risolto!

RmX77 21 febbraio 2008 alle 18:57

Praticamente… io uso una piattaforma ASP…. e gl errori sui campi vengono controllato da un pagina ASP che scrive le risposte nel div di controllo del tuo script facendo un semplice response.write! I caratteri accentati venivano fuori con dei caratteri nn riconoscibili… allora ho forzato il setcode dei caratteri e ora va tutto bene!

Lascia un commento

Puoi usare questi tags HTML ed attibuti: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Articolo precedente:

prossimo articolo: