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: 16421
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.

Nessun articolo correlato.

{ 98 commenti… leggili aggiungine uno }

1 SimoneRodriguez 21 febbraio 2008 alle 19:00

Si anche io faccio la stessa cosa ; - )

Rispondi

2 Anonimo 29 febbraio 2008 alle 20:31

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?

Rispondi

3 SimoneRodriguez 29 febbraio 2008 alle 23:11

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.

Rispondi

4 Alex 31 marzo 2008 alle 13:42

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

Rispondi

5 SimoneRodriguez 31 marzo 2008 alle 18:06

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.

Rispondi

6 Luigi 8 luglio 2008 alle 14:26

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.

Rispondi

7 Alessio 20 luglio 2008 alle 14:56

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

. Tuttavia è come se lo script venisse ignorato… e la richiesta parte stampando la risposta (le righe di un db) in una nuova pagina invece che nel div di output da me impostato.
Qualcuno ha suggerimenti in merito?
grazie in anticipo

Rispondi

8 Alessio 17 marzo 2010 alle 09:33

Ciao, purtroppo il link al file non funziona più, non è che potresti rimediare?
Grazie per la guida :D

Rispondi

9 Alessio 17 marzo 2010 alle 09:34

Come non detto, ricliccando è uscito, boh!
Grazie ancora :D

Rispondi

10 SimoneRodriguez 17 marzo 2010 alle 10:04

A me sembra che funzioni. Ti si apri direttamente il .js, fai “salva con nome” dal menu “file” del browser.

Rispondi

11 Alessio 17 marzo 2010 alle 11:49

Sìsì, infatti riprovando subito dopo aver scritto il commento si è aperto, mentre la prima volta mi aveva reindirizzato alla home del blog

Rispondi

12 Paolo 1 aprile 2010 alle 18:09

ciao a tutti ho il seguente problema … il messaggio sia esso testo o immagine non mi viene visualizzato … lavorando in locale ho inserito nel file .php che processa il tutto la funzioncina sleep() settata a 5 secondi in modo tale che ci sia il tempo fisico per visualizzare il messaggio/immagine!
Nulla mi viene restituito il valore del file .php ma nessun messaggio d’attesa

Rispondi

13 Paolo 1 aprile 2010 alle 18:23

Aggiungo solo che il problema si presenta su chrome e non ho idea del perchè lo faccia

Rispondi

14 SimoneRodriguez 1 aprile 2010 alle 18:56

Cmq ti consiglio di provare anche con la funzione setTimeout, ma non sò se fa al caso tuo.
Per poterti aiutare dovresti postare il codice.

Rispondi

15 Paolo 2 aprile 2010 alle 08:15

il codice è il seguente
<form method="post" id="addcommento" action="inserisci_commento.php" onsubmit="xmlhttpPost('inserisci_commento.php', 'addcommento', 'risultatocommento', '’); return false;”>
….

il problema credo sia di compatibilità e quindi da ricercare all’interno del file ajaxsbmt.js credo in questa porzione di codice

if (self.xmlHttpReq.readyState == 4) {
// Quando pronta, visualizzo la risposta del form
updatepage(self.xmlHttpReq.responseText,responsediv);
} else {
// In attesa della risposta del form visualizzo il msg di attesa
updatepage(responsemsg,responsediv);
}

ribadisco che il problema a me si presenta solo in chrome

Rispondi

16 Paolo 2 aprile 2010 alle 09:18

ho fatto alcuni test e la funzioncina
updatepage(responsemsg,responsediv);
se posizionata nell’if
if (self.xmlHttpReq.readyState == 4)
stampa il messaggio di attesa quindi deve esserci qualche problema con chrome nella gestione di quell’else !

spero di essere stato chiaro :)

