순수 JavaScript
fetch로 HTML 폼을 점진적으로 향상하세요. 인라인 필드 오류, 상태 메시지, 페이지 새로 고침 없음.
이 페이지는 빌드 단계도 패키지도 필요 없습니다. JavaScript가 꺼져 있으면 폼은 일반 HTML POST로 작동하고, 켜져 있으면 스크립트가 fetch로 POST하고 결과를 인라인으로 보여 줍니다.
<form id="contact" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post" novalidate>
<label for="email">Email</label>
<input id="email" name="email" type="email" required aria-describedby="email-error" />
<p id="email-error" data-error-for="email"></p>
<label for="message">Message</label>
<textarea id="message" name="message"></textarea>
<p id="message-error" data-error-for="message"></p>
<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
<button>Send</button>
<p role="status" data-status></p>
</form>
<script type="module">
const form = document.querySelector("#contact");
const button = form.querySelector("button");
const status = form.querySelector("[data-status]");
function showErrors(fields = {}) {
for (const slot of form.querySelectorAll("[data-error-for]")) {
const messages = fields[slot.dataset.errorFor];
slot.textContent = messages ? messages[0] : "";
form.elements[slot.dataset.errorFor]?.setAttribute("aria-invalid", messages ? "true" : "false");
}
}
form.addEventListener("submit", async (event) => {
event.preventDefault();
button.disabled = true;
status.textContent = "Sending";
try {
const response = await fetch(form.action, {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(form),
});
const result = await response.json();
showErrors(result.ok ? {} : result.error.fields);
status.textContent = result.ok ? "Thanks, we got it." : result.error.message;
if (result.ok) form.reset();
} catch {
status.textContent = "Couldn't reach the server. Check your connection and try again.";
} finally {
button.disabled = false;
}
});
</script>Accept: application/json을 보내면 Ikiform이 리디렉션 대신 JSON으로 응답합니다.result.error.fields는 필드 ID를 키로 사용합니다. 스크립트는 각 필드 아래에 첫 번째 메시지를 표시합니다.fetch는 네트워크 오류일 때만 reject됩니다. HTTP 오류는 여전히 resolve되며, 본문에 오류 형식이 담겨 있습니다.429응답에는Retry-After가 포함되며, Ikiform이 CORS로 노출하므로 브라우저 코드에서 읽을 수 있습니다.
Ikiform 사람 확인과 함께 사용
중간 확인 페이지는 일반적인 브라우저 이동에서만 나타납니다. Ikiform 확인을 쓰는 폼에 fetch로 POST하면 대신 403 challenge_required를 받습니다. 번들러를 통해 SDK의 challenge를 사용하거나, JavaScript 없이 폼이 POST되도록 두세요.