İçeriğe geç

Form Doğrulama — Hatayı Ne Zaman Göstermeli?

Orta 9 dk Çok sık karşılaşılır

Önce şunu oku: Erişilebilirlik Temelleri — Gözü Kapalı Para Gönderebilir misin?

30 saniyede özet

Bir alan daha yazılırken hata göstermek azar gibi hissettirir, yalnızca gönderince göstermek ise çok geçtir. İyi bir form alan bitince kontrol eder, hata gösterdikten sonra düzeltmeyi hemen onaylar ve aynı kuralı sunucuda da uygular.

Bir sınavda cevabını yazıyorsun ve öğretmen daha cümleni bitirmeden kırmızı kalemle “yanlış” yazıyor. Ya da tam tersi: sınav bitip kâğıdını verdikten sonra ilk satırda hata olduğunu öğreniyorsun.

  1. Bayt: Havale formuna IBAN doğrulaması ekledik. Her tuşta kontrol ediyor, çok hızlı!

  2. Sen: Kullanıcı daha TR33 yazarken alan kırmızı oluyor. Kullanıcılar kızgın.

  3. Bayt: Ama yarım IBAN gerçekten geçersiz...

  4. Bayt: Doğru, ama bunu söylemenin bir zamanı var. Ne zaman söylediğimize bakalım.

Ne zaman söylemeli?

anlık doğrulamaKullanıcı formu göndermeden alanı kontrol edip mesaj göstermek. Asıl soru ne zaman kontrol edileceğidir: her tuşta, alandan çıkınca ya da gönderince.Sözlükte gör →, kullanıcı formu göndermeden alanı kontrol edip mesaj göstermektir. Asıl soru ne zaman kontrol edileceğidir: her tuşta, alandan çıkınca ya da gönderince.

Her tuşta kontrol etmek, kullanıcı daha yazarken hata gösterir. Yalnızca gönderince kontrol etmek ise hatayı formun sonuna erteler; kullanıcı geri dönüp aramak zorunda kalır.

Kafam karıştı, daha basit anlat

Çok erken söylemek azar gibi, çok geç söylemek de iş çıkarır.

Hızlı kontrolBaşlangıç

Her tuşta doğrulama yapan bir IBAN alanının en büyük sorunu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Yalnızca gönderince doğrulama yapmanın sorunu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Önce sabırlı, sonra hızlı

Alan yalnızca kullanıcı alandan çıkınca kontrol ediliyor. Kullanıcı hatayı gördü, geri dönüp düzeltti ama alandan çıkmadı. Ekranda ne görür? Cevabı göster

Hata hâlâ ekranda durur. Kontrol yalnızca alandan çıkınca çalıştığı için düzeltme fark edilmez. Kullanıcı düzelttiği hâlde hata gördüğünü sanır.

Önce sabırlı ol, hatadan sonra hızlı ol.
Adım adım oku
  1. Daha yazarken kırmızı kalem: azar gibi.
  2. Sınav bitince öğrenmek: çok geç.
  3. Satır bitince söyle, düzeltince hemen onayla.
  4. Önce sabırlı ol, hatadan sonra hızlı ol.

İyi bir denge şudur: ilk kontrol, kullanıcı alandan çıkınca yapılır. Buna blurKullanıcı bir alandan çıktığında, yani odak başka yere geçtiğinde tetiklenen olay. Alan bittiğinde ilk kontrolü yapmak için iyi bir andır.Sözlükte gör → olayı denir. Bir hata gösterildikten sonra ise her tuşta yeniden kontrol edilir; kullanıcı düzelttiği anda hata kalkar.

Hata mesajı yalnızca renkle verilmez. Alan aria-invalid ile işaretlenir ve mesaj aria-describedby ile alana bağlanır; böylece ARIAHTML'e rol, ad ve durum bilgisi ekleyen öznitelikler (aria-label, aria-invalid). Davranış eklemez; aynı işi yapan HTML öğesi varsa o tercih edilir.Sözlükte gör → sayesinde ekran okuyucu da hatayı okur.

Kafam karıştı, daha basit anlat

Alandan çıkınca kontrol et; hata gösterdiysen her tuşta yeniden bak. Mesajı ekran okuyucuya da bağla.

Hızlı kontrolOrta

"Önce sabırlı, sonra hızlı" doğrulama nasıl çalışır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Hata mesajı ekran okuyucu kullanan biri için nasıl erişilebilir olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Hatayı ne zaman göstermeli?

Tohum 368573

Alıcı IBAN

    Oynat ya da adımla: her adımda kullanıcı bir şey yapar.

    Hız
    Adım 0

    Şu an ne oldu?

    Her tuşta

    Kullanıcı IBAN’ı dört parçada yazacak, alandan çıkacak ve formu gönderecek.

    Görevler0/3

    • Kullanıcıyı daha yazarken hatayla karşılaaçık

      İpucu

      Varsayılan ayarlar yeter.

    • Düzeltilmiş bir değeri hâlâ hatalı gösteraçık

      İpucu

      Yalnızca alandan çıkınca kontrol et.

    • Yazım hatasını alan bitince yakala, düzeltmeyi hemen onaylaaçık

      İpucu

      İki zamanlamayı birleştir.

    Olay günlüğü (0)

    Henüz olay yok. Oynat veya adımla.

    1. Varsayılanla oynat. Her tuşta kontrol: kullanıcı daha yazarken üç kez hata gördü.
    2. “Alandan çıkınca” seç. Yazarken sessiz kaldı, çıkınca hata geldi; ama düzeltmeden sonra hata ekranda kaldı.
    3. “Yalnızca gönderince” seç. Kullanıcı hatayı ancak formu gönderirken öğrenebilirdi.
    4. “Önce çıkınca, hatadan sonra her tuşta” seç. Yazarken sessiz, çıkınca hata, düzeltince hemen onay.
    Hızlı kontrolOrta

    Doğrulama yalnızca alandan çıkınca çalışıyor. Kullanıcı hatayı düzeltti ama alandan çıkmadı. Ne görür?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    IBAN'da iki rakam yer değiştirmiş. Bunu ne yakalar?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Tuzaklar

    Yalnızca tarayıcıda doğrulamak: istek tarayıcıyı atlayarak doğrudan sunucuya gönderilebilir. Aynı kuralı sunucuda da uygula; tarayıcıdaki kontrol yalnızca kolaylıktır.

    Hata olunca alanı temizlemek. Kullanıcının yazdığı 26 haneyi silmek, onu her şeyi baştan yazmaya zorlar. Değeri bırak, yalnızca neyin yanlış olduğunu söyle.

    Hatayı yalnızca renkle göstermek. Kırmızı kenarlık ekran okuyucuya hiçbir şey söylemez ve renk körü kullanıcılar onu görmeyebilir. Bir metin ve ikon ekle, mesajı alana bağla.

    Kafam karıştı, daha basit anlat

    Sunucuda da kontrol et, yazılanı silme, hatayı yalnızca renkle anlatma.

    Hızlı kontrolOrta

    Doğrulama yalnızca tarayıcıda yapılıyor. Neden yetmez?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Aşağıdaki örnek bir bankanın havale formundan: aynı IBAN kuralı tarayıcıda ve sunucuda, önce sabırlı sonra hızlı doğrulama, ekran okuyucuya bağlı hata mesajı.

    Derinleş · Havale formu: IBAN doğrulaması tarayıcıda ve sunucuda 4 dosya · ~74 satır · ilk okumada atlayabilirsin
    Proje dosyaları

    src/app/transfer/ iban.ts Kural: IBAN'ın uzunluğu ve mod 97 kontrol rakamları; aynı kural iki tarafta da.

    src/app/transfer/iban.ts
    /** ISO 13616 check for Turkish IBANs: 26 characters and mod 97 == 1. */
    export function isValidIban(input: string): boolean {
    const s = input.replace(/\s/g, '').toUpperCase();
    if (s.length !== 26 || !s.startsWith('TR')) return false;
    const rearranged = s.slice(4) + s.slice(0, 4);
    let rem = 0;
    for (const ch of rearranged) {
    const digits = /[A-Z]/.test(ch) ? String(ch.charCodeAt(0) - 55) : ch;
    for (const d of digits) rem = (rem * 10 + Number(d)) % 97;
    }
    return rem === 1;
    }

    src/app/transfer/ IbanField.tsx Alan: ilk kontrol alandan çıkınca, hata gösterildikten sonra her tuşta.

    src/app/transfer/IbanField.tsx
    export function IbanField({ value, onChange }: { value: string; onChange: (v: string) => void }) {
    const [error, setError] = useState<string | null>(null);
    const [shownOnce, setShownOnce] = useState(false); // after the first error, re-check on every change
    const check = (v: string) => {
    const message = isValidIban(v) ? null : 'Bu IBAN geçerli değil; rakamları kontrol et.';
    setError(message);
    if (message) setShownOnce(true);
    };
    return (
    <div>
    <label htmlFor="iban">Alıcı IBAN</label>
    <input
    id="iban"
    inputMode="text"
    autoComplete="off"
    value={value}
    aria-invalid={error ? true : undefined}
    aria-describedby={error ? 'iban-error' : undefined}
    onChange={(e) => {
    onChange(e.target.value); // never wipe what the user typed
    if (shownOnce) check(e.target.value); // fast once an error was shown
    }}
    onBlur={(e) => check(e.target.value)} // patient at first: check when the field is done
    />
    {error && (
    <p id="iban-error" role="alert">
    <span aria-hidden="true">✕ </span>
    {error}
    </p>
    )}
    </div>
    );
    }

    src/main/java/com/bank/transfer/ ValidIban.java Erişilebilirlik: aria-invalid ve aria-describedby ile hata ekran okuyucuya bağlı.

    src/main/java/com/bank/transfer/ValidIban.java
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = IbanValidator.class)
    public @interface ValidIban {
    String message() default "Geçerli bir IBAN değil";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    }
    class IbanValidator implements ConstraintValidator<ValidIban, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
    if (value == null) return true; // @NotBlank decides whether it is required
    String s = value.replace(" ", "").toUpperCase(Locale.ROOT);
    if (s.length() != 26 || !s.startsWith("TR")) return false;
    String digits = (s.substring(4) + s.substring(0, 4)).chars()
    .mapToObj(c -> Character.isLetter(c) ? String.valueOf(c - 'A' + 10) : String.valueOf((char) c))
    .collect(Collectors.joining());
    return new BigInteger(digits).mod(BigInteger.valueOf(97)).intValue() == 1;
    }
    }

    src/main/java/com/bank/transfer/ TransferRequest.java Sunucu: aynı kural bir Bean Validation kısıtı olarak; tarayıcıyı atlayan istek de reddediliyor.

    src/main/java/com/bank/transfer/TransferRequest.java
    /** The server checks the same rule: a request that skips the browser is still rejected. */
    record TransferRequest(
    @NotBlank @ValidIban String toIban,
    @NotNull @Positive BigDecimal amount) {
    }

    Kendini sına

    Şimşek turu1/4

    Her tuşta doğrulama yapmak kullanıcıya her zaman yardım eder.

    Soru 1/3İleri

    Hata olunca IBAN alanını temizlemek neden kötüdür?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Aklında kalacak üç şey

    1. 1 Bitmemiş bir değer elbette geçersizdir; kullanıcı daha yazarken bunu hata diye göstermek onu azarlamak gibidir. İlk kontrol, alandan çıkınca yapılır.
    2. 2 Bir hata gösterildikten sonra her tuşta yeniden kontrol et; böylece kullanıcı düzelttiği anda hatanın kalktığını görür.
    3. 3 Tarayıcıdaki doğrulama kullanıcıya yardım eder, güvenlik sağlamaz. Aynı kural sunucuda da çalışmalı; hata da ekran okuyucuya bağlanmalı.
    Sonraki kapı Hatayı düzelttin, yayına aldın, testler yeşil. Müşteri ise 'hâlâ aynı hata' diyor. Kim yanılıyor? Tarayıcı Önbelleği — Yeni Sürümü Yayına Aldın, Müşteri Neden Hâlâ Eskisini Görüyor? · 9 dk

    4 kart sonraki derste seni bekliyor

    0/4 kart bu dersten toplandı