- Konu sahibi
- #1
İstemci tarafında form doğrulamak için alan değerlerini gönderme anında okuyup kurallara göre kontrol edin; geçersiz alanlarda hata mesajı gösterin, formun gönderilmesini durdurun ve geçerli olduğunda veriyi işleyin. Ancak JavaScript doğrulaması tek başına güvenlik sağlamaz. Tarayıcı dışında gönderilen istekler JavaScript’i çalıştırmayabileceği için aynı kurallar sunucu tarafında da yeniden uygulanmalıdır.
Bir form doğrulamasında genellikle şu sıra izlenir:
Formu gönderdiğinizde geçersiz bir e-posta yazarsanız e-posta alanının altında hata mesajı görünür ve odak ilk hatalı alana taşınır. Parola sekiz karakterden kısa olduğunda parola alanı, iki parola farklı olduğunda ise parola tekrarı alanı işaretlenir. Bütün kontroller geçerse
Bu örnekte
Form kurallarını hangi katmanda uygulayacağınızı seçerken her katmanın görevini ayırmak gerekir. HTML doğrulaması hızlı ve temel kontroller için, JavaScript kullanıcıya anında geri bildirim vermek için, sunucu doğrulaması ise güvenilir son kontrol için kullanılır.
Örneğin e-posta alanına
Boş alanları
Düzenli ifadeler, e-posta veya telefon gibi belirli biçimleri kontrol etmekte kullanılabilir; ancak karmaşık bir düzenli ifadeyle her geçerli adresi eksiksiz yakalayacağınızı varsaymayın. Kullanıcıdan gereksiz biçim kısıtları istemek yerine alanın gerçek ihtiyacını tanımlayın. Parola gibi hassas değerleri hata mesajında, URL’de veya günlük kayıtlarında göstermeyin.
Alanları yalnız gönderme anında değil, kullanıcı alanı terk ettiğinde veya yazarken de kontrol edebilirsiniz. Yazarken yapılan kontrolde kullanıcı her karakterde hata mesajı görerek rahatsız olmamalıdır; genellikle gönderme anında kesin doğrulama, alan terk edildiğinde ise kısa geri bildirim daha dengeli bir yaklaşımdır.
İstemci tarafındaki tüm kontroller geçerse bu yalnızca tarayıcıdaki verilerin belirlediğiniz biçime uyduğunu gösterir; hesabın oluşturulduğunu, e-postanın kullanılabilir olduğunu veya isteğin sunucu tarafından kabul edildiğini kanıtlamaz. Veriyi API’ye gönderdiğinizde sunucunun başarı ve hata yanıtlarını ayrıca ele alın.
Sunucu bir alanı reddederse dönen hatayı ilgili alanın yanında gösterin. Örneğin kullanıcı adı zaten kullanılıyorsa bunu biçim hatası gibi değil, sunucunun verdiği iş kuralı hatası olarak açıklayın. Sunucu tarafında doğrulama yapılmadan veriyi veritabanına kaydetmeyin; istemci kodu değiştirilmiş, devre dışı bırakılmış veya hiç çalıştırılmamış olabilir.
Form doğrulamanın temel akışı
Bir form doğrulamasında genellikle şu sıra izlenir:
- Formun gönderilme olayını yakalayın.
- Alan değerlerini alın ve gereksiz boşlukları temizleyin.
- Boş bırakma, biçim, uzunluk veya değer aralığı gibi kuralları uygulayın.
- Geçersiz alanın hata mesajını gösterin ve gönderme işlemini durdurun.
- Tüm alanlar geçerliyse formun gönderilmesine veya verinin sunucuya gönderilmesine izin verin.
HTML:
<form id="registerForm" novalidate>
<label for="email">E-posta</label>
<input id="email" name="email" type="email" autocomplete="email">
<small id="emailError"></small>
<label for="password">Parola</label>
<input id="password" name="password" type="password" autocomplete="new-password">
<small id="passwordError"></small>
<label for="passwordAgain">Parola tekrarı</label>
<input id="passwordAgain" name="passwordAgain" type="password" autocomplete="new-password">
<small id="passwordAgainError"></small>
<button type="submit">Kayıt ol</button>
</form>
<script src="form.js" defer></script>
novalidate özniteliği, bu örnekte tarayıcının varsayılan uyarıları yerine kendi hata mesajlarımızı göstermek için kullanılır. Kullanmak istemezseniz kaldırabilirsiniz; required, type="email" ve minlength gibi HTML kuralları tarayıcı tarafından otomatik olarak da denetlenebilir.
JavaScript:
const form = document.querySelector('#registerForm');
const email = document.querySelector('#email');
const password = document.querySelector('#password');
const passwordAgain = document.querySelector('#passwordAgain');
const emailError = document.querySelector('#emailError');
const passwordError = document.querySelector('#passwordError');
const passwordAgainError = document.querySelector('#passwordAgainError');
function clearErrors() {
emailError.textContent = '';
passwordError.textContent = '';
passwordAgainError.textContent = '';
email.removeAttribute('aria-invalid');
password.removeAttribute('aria-invalid');
passwordAgain.removeAttribute('aria-invalid');
}
function setError(input, errorElement, message) {
errorElement.textContent = message;
input.setAttribute('aria-invalid', 'true');
}
form.addEventListener('submit', function (event) {
event.preventDefault();
clearErrors();
const emailValue = email.value.trim();
const passwordValue = password.value;
const passwordAgainValue = passwordAgain.value;
let isValid = true;
if (emailValue === '') {
setError(email, emailError, 'E-posta adresi zorunludur.');
isValid = false;
} else if (!email.validity.valid) {
setError(email, emailError, 'Geçerli bir e-posta adresi yazın.');
isValid = false;
}
if (passwordValue.length < 8) {
setError(password, passwordError, 'Parola en az 8 karakter olmalıdır.');
isValid = false;
}
if (passwordAgainValue !== passwordValue) {
setError(passwordAgain, passwordAgainError, 'Parolalar eşleşmiyor.');
isValid = false;
}
if (!isValid) {
const firstInvalidField = form.querySelector('[aria-invalid="true"]');
firstInvalidField?.focus();
return;
}
// Bu noktada istemci tarafı kontrolleri geçildi.
// Gerçek uygulamada veriyi sunucuya gönderin.
console.log('Form doğrulandı:', {
email: emailValue,
password: passwordValue
});
});
Formu gönderdiğinizde geçersiz bir e-posta yazarsanız e-posta alanının altında hata mesajı görünür ve odak ilk hatalı alana taşınır. Parola sekiz karakterden kısa olduğunda parola alanı, iki parola farklı olduğunda ise parola tekrarı alanı işaretlenir. Bütün kontroller geçerse
isValid değeri true kalır ve uygulamanın veri gönderme adımına geçilir.Bu örnekte
event.preventDefault() formun normal gönderilmesini geçici olarak durdurur. Gerçek uygulamada doğrulama başarılı olduktan sonra veriyi fetch() ile API’ye gönderebilir veya normal form gönderimini kullanabilirsiniz. API’ye gönderirken parolayı tarayıcı konsoluna yazdırmayın ve sunucu yanıtında dönen hata mesajlarını da kullanıcıya ham hâliyle göstermeyin.HTML doğrulaması, JavaScript ve sunucu doğrulaması
Form kurallarını hangi katmanda uygulayacağınızı seçerken her katmanın görevini ayırmak gerekir. HTML doğrulaması hızlı ve temel kontroller için, JavaScript kullanıcıya anında geri bildirim vermek için, sunucu doğrulaması ise güvenilir son kontrol için kullanılır.
| Katman | Uygun olduğu iş | Sınırı |
|---|---|---|
| HTML | Zorunlu alan, e-posta biçimi, minimum ve maksimum uzunluk | Kullanıcı tarafından devre dışı bırakılabilir veya atlanabilir |
| JavaScript | Anında hata göstermek, alanlar arası ilişkiyi kontrol etmek | Kod çalıştırılmadan gönderilen isteği koruyamaz |
| Sunucu | Veriyi kaydetmeden veya işlem yapmadan önce son doğrulama | Kullanıcıya anlık geri bildirim için tek başına yeterli değildir |
type="email" vermek temel biçim kontrolünü sağlar; fakat belirli bir alan adını zorunlu kılmak, e-postanın daha önce kullanılıp kullanılmadığını kontrol etmek veya kullanıcının yetkisini doğrulamak JavaScript’in değil, sunucunun ve uygulama iş kurallarının görevidir.Yaygın doğrulama kuralları
Boş alanları
value.trim() === '' ile kontrol edin. Metin uzunluğu için value.length, sayısal alanlarda ise değeri Number() ile dönüştürdükten sonra Number.isFinite() ve aralık kontrollerini kullanın. Sayı alanında yalnızca tarayıcının type="number" kontrolüne güvenmeyin; sunucuda da sayının beklenen aralıkta olduğunu doğrulayın.Düzenli ifadeler, e-posta veya telefon gibi belirli biçimleri kontrol etmekte kullanılabilir; ancak karmaşık bir düzenli ifadeyle her geçerli adresi eksiksiz yakalayacağınızı varsaymayın. Kullanıcıdan gereksiz biçim kısıtları istemek yerine alanın gerçek ihtiyacını tanımlayın. Parola gibi hassas değerleri hata mesajında, URL’de veya günlük kayıtlarında göstermeyin.
Alanları yalnız gönderme anında değil, kullanıcı alanı terk ettiğinde veya yazarken de kontrol edebilirsiniz. Yazarken yapılan kontrolde kullanıcı her karakterde hata mesajı görerek rahatsız olmamalıdır; genellikle gönderme anında kesin doğrulama, alan terk edildiğinde ise kısa geri bildirim daha dengeli bir yaklaşımdır.
Doğrulama başarılı olduğunda ne yapılmalı?
İstemci tarafındaki tüm kontroller geçerse bu yalnızca tarayıcıdaki verilerin belirlediğiniz biçime uyduğunu gösterir; hesabın oluşturulduğunu, e-postanın kullanılabilir olduğunu veya isteğin sunucu tarafından kabul edildiğini kanıtlamaz. Veriyi API’ye gönderdiğinizde sunucunun başarı ve hata yanıtlarını ayrıca ele alın.
Sunucu bir alanı reddederse dönen hatayı ilgili alanın yanında gösterin. Örneğin kullanıcı adı zaten kullanılıyorsa bunu biçim hatası gibi değil, sunucunun verdiği iş kuralı hatası olarak açıklayın. Sunucu tarafında doğrulama yapılmadan veriyi veritabanına kaydetmeyin; istemci kodu değiştirilmiş, devre dışı bırakılmış veya hiç çalıştırılmamış olabilir.