Inviare moduli con JavaScript (AJAX)
Disponibile su: Tutti i piani
Puoi usare @formspree/ajax per inviare i tuoi moduli Formspree con JavaScript puro, senza scrivere la tua logica di invio con fetch, Axios o jQuery.
La libreria funziona con i moduli HTML standard e aggiunge una gestione dichiarativa del modulo tramite data attribute o una piccola API JavaScript. Gestisce automaticamente l’invio del modulo, lo stato di caricamento, gli errori di validazione e i messaggi di successo.
Come funziona
@formspree/ajax ti offre un modo dichiarativo per configurare un modulo. Invece di ascoltare manualmente gli eventi di submit e scrivere la tua gestione delle richieste, contrassegni il tuo modulo con data attribute e lo inizializzi con l’ID del tuo modulo Formspree.
Per impostazione predefinita, la libreria gestisce:
- l’invio del modulo
- lo stato di caricamento sul pulsante di invio
- gli errori di validazione a livello di campo
- gli errori a livello di modulo
- i messaggi di successo
- lo stato di campo non valido con
aria-invalid="true"
Ecco come implementarla nel tuo progetto:
Passaggio 1: configura @formspree-ajax nel tuo progetto
Puoi usare @formspree/ajax in due modi, a seconda della tua configurazione:
- Con un bundler (ESM tramite npm/yarn)
- Senza un bundler (tag script/CDN)
Opzione 1: usare un bundler (ESM)
Installa la libreria:
npm install @formspree/ajax # via npm, or
yarn add @formspree/ajax # via yarn
E inizializza il tuo modulo in JavaScript:
import { initForm } from '@formspree/ajax';
initForm({
formElement: '#contact-form',
formId: 'YOUR_FORM_ID',
});
Assicurati che l’ID del tuo elemento modulo HTML corrisponda all’ID che passi nella proprietà formElement. E sostituisci YOUR_FORM_ID con l’ID del modulo che ricevi nella dashboard Formspree.
Opzione 2: usare un tag script (nessun passaggio di build)
Se non usi un bundler, aggiungi questo snippet prima del tag di chiusura </body>:
<script>
window.formspree =
window.formspree ||
function () {
(formspree.q = formspree.q || []).push(arguments);
};
formspree(
'initForm',
{ formElement: '#contact-form', formId: 'YOUR_FORM_ID' }
);
</script>
<script src="https://unpkg.com/@formspree/ajax@1" defer></script>
Come per la prima opzione, assicurati che l’ID del tuo elemento modulo HTML corrisponda all’ID che passi nella proprietà formElement. E sostituisci YOUR_FORM_ID con l’ID del modulo che ricevi nella dashboard Formspree.
Passaggio 2: costruisci il tuo modulo
Una volta configurato @formspree/ajax nel tuo progetto, ecco come puoi creare un modulo con esso:
<div data-fs-success></div>
<div data-fs-error></div>
<form id="contact-form">
<label for="email">Email</label>
<input type="email" id="email" name="email" data-fs-field />
<span data-fs-error="email"></span>
<button type="submit" data-fs-submit-btn>Send</button>
</form>
Ancora una volta, assicurati che il valore nell’attributo
iddel tuo modulo corrisponda all’ID che hai passato comeformIdnella chiamatainitFormnel passaggio precedente.
La libreria invierà automaticamente il modulo a Formspree, disabiliterà il pulsante di invio mentre la richiesta è in corso, mostrerà gli errori di validazione e visualizzerà un messaggio di successo.
Data attribute
La libreria @formspree-ajax include alcuni attributi che ti permettono di controllare il comportamento del modulo senza richiedere ulteriore JavaScript.
data-fs-error="fieldName"
Usalo su un elemento <span> o <div> per visualizzare gli errori di validazione a livello di campo.
<span data-fs-error="email"></span>
Se l’elemento è vuoto, Formspree inserisce il messaggio di errore dell’API. Se l’elemento contiene già del contenuto, quel contenuto viene mostrato o nascosto.
data-fs-error
Usalo senza un valore per visualizzare gli errori a livello di modulo.
<div data-fs-error></div>
È utile per gli errori di invio generali che non appartengono a un campo specifico.
data-fs-success
Usalo per mostrare un messaggio di successo dopo l’invio.
<div data-fs-success></div>
Se l’elemento è vuoto, viene mostrato il messaggio predefinito. Se contiene già del contenuto, viene usato quel contenuto.
data-fs-field
Usalo sui campi del modulo che dovrebbero ricevere aria-invalid="true" quando la validazione fallisce.
<input type="email" name="email" data-fs-field />
La libreria legge il nome del campo dall’attributo name dell’elemento.
data-fs-submit-btn
Usalo sul pulsante di invio, in modo che venga disabilitato durante l’invio e riabilitato successivamente.
<button type="submit" data-fs-submit-btn>Send</button>
Comportamento predefinito
Se non sovrascrivi nulla, la libreria fornisce impostazioni predefinite sensate:
- Il pulsante di invio viene disabilitato mentre il modulo è in fase di invio.
- Gli errori di campo vengono visualizzati all’interno degli elementi
data-fs-error="fieldName"corrispondenti. - I campi non validi ricevono
aria-invalid="true". - Un messaggio di successo viene mostrato nell’elemento
data-fs-success. - Un messaggio di errore a livello di modulo viene mostrato nell’elemento
data-fs-error. - Se non c’è un elemento
data-fs-successe nessun handleronSuccesspersonalizzato, il modulo viene sostituito con un messaggio “Thank you!”. - Se c’è un elemento
data-fs-successe nessun handleronSuccesspersonalizzato, il modulo viene reimpostato dopo un invio riuscito. - Gli stili predefiniti di base vengono iniettati automaticamente.
Configurazione avanzata
La libreria offre anche modi per personalizzare ulteriormente il comportamento e l’aspetto del tuo modulo.
Aggiungere dati extra a ogni invio
Puoi usare l’opzione data per aggiungere valori aggiuntivi a ogni invio del modulo. I valori possono essere:
- stringhe statiche
- funzioni sincrone
- funzioni asincrone
Tutti i valori undefined vengono ignorati. Ecco come usarla:
initForm({
formElement: '#my-form',
formId: 'YOUR_FORM_ID',
// This data will be added to every submission
data: {
source: 'landing-page',
referrer: () => document.referrer || undefined,
sessionId: async () => await fetchSessionId(),
},
});
È utile per allegare metadati come nomi di campagne, fonti di referral o ID di sessione senza aggiungere input nascosti al tuo HTML.
Callback del ciclo di vita
Puoi agganciarti alle diverse fasi del ciclo di vita dell’invio.
initForm({
formElement: '#contact-form',
formId: 'YOUR_FORM_ID',
// Called when the form is initialized
onInit: (context) => {
console.log('Form initialized');
},
// Called before submission is sent.
onSubmit: (context) => {
console.log('Submitting form');
},
// Called on successful submission.
onSuccess: (context, result) => {
console.log('Submission succeeded', result);
},
// Called if validation errors are received from Formspree
onError: (context, error) => {
console.log('Validation error', error);
},
// Called if unexpected errors are received (e.g., network failure).
onFailure: (context, error) => {
console.log('Unexpected error', error);
},
});
L’oggetto context contiene il modulo corrente (HTMLFormElement), i dettagli dell’endpoint, il client e l’oggetto config che hai passato a initForm.
Questi callback possono essere usati per:
- Tracciare eventi (analytics, conversioni, abbandoni)
- Mostrare UI personalizzata (spinner, toast, banner)
- Reindirizzare dopo un invio riuscito
- Effettuare il logging o il debug di richieste e fallimenti
- Gestire in modo personalizzato gli errori di validazione o a livello di modulo
- Eseguire side effect prima o dopo l’invio (ad esempio, salvare lo stato, attivare workflow)
Rendering personalizzato
Puoi sovrascrivere il comportamento predefinito dell’UI fornendo metodi di rendering personalizzati in initForm(). È utile se vuoi il pieno controllo su come appaiono gli stati di caricamento, gli errori e i messaggi di successo.
initForm({
formElement: '#contact-form',
formId: 'YOUR_FORM_ID',
enable: (context) => {},
disable: (context) => {},
renderFieldErrors: (context, error) => {},
renderSuccess: (context, message) => {},
renderFormError: (context, message) => {},
});
Metodi disponibili
| Metodo | Quando viene eseguito | Usi comuni |
|---|---|---|
disable(context) | Quando inizia l’invio | Aggiungere uno stato di caricamento, disabilitare pulsanti/input |
enable(context) | Dopo il completamento dell’invio | Rimuovere gli spinner, riabilitare l’UI |
renderFieldErrors(context, error) | In caso di errori di validazione | UI di errore personalizzata, errori raggruppati, messaggi toast |
renderSuccess(context, message) | In caso di invio riuscito | Sostituire il modulo, mostrare un toast, reindirizzare |
renderFormError(context, message) | In caso di errori a livello di modulo | Banner di errore, avvisi, messaggistica centralizzata |
Ecco come usarli:
initForm({
formElement: '#contact-form',
formId: 'YOUR_FORM_ID',
disable: ({ form }) => form.classList.add('loading'),
enable: ({ form }) => form.classList.remove('loading'),
renderSuccess: ({ form }, message) => {
form.innerHTML = `<p>${message}</p>`;
},
});
Stili
La libreria include stili predefiniti per errori, campi non validi e messaggi di successo. Puoi sovrascriverli con i tuoi CSS.
[data-fs-error] {
color: #dc3455;
}
[data-fs-field][aria-invalid='true'] {
border-color: #dc3455;
}
[data-fs-success][data-fs-active] {
background: #de4dda;
}
[data-fs-error=''][data-fs-active] {
background: #f87dda;
color: #72c124;
}
Pulizia
initForm() restituisce un handle con un metodo destroy(). Puoi usarlo se hai bisogno di ripulire il comportamento del modulo in un secondo momento.
const handle = initForm({
formElement: '#contact-form',
formId: 'YOUR_FORM_ID',
});
// Clean up when needed
handle.destroy();
Esempio ESM completo
Ecco un esempio completo che usa un modulo HTML semplice e @formspree/ajax con un bundler. Per prima cosa, inizializza il modulo con l’ID del tuo modulo Formspree:
import { initForm } from '@formspree/ajax';
initForm({
formElement: '#contact-form',
formId: 'YOUR_FORM_ID',
});
Quindi crea il modulo HTML con i data attribute descritti sopra:
<div data-fs-success></div>
<div data-fs-error></div>
<form id="contact-form">
<label for="email">Email</label>
<input type="email" id="email" name="email" data-fs-field />
<span data-fs-error="email"></span>
<label for="message">Message</label>
<textarea id="message" name="message" data-fs-field></textarea>
<span data-fs-error="message"></span>
<button type="submit" data-fs-submit-btn>Send</button>
</form>
Esempio con tag script
Se vuoi usare la libreria senza un passaggio di build, puoi inizializzarla direttamente nel browser:
<div data-fs-success></div>
<div data-fs-error></div>
<form id="my-form">
<label for="email">Email</label>
<input type="email" id="email" name="email" data-fs-field />
<span data-fs-error="email"></span>
<label for="message">Message</label>
<textarea id="message" name="message" data-fs-field></textarea>
<span data-fs-error="message"></span>
<button type="submit" data-fs-submit-btn>Submit</button>
</form>
<script>
window.formspree =
window.formspree ||
function () {
(formspree.q = formspree.q || []).push(arguments);
};
formspree('initForm', {
formElement: '#my-form',
formId: 'YOUR_FORM_ID',
});
</script>
<script src="https://unpkg.com/@formspree/ajax@1" defer></script>
Migrazione dal codice AJAX manuale
Se in precedenza hai inviato moduli con codice personalizzato fetch, Axios o jQuery, @formspree/ajax ti offre un’alternativa più semplice. Invece di farlo manualmente:
- ascoltare gli eventi di submit
- serializzare i dati del modulo
- inviare le richieste
- analizzare gli errori di validazione
- aggiornare il DOM per gli stati di successo e fallimento
Puoi inizializzare la libreria una volta e lasciare che gestisca questi aspetti per te.
Nota sui framework
Questa libreria è progettata per JavaScript vanilla e moduli HTML standard. Se usi React, dai un’occhiata alla nostra libreria React.