domandina … all’interno della stessa pagina ho uno script che mi richiama una pagina php che carica tutti i commenti in un apposito DIV
$(document).ready(function(){
$(“#ultimicommenti”).load(“commenti.php”);
});

c’è un modo per far si che una volta inviato il form ed inserito il commento venga richiamata nuovamente la pagina commenti.php ?

Rispondi

17 francesco 14 giugno 2010 alle 09:26

non riesco a scaricarlo…

Rispondi

18 SimoneRodriguez 14 giugno 2010 alle 09:59

Esattamente che problemi hai?

Rispondi

19 Mauro 12 agosto 2010 alle 13:16

Ciao, ho usato il tuo script e lo trovo molto utile.
Io lo uso per validare i dati inseriti dagli utenti e stampare il risultato a video.
Problema: dopo la validazione però rimango nella pagina chiamata, mentre mi piacerebbe tornare (assieme al risultato stampato a video) sulla pagina chiamante.

Come posso fare? Premetto che sono a digiuno di javascript/ajax

Grazie mille in anticipo.

Rispondi

20 SimoneRodriguez 12 agosto 2010 alle 14:57

O non ho capito oppure qualcosa non funziona. L’utilità di questo form è proprio quella di inviare un form rimanendo nella pagina chiamante! lascia un link alla pagina che provo a vedere

Rispondi

21 Mauro 13 agosto 2010 alle 07:39

Purtroppo sto lavorando in locale, però posso postarti 2 righe di codice.
Pagina sorgente:

<form action="Valida.php" method="post" onsubmit="xmlhttpPost('Valida.php', 'validazione', 'MyResult', '’); return false;”>

Valida.php:
if(isset($_POST['via'])){
$via = new Via($_POST['via']);
}

La classe Via cerca a DB se la via è presente, se non lo è stampa un errore.
Risultato esecuzione:
il browser rimane in valida.php anche senza errori presenti.

Rispondi

22 Mauro 17 agosto 2010 alle 17:07

trovato l’arcano, non mi funziona con firefox

Rispondi

23 Giuseppe 24 agosto 2010 alle 15:27

Ciao a tutti e grazie per lo script che trovo veramente utile.
Ma come tutte le cose semplici c’è sempre una variabile.
Io uso lo script per verificare, all’uscita da un campo modulo, se dati uguali sono già presenti nel Database.
Vorrei utilizzare lo script per autocompilare il form con i dati eventualmente presenti nel DB.
Si può realizzare??
Grazie

Rispondi

24 Valda 5 settembre 2010 alle 09:53

Grazie infinite per lo script ajax del Form….
ma ho un problemino…nella funzione onsubmit, insieme a tutto il resto da inviare, (pagina, nome, div, ecc), avrei bisogno di inviare anche un numero che chiamo custID…come faccio?…quale modifiche devo apportare allo scrpt .js ?

puoi aiutarmi?…grazie infinite di nuovo
Massimo

Rispondi

25 valda 7 settembre 2010 alle 10:33

ho risolto richiamando il numero dalla pagina di elaborazione .asp
Grazie comunque dello script……

Rispondi

26 Luca 10 settembre 2010 alle 15:04

Ciao..
Come mai non processa gli input file?
Sto creando un form di upload in php che NORMALMENTE funziona,
ma se anzichè usare il metodo convenzionale utilizzo questo Ajax Script,
lo script in questione non solo non carica il file, ma è come se non prendesse
i dati dagli input file..

$_FILE['mioupload']['tmp_name'] e $_FILE['mioupload']['name']
non danno risultati..mah..
Spero qualcuno sappia aiutarmi, grazie.

Luca

Rispondi

27 guido 18 settembre 2010 alle 09:49

confermo, non processa l’INPUT FILE! :(
cmq ottimo articolo, grazie!

Rispondi

28 michele 20 settembre 2010 alle 10:40

anche a me servirebbe per fare l’upload dei file. Si può implementare?

Rispondi

29 michele 20 settembre 2010 alle 11:06

io uso c# e avrei bisogno di chiamare un javascript che fa dei controlli sulla pagina e
poi chiama una pagina che aggiorna il DB.

Il javascript fa i controlli e poi cambia l’action della form e chiama frmInput.submit

Mi da però errore di accesso negato quando tenta di chiamare il javascript.

Rispondi

30 Francesco Goffredo 6 ottobre 2010 alle 14:54

Ciao, grazie molte.
Qualcuno è riuscito a risolvere il problema di Firefox?

Grazie
F.

Rispondi

31 Filippo 18 ottobre 2010 alle 19:19

Con Safari non viene visualizzato il response div vi risulta ?

Rispondi

32 Francesco Goffredo 19 ottobre 2010 alle 07:45

io con safari lo visualizzo perfettamente
con firefox, invece, lo carica in una nuova pagina e non capisco il perchè
ho controllato nel *.js ma sembra tutto in ordine!

Rispondi

33 Filippo 20 ottobre 2010 alle 07:21

mi correggo con safari apre cooretto il response nel div ma non mostra l’ immagine di preload

Rispondi

34 mahmud 21 novembre 2010 alle 07:13

Hi,
This Script problem with enctype=”multipart/form-data”!
don’t work!
help me.

Rispondi

35 carlito 5 dicembre 2010 alle 16:46

ciao ottimo script davvero

se nel response ajax ci fosse del codice javascript come sarebbe possibile caricarlo correttamente visto che ora come ora non funziona?

thanks

Rispondi

36 Loelle80 17 dicembre 2010 alle 17:01

Salve, come si fa per visualizzare la gif mentre carica? Se inserisco il codice HTML al posto di Wait mi da errore..

Rispondi

37 Loelle80 17 dicembre 2010 alle 18:22

ok appo risoltu abbaidende su codice sorgente de sa pagina DEMO fattende ai: ‘<img src=\’.immaigne.gif\’>’ grazie su mantessi!!

Rispondi

38 giuseppe 13 gennaio 2011 alle 15:29

ciao ragazzi,
scusatemi, ma sapete come potrei fare a resettare tutti i campi del form, una volta che i dati sono stati inviati correttamente !?

Rispondi

39 Loelle80 13 gennaio 2011 alle 16:37

Io ho fatto così: apri il file ajaxsbmt.js e prima della riga return qstr; scrivi (per esempio):

document.MyForm.sample_text.value=”";
document.MyForm.nomeCampo1.value=”";
document.MyForm.nomeCampo2.value=”";

Og?

Rispondi

40 giuseppe 14 gennaio 2011 alle 10:21

ti ringrazio, ma a me interessava csncellare i campi solo se l’operazione ha avuto esito positivo.

Invece come mi hai suggerito tu..se ci sono stati degli errori nella compilazione e che nel DIV di risposta è stato visualizzato, mi vengono cancellate ugualmente tutti i campi .

Rispondi

41 meabe 18 gennaio 2011 alle 13:59

Hello, i have a little problem with this nice function when i using tinyMCE editor.
When i have enabled editor on textarea and submit form, submited value from textarea are same.
Please help me…

Rispondi

42 Vinicius 28 febbraio 2011 alle 00:34

Muito bom, sistema simples e funcional.

Rispondi

43 Plínio Thalles 8 marzo 2011 alle 09:38

Ciao Simone, è stata la ricerca su internet circa la presentazione delle forme in ajax, quando ho trovato il vostro blog e ho visto il tuo script, testato e approvato. Molto bene!
Solo che si tratta di un piccolo problema che ho provato ma non riusciva a risolvere.
Il problema è accentuato nei dati (set di caratteri), quando l’invio dei dati, un testo con gli accenti per esempio, ritorna con un “?”.
Come risolvere questo problema? Grazie!

Rispondi

44 Gennaro 5 aprile 2011 alle 17:52

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ò…

Ciao Simone, potresti essere più chiaro a riguardo, casomai di postare il codice come esempio.
Grazie e a presto

Rispondi

45 Gennaro 5 aprile 2011 alle 18:56

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ò…

Ciao Simone, scusami ma potresti postare qualche esempio, su come realizzare quello che hai scritto nellle indicazioni qui sopra allegate.
Grazie

Rispondi

46 Peter 15 aprile 2011 alle 02:55

Is there a way to add confirmation dialog to this script?
Thank you

Rispondi

47 damien 6 luglio 2011 alle 06:31

For the texte zone treatement you could add
GetElemValue(elemName, encodeURIComponent(element.value));

Rispondi

48 Ricki 13 ottobre 2011 alle 19:32

Ciao SImone

Spero che mi risponderai.

Ma se volessi inserire più di un bottone nella stessa pagina come faccio?
Ho provato ad inserirne 3 ma qualsiasi dei tre che premo mi esegue le operazioni sempre sul primo gruppo di dati.
Ho provato a mettere class invece che id ma non cambia nulla

Rispondi

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: