Form Submit in Ajax - Script per principianti
Solitamente 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:
- Il primo paramentro ('response_ajax.asp') si riferisce alla pagina che riceverà i dati del form e risponderà
- Il secondo parametro ('MyForm') si riferisce al nome del form da cui prelevare i dati
- Il terzo parametro ('MyResult') si riferisce all'ID del DIV che conterrà la risposta del form ed il messaggio di attesa.
- 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.
QUI trovate lo script JS
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.
TrackBack http://www.simonerodriguez.com/tb.asp?id=95
Potrebbero interessarti anche questi articoli:
# 1
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?
# 2
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.
# 3
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.# 4
Dai manda... vediamo un pò# 5
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
# 6
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
# 7
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.
# 8
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.
# 9
"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...
# 10
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?# 11
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!
# 12
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)
# 13
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.
# 14
Non mi è chiaro come con il response.write, passo il 'MyResult' nel Div. Mi è oscuro il passaggio nel response...
Tutto ok con il 'Wait..' ho visto nell'esempio che basta linkare l'immagine nella chiamata ajax del form.
# 15
Non mi è chiaro come con il response.write, passo il 'MyResult' nel Div. Mi è oscuro il passaggio nel response...
Tutto ok con il 'Wait..' ho visto nell'esempio che basta linkare l'immagine nella chiamata ajax del form.
# 16
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".
# 17
Ah, pensavo ci fosse qualche riga di codice da aggiungere per specificare nel dettaglio... messa così... ci rimango male...
mi sento stupido forte
(sono come san tommaso, se non vedo il codice... nn credo, o meglio, non capisco)# 18
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!
# 19
Rispondo solo al P.s. Erano già previste in origine entrambe le cose
# 20
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
# 21
@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ù!
# 22
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!
# 23
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?# 24
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ò...
# 25
E' quello che ho fatto io, con tanto di ricompletamento dei soli dati corretti.E' stato un lavoraccio
(per me che programo da poco), ma alla fine funziona
.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.
# 26
Ottimo Luigi!Mi fa piacere vedere che, anche con un minimo di conoscienze programmazione, si riesce ad adattare lo script alle diverse esigenze/linguaggi.
# 27
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
# 28
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?
# 29
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"
# 30
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?
# 31
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
# 32
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
# 33
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
# 34
La tua è un'altra ottima soluzione.Lieto di esserti stato di aiuto

P.S. Ti perdono...anche io uso php
# 35
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
).E' solo un suggerimento di usabilità, non di funzionamento, in quanto la tua soluzione così com'è è tranquillamente operativa.
# 36
Precisazione giustissima!Grazie ancora!
Ste
# 37
PregoMamma mia, come mi è sguillata la tastiera nell'ultimo commento
# 38
Sono in francia per qualche giorno, ma è stupendo vedere che vi aiutate da soli!Ciao ragazzi!!!
# 39
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
# 40
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
# 41
Guarda, gli element file dovrebbero essere processati correttamente, però come ti consigliava Luigi ti conviene provare senza ajaxsbmt per vedere come si comporta.# 42
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
# 43
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.
# 44
...ma ora che ricordo, era una soluzione che adottava un iframe.
Mi sa che sei sulla strada giusta.
# 45
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
# 46
Ottimo consiglio! Mi pare di ricordare che avessi avuto alcune problematiche, cmq provo e provvedo.Grazie
# 47
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!?!
# 48
Esattamente che intendi per "risposte di errore"?# 49
Ok! Risolto!# 50
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!# 51
Si anche io faccio la stessa cosa
# 52
Ma la pagina contenente il form viene ricaricata nel punto dove c'è il form o all'inizio? per capirci es questa pagina è molto lunga, se io invio il commento mi viene ricaricata la pagina qui dove c'è il form o in cima?# 53
Il bello è che proprio non viene ricaricato nulla. Semmai si riceve la riposta dalla pagina e viene visualizzata nel DIV con l'ID specificato nella chiamata del Form (Es. MyResult)In questa pagina, ho utilizzato una versione evoluta:
1. Invio i dati
2. Ricevo la risposta dal form (Es. Dati inviati correttamente)e la visualizzo quì sotto.
3. Se tutto va bene faccio una chiamata (ricarico tutti i commenti) ad un'altra pagina e la visualizzo in un altro DIV ancora.
# 54
ciao, e complimenti,ma ho una curiosità.Come mai nonostante processi in post lo script visualizza una querystring nella barra del browser?
In questo caso mi passa in chiaro user e password.
Volevo integrare ajax in uno script che uso di login.
Attualmente io verifico le credenziali e poi eseguo un response redirect
Con questo script ajax se ho notato che non mi esegue il redirect ma mi processa la pagina nella stessa.
E' giusto?
Si puo fare un redirect ?
Grazie
Ciao
# 55
Lo script, se non modifcato, esegue un post e non dovrebbe vedersi alcun paramentro di querystring.Per quanto riguarda il redirect non ci dovrebbero essere problemi ma non l'ho mai provato.
# 56
Il redirect puoi farlo solo nella pagina che richiama lo script, e non nella pagina che elabora i dati.Per un redirect della pagina che ospita il form dovresti modificare qualcosina nello script di Simone.
# 57
Ciao, ho usato il tuo script ajax in diverse occasioni e sempre con successo. Adesso il mio problema è che non riesco ad utilizzarlo all'interno di joomla.Ho importato correttamente lo script nell'header della pagina ed ho scritto il sorgente dell'articolo (contenuto di joomla) includendo gli attributi necessari nel tag
L'indirizzo IP del mittente viene registrato, in ogni caso si raccomanda la buona educazione.
NewsBurner
Categorie
ASP Stats Generator (3)Curiosità (9)
dBlog (20)
Internet (32)
Personali (11)
QuestoBlog (7)
Scripts (3)
SEO (9)
Software (8)
Tecnologia (3)
Telefonia (5)
Webdesign (7)
Gli articoli più cliccatiGli ultimi articoli
01/07/2008 alle 08:30
30/06/2008 alle 16:35
21/05/2008 alle 20:55
20/05/2008 alle 16:14
15/05/2008 alle 12:23
15/05/2008 alle 11:11
13/05/2008 alle 13:31
10/05/2008 alle 16:24
07/05/2008 alle 17:12
30/04/2008 alle 15:22
Gli Ultimi commenti
Di Marco
Di Marco
Di SimoneRodriguez
Di Marco
Di Marco
Di Marco
Di Marco
Di Marco
Di Anonimo
Di SimoneRodriguez
Articolo precedente




Lascia un tuo commento
Anteprima del commento