Pengesahan Borang (Constraint Validation API)
Guna peraturan terbina HTML (`required`, `type`, `pattern`) dengan mesej ralat anda sendiri yang mudah diakses — tanpa library.
Pratonton langsung Buka dalam Playground
<form id="signup" novalidate>
<div class="field">
<label for="name">Name</label>
<input id="name" name="name" required minlength="2"
autocomplete="name" aria-describedby="name-error">
<p class="error" id="name-error"></p>
</div>
<div class="field">
<label for="email">Email</label>
<input id="email" name="email" type="email" required
autocomplete="email" aria-describedby="email-error">
<p class="error" id="email-error"></p>
</div>
<div class="field">
<label for="postcode">Postcode</label>
<input id="postcode" name="postcode" required inputmode="numeric"
pattern="[0-9]{5}" data-pattern-message="Malaysian postcodes have 5 digits."
aria-describedby="postcode-error">
<p class="error" id="postcode-error"></p>
</div>
<button type="submit">Sign up</button>
<p role="status" id="form-status"></p>
</form>const form = document.getElementById("signup");
const statusEl = document.getElementById("form-status");
function messageFor(input) {
const v = input.validity;
if (v.valueMissing) return "Please fill in this field.";
if (v.typeMismatch) return "Please enter a valid " + input.type + " address.";
if (v.tooShort) return "Use at least " + input.minLength + " characters (you typed " + input.value.length + ").";
if (v.patternMismatch) return input.dataset.patternMessage || "Please match the requested format.";
return input.validationMessage; // anything else: the browser's own message
}
function showError(input) {
const errorEl = document.getElementById(input.id + "-error");
const valid = input.validity.valid;
input.setAttribute("aria-invalid", String(!valid));
if (errorEl) errorEl.textContent = valid ? "" : messageFor(input);
return valid;
}
form.addEventListener("submit", (event) => {
event.preventDefault();
const fields = Array.from(form.querySelectorAll("input, select, textarea"));
const firstInvalid = fields.filter((field) => !showError(field))[0];
if (firstInvalid) {
firstInvalid.focus();
statusEl.textContent = "";
return;
}
const data = Object.fromEntries(new FormData(form));
statusEl.textContent = "Thanks, " + data.name + "! (Nothing was sent — this is a demo.)";
console.log("Valid data:", data);
});
// Re-check a field as the user fixes it — but only after it was marked invalid
form.addEventListener("input", (event) => {
if (event.target.getAttribute("aria-invalid") === "true") showError(event.target);
});HTML sudah tahu cara mengesahkan input: required, type="email", minlength, pattern. Constraint Validation API membolehkan JavaScript membaca hasilnya (input.validity) supaya anda boleh paparkan mesej yang jelas dengan reka bentuk sendiri, di sebelah setiap medan.
Baris demi baris
novalidatepada borang matikan gelembung pop-up pelayar tetapi kekalkan peraturannya —validitymasih berfungsi. Kita ambil alih paparan.input.validityialah objekValidityStatedengan flag sepertivalueMissing,typeMismatch,tooShortdanpatternMismatch. Setiap flag berkait dengan satu atribut HTML, jadi setiap satu dapat mesejnya sendiri.pattern="[0-9]{5}"mesti padan dengan keseluruhan nilai (ia di-anchor secara automatik).data-pattern-messagesimpan mesej mesra manusia bersebelahan peraturan dalam HTML.aria-invalid="true"beritahu pembaca skrin bahawa medan itu ada masalah, danaria-describedbyhubungkan medan dengan teks ralatnya supaya ia dibacakan bila medan difokus.- Semasa submit kita sahkan semua medan, kemudian alihkan fokus ke medan tidak sah yang pertama supaya pengguna papan kekunci dan pembaca skrin terus sampai ke tempat masalah.
- Listener
inputhanya semak semula medan yang sudah ditanda tidak sah, jadi pengguna tak ditegur semasa mereka baru menaip kali pertama.
Pengesahan di pelanggan bukan keselamatan
Pengesahan di pelayar adalah untuk pengalaman pengguna yang baik. Sesiapa sahaja boleh memintasnya, jadi server mesti sahkan data yang sama sekali lagi.
Cara guna
<!-- Any input with an id, a matching "<id>-error" element and
aria-describedby pointing at it gets custom messages. -->
<input id="phone" name="phone" type="tel" required
pattern="01[0-9]-?[0-9]{7,8}"
data-pattern-message="Use a Malaysian mobile number, e.g. 012-3456789."
aria-describedby="phone-error">
<p class="error" id="phone-error"></p>