Langkau ke kandungan
WANCODE
EN

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
index.html
<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>
validate.js
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

  • novalidate pada borang matikan gelembung pop-up pelayar tetapi kekalkan peraturannya — validity masih berfungsi. Kita ambil alih paparan.
  • input.validity ialah objek ValidityState dengan flag seperti valueMissing, typeMismatch, tooShort dan patternMismatch. 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-message simpan mesej mesra manusia bersebelahan peraturan dalam HTML.
  • aria-invalid="true" beritahu pembaca skrin bahawa medan itu ada masalah, dan aria-describedby hubungkan 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 input hanya 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

HTML
<!-- 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>