Pengiriman formulir HTML5 menit baca
Penjelasan atribut action di formulir HTML
Apa fungsi atribut action formulir, bagaimana nilai relatif dan kosong di-resolve, bagaimana formaction mengirim satu formulir ke dua tempat, dan mengapa host statis menjawab 405.
Atribut action adalah URL tujuan data formulir. Nilai relatif di-resolve terhadap alamat halaman, nilai kosong atau tidak ada berarti halaman itu sendiri, dan formaction di tombol submit menimpanya untuk tombol itu. Di situs statis, atur ke URL lengkap backend formulir seperti https://ikiform.com/f/<formId>, karena host Anda sendiri tidak bisa menerima POST.
Kebanyakan formulir yang rusak di situs statis rusak di atribut yang satu ini. Markup terlihat baik, tombol berfungsi, dan browser menampilkan 405 atau halaman kosong, karena data pergi ke tempat yang tidak bisa menerimanya. Halaman ini menunjukkan persis ke mana sebuah action mengirim data, lalu memakai formaction untuk mengarahkan satu formulir ke dua inbox.
Apa yang berbeda di sini
action adalah URL seperti href lainnya, dengan satu perbedaan: formulir tanpa action bukannya tidak melakukan apa-apa, melainkan mengirim ke halaman tempatnya berada. Di situs yang dirender server, halaman itu mungkin menangani post. Di host statis tidak bisa, jadi action yang tidak ada atau relatif baru gagal setelah Anda deploy.
Ke mana setiap nilai mengirim data
Ambil halaman di https://example.com/company/contact.html dan lima formulir di dalamnya:
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
<form action="/api/contact" method="post">
<form action="send" method="post">
<form action="" method="post">
<form method="post">| action | Di-resolve menjadi | Di host statis |
|---|---|---|
https://ikiform.com/f/frm_... | Persis URL itu | Berfungsi. Ikiform menerima POST |
/api/contact | https://example.com/api/contact | Hanya berfungsi jika host Anda menjalankan function di path itu |
send | https://example.com/company/send, relatif terhadap folder | 405 atau 404 |
"" (empty) | Halaman itu sendiri, contact.html | 405 di kebanyakan host statis |
| Tidak ada | Halaman itu sendiri | 405 di kebanyakan host statis |
- Action absolut dipakai persis seperti tertulis, jadi post sampai ke Ikiform, yang menjawab dengan redirect.
- Action relatif, kosong, atau tidak ada di-resolve terhadap alamat halaman itu sendiri, atau terhadap elemen base jika halaman punya.
- Post lalu pergi ke host Anda sendiri. Host statis hanya menyajikan file, jadi menolak POST, biasanya dengan 405.
<base href> di head halaman mengubah cara setiap URL relatif di-resolve, termasuk action. Beberapa site builder dan penyiapan single-page app menambahkannya. Gunakan URL lengkap dan itu tidak akan berpengaruh.Periksa apa yang akan dipakai browser
Di console browser, atribut dan property berbeda. getAttribute mengembalikan apa yang Anda tulis; property action mengembalikan URL hasil resolve yang benar-benar akan dituju browser:
const form = document.querySelector("form");
form.getAttribute("action");
form.action;Jika form.action menampilkan domain Anda sendiri, ke sanalah data pergi. Builder seperti Webflow dan Framer sering mengatur action dari panel pengaturannya sendiri, jadi periksa halaman yang dipublikasikan, bukan source Anda. Panduan site builder menyebutkan di mana setiap builder menyimpannya.
Satu formulir, dua inbox
formaction di tombol submit menggantikan action formulir hanya untuk tombol itu. Di sini, satu set field dikirim ke dua formulir Ikiform. Ask support mengirim ke formulir support, Talk to sales ke formulir sales, dan setiap formulir Ikiform mengirim email ke penerimanya sendiri:
<form action="https://ikiform.com/f/frm_supportxxxxxxxxx" method="post">
<label for="email">Email</label>
<input id="email" name="email" type="email" autocomplete="email" required />
<label for="message">How can we help?</label>
<textarea id="message" name="message" rows="5" required></textarea>
<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
<button>Ask support</button>
<button formaction="https://ikiform.com/f/frm_salesxxxxxxxxxxx">Talk to sales</button>
</form>- Setiap formulir Ikiform punya penerima notifikasi, pengaturan spam, dan webhook sendiri, jadi support dan sales tidak pernah melihat email satu sama lain.
- Kedua formulir butuh definisi field yang sama, atau tidak ada sama sekali. Dengan field terdefinisi, field yang tidak dikenal salah satu formulir ditolak dengan
422. - Atribut
form*lainnya bekerja dengan cara yang sama:formmethod,formenctype,formnovalidate, danformtarget. Tombol Save draft denganformnovalidatemelewati pemeriksaan browser. formactionhanya bekerja di tombol submit:<button>,<input type="submit">, dan<input type="image">.
Alternatifnya adalah satu formulir Ikiform dengan field topic, dan pengarahan berdasarkan topik di webhook atau filter inbox Anda. Itu mempertahankan satu daftar dan satu ekspor. Dua formulir lebih sederhana jika kedua tim sama sekali tidak boleh berbagi penerima.
action dengan query string
Dengan method="get", browser mengganti query string action dengan field formulir. lang=de di formulir pertama di bawah dibuang diam-diam; formulir kedua mempertahankannya sebagai input tersembunyi:
<form action="/search?lang=de" method="get">
<input name="q" />
</form>
<form action="/search" method="get">
<input name="q" />
<input type="hidden" name="lang" value="de" />
</form>Dengan method="post" query string dipertahankan, karena field masuk ke body. Itu tidak mengubah apa pun bagi Ikiform: parameter query di URL endpoint tidak disimpan, jadi gunakan input tersembunyi untuk nilai yang ingin Anda simpan.
Input di luar formulir
Layout terkadang butuh input yang tidak berada di dalam elemen <form>, seperti pendaftaran di footer di samping konten lain. Atribut form di input atau tombol menggabungkannya ke formulir berdasarkan id, dan input itu dikirim ke action formulir tersebut:
<form id="newsletter" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post"></form>
<footer>
<input form="newsletter" name="email" type="email" required />
<button form="newsletter">Subscribe</button>
</footer>Action mailto: dan javascript:
action="mailto:you@example.com" meminta aplikasi email pengunjung membuka pesan berisi field. Tidak ada yang terkirim kecuali mereka punya aplikasi email yang sudah disiapkan dan menekan kirim, dan Anda tidak pernah tahu bahwa mereka mencoba. action="javascript:..." menjalankan kode alih-alih mengirim dan diblokir oleh kebanyakan content security policy. Keduanya layak diganti dengan endpoint sungguhan.
Pastikan berfungsi
- Di Allowed domains formulir, tambahkan domain situs Anda, ditambah
localhostselama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja. - Buka halaman yang dipublikasikan, bukan source Anda, dan jalankan
document.querySelector("form").actiondi console. Hasilnya menampilkan URL Ikiform lengkap Anda. - Kirim formulir. Panel Network menampilkan POST ke
ikiform.comyang dijawab303, bukan POST ke domain Anda sendiri. - Di formulir dua inbox, kirim sekali dengan setiap tombol. Setiap kiriman muncul di bawah formulirnya sendiri di dashboard.
- Cek inbox setiap penerima notifikasi. Masing-masing mendapat email berisi field, dan Reply terkirim ke pengirim formulir jika formulir punya field
email.
Hal yang sering menjebak
| Masalah | Penyebab dan solusi |
|---|---|
405 Method Not Allowed dari domain Anda sendiri | Action relatif, kosong, atau tidak ada, jadi post pergi ke host statis Anda. Gunakan URL Ikiform lengkap |
404 not_found dari ikiform.com | Id formulir di action salah, atau formulir sudah dihapus. Salin endpoint dari halaman formulir di dashboard |
| Builder terus me-reset action | Beberapa builder menguasai action dari blok formulirnya. Gunakan pengaturan custom action mereka, atau embed dengan markup Anda sendiri |
| Browser memperingatkan bahwa formulir tidak aman | Action memakai http: di halaman https:. Endpoint Ikiform hanya https:; perbaiki skemanya |
| Field dari formulir kedua ikut terkirim | Formulir tidak bisa bersarang. Browser menutup formulir luar di tag <form> bagian dalam. Gunakan atribut form sebagai gantinya |
Untuk alur pengiriman lengkap, dari klik hingga redirect, lihat ringkasan. Semua yang diterima endpoint ada di formulir HTML.
Pertanyaan
Formulir mengirim ke halaman tempatnya berada. Itu berfungsi jika server Anda menangani post di URL tersebut, tetapi di host statis akan gagal, biasanya dengan 405 Method Not Allowed.
action diatur di formulir dan berlaku untuk setiap submit. formaction diatur di satu tombol submit dan menimpa action saat tombol itu dipakai, jadi satu formulir bisa mengirim ke dua tempat.
Bisa. Browser mengirim lintas situs tanpa penyiapan khusus, begitulah halaman statis mengirim ke backend formulir. Server penerima yang memutuskan apakah menerimanya; Ikiform memeriksa origin halaman terhadap allowed domains formulir.
Dengan method get, browser mengganti query string action dengan field formulir itu sendiri. Pindahkan setiap parameter ke input tersembunyi. Dengan method post, query string dipertahankan.
Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.