Canlı arama kutusunda kullanıcı hızlı yazdığında her
inputfetch()kakaliİki önlem birlikte kullanılabilir: Önceki isteği
AbortControllerAbortController ve istek numarasıyla çözüm
const input = document.querySelector('#search');
const results = document.querySelector('#results');
let controller = null;
let requestNo = 0;
input.addEventListener('input', async () => {
const term = input.value.trim();
const currentRequest = ++requestNo;
if (controller) {
controller.abort();
}
if (term.length < 2) {
results.textContent = 'En az iki karakter yazın.';
return;
}
controller = new AbortController();
results.textContent = 'Aranıyor...';
try {
const response = await fetch(
`/api/search?q=${encodeURIComponent(term)}`,
{ signal: controller.signal }
);
if (!response.ok) {
throw new Error('Arama isteği başarısız oldu.');
}
const data = await response.json();
// Yanıt eski bir isteğe aitse ekrana yazma.
if (currentRequest !== requestNo) return;
results.textContent = data.items.length
? data.items.map(item => item.name).join(', ')
: 'Sonuç bulunamadı.';
} catch (error) {
// Kullanıcının yeni yazdığı metin nedeniyle iptal edilen isteği hata gibi gösterme.
if (error.name === 'AbortError') return;
if (currentRequest === requestNo) {
results.textContent = 'Sonuçlar alınamadı.';
}
}
});
Kodda dikkat edilmesi gereken noktalar
- , sorgunun URL parametresinde özel karakterlerle bozulmasını önler; sunucu tarafı doğrulamanın yerine geçmez.
encodeURIComponent() - önceki isteğin ağ çalışmasını durdurmayı dener. Buna rağmen ulaşan bir yanıt olursa
AbortControllerkontrolü eski verinin uygulanmasını engeller.requestNo - Sonuçları ile yazmak, API’den gelen metnin HTML olarak yorumlanmasını önler. HTML üretmek gerekiyorsa içerik ayrıca güvenli biçimde arındırılmalıdır.
textContent - API, sorguyu sunucuda doğrulamalı; veritabanı işlemlerinde parametreli sorgular kullanmalı ve aşırı istekler için uygun hız sınırlaması değerlendirmelidir.
Geliştirici araçlarında ağ hızını yavaşlatın ve arama kutusuna art arda farklı ifadeler yazın. Yanıtların farklı sırada dönmesini sağlayarak yalnızca son ifadenin sonuçlarının göründüğünü kontrol edin.
- İki karakterden kısa veya tamamen boş girişte uygun bilgilendirme gösterilmeli.
- Sonuç bulunamadığında boş liste mesajı görünmeli.
- HTTP hata kodunda yalnızca güncel isteğe ait hata mesajı gösterilmeli.
- Yeni yazım nedeniyle iptal edilen istek, kullanıcıya gereksiz hata olarak yansımamalı.
- Ağ bağlantısı kesildiğinde arama alanı çalışmaya devam etmeli ve kullanıcı anlaşılır bir durum mesajı görmeli.
