यदि आपने कभी कोई contact form बनाया है और देखा है कि user के "Submit" पर click करने के बाद पूरा page reload हो जाता है, तो आप जानते हैं कि यह experience कितना परेशान करने वाला होता है। HTML form submit fetch javascript तकनीकों का उपयोग करके, आप form data को background में backend endpoint पर भेज सकते हैं, user को same page पर रख सकते हैं, और बिना किसी full-page refresh के clean success या error message दिखा सकते हैं। यह tutorial आपको हर step के माध्यम से guide करता है, basic HTML लिखने से लेकर आपके fetch() call को Sendform endpoint पर point करने तक ताकि आपके submissions सीधे आपके inbox या connected workflow में पहुंचें।
मुख्य बातें:
- Fetch API आपको page reload के बिना form data submit करने देता है, जिससे users को smoother experience मिलता है।
submitevent को capture करना औरpreventDefault()call करना किसी भी ajax form submit pattern की foundation है।- Sendform एक ready-made endpoint URL प्रदान करता है, इसलिए submissions receive और store करने के लिए आपको zero backend code की जरूरत है।
- Proper response handling (success या error feedback दिखाना) data को correctly भेजने जितना ही महत्वपूर्ण है।
विषय सूची
Default Form Submit के बजाय fetch() क्यों Use करें
Browser का default form submission behavior बिल्कुल एक काम करता है: यह form fields को serialize करता है, action URL पर POST (या GET) request भेजता है, और फिर server जो भी response return करता है उसे load करता है। इसका मतलब है कि user को white flash दिखता है, वे अपनी scroll position खो देते हैं, और नए page के paint होने का इंतजार करते हैं। Slow connection पर, यह broken लग सकता है।
Fetch API इसे programmatically HTTP requests बनाकर, पूरी तरह से JavaScript में, बिना navigate away किए solve करता है। यह page reload के बिना form submit pattern को enable करता है जो users को engaged रखता है और आपको user experience के हर aspect पर control देता है, including loading states, inline validation feedback, और animated success banners।
fetch() को prefer करने के अतिरिक्त practical reasons:
- आप custom headers attach कर सकते हैं (जैसे CSRF token या authorization key) जो plain HTML form नहीं भेज सकता।
- आप data को JSON,
FormData, या URL-encoded strings के रूप में serialize कर सकते हैं, endpoint की expectation के अनुसार। - Error handling explicit है। आप decide करते हैं कि "failure" का क्या मतलब है और इसे कैसे communicate करना है।
- यह किसी भी static site पर काम करता है, including GitHub Pages, Netlify, या CDN पर hosted sites, क्योंकि logic पूरी तरह से browser में रहती है।
नोट: यदि आप Webflow, WordPress, या Hugo जैसे website builder के साथ काम कर रहे हैं, तो same fetch() approach apply होता है। Platform-specific tips के लिए हमारी guide देखें अपने website builder के साथ Sendform को integrate कैसे करें।
Basic HTML Form Setup
JavaScript की एक भी line लिखने से पहले, आपको एक well-structured HTML form की जरूरत है। यहाँ key detail यह है कि आपको कहीं भी point करने वाले action attribute की जरूरत नहीं है, क्योंकि JavaScript submission handle करेगा। हालांकि, आप हर input पर meaningful name attributes चाहते हैं - ये submitted payload में field keys बन जाते हैं।
<form id="contact-form" novalidate>
<div>
<label for="name">आपका नाम</label>
<input type="text" id="name" name="name" required placeholder="जेन स्मिथ">
</div>
<div>
<label for="email">ईमेल पता</label>
<input type="email" id="email" name="email" required placeholder="[email protected]">
</div>
<div>
<label for="message">संदेश</label>
<textarea id="message" name="message" rows="5" required></textarea>
</div>
<button type="submit">संदेश भेजें</button>
<!-- Feedback area -->
<div id="form-feedback" aria-live="polite"></div>
</form>इस markup में कुछ बातें worth noting हैं:
- Form element पर
novalidatenative browser validation bubbles को disable करता है, आपको JavaScript में error messaging पर full control देता है। aria-live="polite"के साथid="form-feedback"div वह जगह है जहाँ success और error messages appear होंगे। ARIA attribute ensure करता है कि screen readers feedback को automatically announce करें।- हर input में
id(label association के लिए) औरname(form payload के लिए) दोनों हैं।
Submit Event को Capture करना
किसी भी javascript form submission में पहला step browser के default behavior को intercept करना है। आप यह form element पर submit event को listen करके और तुरंत event.preventDefault() call करके करते हैं।
const form = document.getElementById('contact-form');
form.addEventListener('submit', async function (event) {
event.preventDefault(); // Default page navigation को रोकें
// Basic client-side validation
const name = form.elements['name'].value.trim();
const email = form.elements['email'].value.trim();
const message = form.elements['message'].value.trim();
if (!name || !email || !message) {
showFeedback('कृपया सभी fields भरें।', 'error');
return;
}
// Data भेजने के लिए proceed करें (अगला section)
await submitForm({ name, email, message });
});Validation logic को network call से separate करके, आप code को readable और extend करने में easy रखते हैं। Event handler पर async keyword आपको इसके अंदर await use करने देता है, जो Fetch API form data call को synchronous दिखाता है और deeply nested promise chains से बचाता है।
fetch() को Sendform Endpoint पर Point करना
यहाँ असली काम होता है। Form submissions को receive, store, और forward करने के लिए अपना server बनाने के बजाय, आप अपने backend के रूप में Sendform का उपयोग कर सकते हैं। Sendform dashboard में form create करने के बाद, आपको एक unique endpoint URL मिलता है। वह URL ही आपको चाहिए।
नीचे दिया गया submission function payload बनाने के लिए FormData API का उपयोग करता है, जिसे Sendform natively accept करता है:
async function submitForm(data) {
// इस URL को अपने actual Sendform endpoint से replace करें
const SENDFORM_ENDPOINT = 'https://sendform.net/en/YOUR_FORM_ID';
const formData = new FormData();
formData.append('name', data.name);
formData.append('email', data.email);
formData.append('message', data.message);
try {
const response = await fetch(SENDFORM_ENDPOINT, {
method: 'POST',
body: formData,
});
if (response.ok) {
showFeedback('धन्यवाद! आपका संदेश भेज दिया गया है।', 'success');
form.reset();
} else {
const errorData = await response.json().catch(() => ({}));
const errorMsg = errorData.message || 'कुछ गलत हुआ। कृपया फिर से कोशिश करें।';
showFeedback(errorMsg, 'error');
}
} catch (networkError) {
showFeedback('नेटवर्क error। अपना connection check करें और फिर से कोशिश करें।', 'error');
}
}इस code में किए गए key decisions:
- कोई
Content-Typeheader manually set नहीं किया गया है। जब आप body के रूप मेंFormDataobject pass करते हैं, browser automatically correctmultipart/form-databoundary set करता है। response.okcheck सभी 2xx HTTP status codes को cover करता है, न कि सिर्फ 200। यहresponse.status === 200compare करने से ज्यादा robust है।- Outer
try/catchnetwork-level failures (DNS errors, offline state) को catch करता है जिन्हेंresponse.okकभी नहीं देख पाता।
Response Handle करना - Success और Error Messages
Data भेजना केवल आधा काम है। Users को immediate, clear feedback की जरूरत होती है। ऊपर referenced showFeedback() helper function आपके HTML में add किए गए feedback div में message लिखता है:
function showFeedback(message, type) {
const feedbackEl = document.getElementById('form-feedback');
feedbackEl.textContent = message;
feedbackEl.className = type === 'success' ? 'feedback-success' : 'feedback-error';
}यह intentionally minimal है। Real project में आप textContent को animated component या toast notification library से swap कर सकते हैं, लेकिन pattern same रहता है: fetch() call के outcome के based पर DOM को update करना।
More advanced scenarios के लिए, जैसे custom thank-you page पर redirect करना या submission के बाद downstream automation trigger करना, हमारा article देखें webhooks, Zapier, और APIs के साथ form workflows को automate कैसे करें।
Best Practices और Tips
Code को work करवाना एक बात है। इसे production में hold up करने वाले तरीके से ship करना दूसरी बात है। यहाँ सबसे important tips हैं जो ध्यान में रखने चाहिए:
- Request के दौरान submit button को disable करें।
fetch()call करने से पहलेbutton.disabled = trueset करें औरfinallyblock में re-enable करें। यह duplicate submissions को prevent करता है अगर user multiple times click करता है। - Loading state दिखाएं। Request in flight के दौरान button text को "भेजा जा रहा है..." में change करें या spinner class add करें। जो users को कोई feedback नहीं दिखता वे अक्सर assume करते हैं कि कुछ नहीं हुआ और फिर से click करते हैं।
- Server side पर भी validate करें। Client-side validation user experience के लिए है। Sendform और कोई भी backend service को सभी incoming data को untrusted treat करना चाहिए।
- हर जगह HTTPS use करें। Plain HTTP पर form data भेजना user input को transit में expose करता है। Sendform endpoints default रूप से HTTPS हैं, लेकिन sure करें कि आपका अपना page भी HTTPS पर served है।
- Spam protection add करें। Honeypot field या CAPTCHA integration junk submissions को significantly reduce करता है। इस topic पर deeper look के लिए, हमारी guide देखें forms के लिए spam protection best practices।
- Error path को deliberately test करें। Temporarily endpoint URL को कुछ invalid में change करें और confirm करें कि आपका error message appear होता है। ज्यादातर developers सिर्फ happy path test करते हैं।
- Endpoint URL को version control से बाहर रखें। यदि आपका project open source है, तो Sendform endpoint को environment variable या config file में store करें जो
.gitignoreमें listed है।
Static site users: यदि आपका project Hugo, Eleventy, या plain HTML site है बिना server के, तो यहाँ described fetch() approach recommended method है। हमारी guide में और पढ़ें static sites के लिए serverless form handling।
निष्कर्ष
Default form submission को fetch() call से replace करना किसी भी contact या lead-capture form में आप जो highest-impact improvements कर सकते हैं उनमें से एक है। Result एक faster, more professional experience है जो users को आपके page पर रखता है और आपको feedback messaging पर full control देता है। इसे Sendform endpoint के साथ pair करें और आप किसी भी server-side code की जरूरत को पूरी तरह से eliminate कर देते हैं। आपका form live है, आपके submissions आपके inbox तक पहुंचते हैं, और आपके users को कभी jarring page reload नहीं दिखता। आज ही अपना free Sendform endpoint बनाएं और minutes में अपना पहला submission delivered करवाएं।
अक्सर पूछे जाने वाले प्रश्न
हाँ। क्योंकि fetch() पूरी तरह से browser में run करता है, यह static HTML sites, JAMstack projects, और किसी भी platform पर काम करता है जो HTML serve करता है। आपको अपने खुद के server की जरूरत नहीं है। केवल requirement एक endpoint (जैसे Sendform URL) है जो POST request receive कर सके।
fetch() XMLHttpRequest का modern replacement है। यह Promises use करता है, async/await support करता है, और cleaner API है। नए projects के लिए, fetch() हमेशा preferred है। दोनों same ajax form submit result achieve करते हैं, लेकिन fetch() को significantly कम boilerplate code की जरूरत होती है।
नहीं। जब आप FormData object को body के रूप में pass करते हैं, browser automatically Content-Type को multipart/form-data पर set करता है और correct boundary string include करता है। इसे manually set करना actually उस boundary value को omit करके request को break कर देगा।
Sendform पर sign up करें, dashboard में नया form create करें, और generated endpoint URL copy करें। उस URL को अपने fetch() call में target के रूप में paste करें। Submissions तुरंत आपके configured email address पर forward हो जाएंगे।
Network failure fetch() Promise को reject कराती है, जो example code में outer try/catch block द्वारा catch होती है। User को आपके defined "Network error" message दिखता है। Submission automatically queue नहीं होती; connectivity restore होने पर user को फिर से try करना होगा।