- Konu sahibi
- #1
İçeriği sayfa yenilemeden değiştirmek için tarayıcının History API’sindeki
Aşağıdaki örnekte bağlantıya tıklandığında sayfa yeniden yüklenmeden URL
Bu kod çalıştığında adres çubuğunda
Hangi yöntemi kullanacağınız, değişikliğin tarayıcı geçmişinde ayrı bir adım olarak görünmesini isteyip istemediğinize bağlıdır.
Örneğin filtre uygulandığında her filtre değişikliğinin geçmişte ayrı bir adım olmasını istiyorsanız
Aşağıdaki kod URL’deki
Mevcut adres
Yeni bir geçmiş kaydı oluştururken ekranı da aynı mantıkla güncellerseniz akış tutarlı olur:
Burada URL’nin değişmiş olması, içeriğin doğru yüklendiğini tek başına kanıtlamaz.
Yeni URL aynı kaynak içindeki bir adres olmalıdır. Başka bir alan adına geçiş yapmak için
URL’yi değiştirdikten sonra sayfa yenilendiğinde uygulamanın aynı durumu yeniden kurabilmesi için adresi başlangıçta da okumalısınız. Örneğin
Özetle, kullanıcı hareketi yeni bir gezinme adımı oluşturuyorsa
history.pushState() veya history.replaceState() yöntemlerini kullanabilirsiniz. pushState() yeni bir geçmiş kaydı oluşturur; kullanıcı Geri düğmesine bastığında önceki URL’ye dönebilir. replaceState() ise mevcut geçmiş kaydını değiştirir. URL’yi değiştirmek tek başına yeni içeriği yüklemez; ekrandaki içeriği ve uygulamanın durumunu ayrıca güncellemeniz gerekir.pushState() ile yeni URL oluşturma
Aşağıdaki örnekte bağlantıya tıklandığında sayfa yeniden yüklenmeden URL
/urunler olarak değiştirilir. preventDefault() bağlantının normal gezinme davranışını durdurur, pushState() ise yeni adresi tarayıcı geçmişine ekler.
HTML:
<a href="/urunler" id="urunler-link">Ürünler</a>
<div id="icerik">Ana sayfa içeriği</div>
<script>
const link = document.querySelector('#urunler-link');
const icerik = document.querySelector('#icerik');
link.addEventListener('click', function (event) {
event.preventDefault();
history.pushState(
{ sayfa: 'urunler' },
'',
'/urunler'
);
icerik.textContent = 'Ürünler sayfası içeriği';
});
</script>
Bu kod çalıştığında adres çubuğunda
/urunler görünür ve sayfa yenilenmez. Ancak sunucuda gerçekten /urunler adresine karşılık gelen bir yönlendirme veya dosya yoksa, kullanıcı bu adresi doğrudan açtığında ya da sayfayı yenilediğinde sunucu 404 döndürebilir. Bu nedenle istemci tarafındaki yönlendirme ile sunucu yapılandırmasının birlikte ele alınması gerekir.pushState() ve replaceState() arasındaki fark
Hangi yöntemi kullanacağınız, değişikliğin tarayıcı geçmişinde ayrı bir adım olarak görünmesini isteyip istemediğinize bağlıdır.
| Yöntem | Geçmiş davranışı | Uygun kullanım |
|---|---|---|
| pushState() | Yeni geçmiş kaydı ekler | Kullanıcının Geri düğmesiyle önceki uygulama durumuna dönmesi isteniyorsa |
| replaceState() | Mevcut kaydı değiştirir | Geçici, düzeltme veya yeniden yönlendirme niteliğindeki URL değişikliklerinde |
pushState() kullanabilirsiniz. İlk açılışta varsayılan URL’yi düzenlemek veya hatalı bir parametreyi düzeltmek istiyorsanız replaceState() daha uygundur.replaceState() ile mevcut adresi değiştirme
Aşağıdaki kod URL’deki
sayfa parametresini değiştirir, fakat tarayıcı geçmişine yeni kayıt eklemez:
JavaScript:
const yeniUrl = new URL(window.location.href);
yeniUrl.searchParams.set('sayfa', '2');
history.replaceState(
{ sayfa: 2 },
'',
yeniUrl
);
Mevcut adres
https://ornek.test/urunler ise sonuç https://ornek.test/urunler?sayfa=2 olur. URL nesnesini kullanmak, mevcut yol ve diğer sorgu parametrelerini yanlışlıkla silmeden yalnızca değiştirmek istediğiniz kısmı güncellemenizi sağlar.Geri ve İleri düğmelerini yönetme
pushState() çağrısı URL’yi ve geçmişi değiştirir, fakat Geri veya İleri düğmesine basıldığında uygulamanızın içeriğini kendiliğinden değiştirmez. Bu durumları yakalamak için popstate olayını dinlemeli ve geçmiş kaydındaki state verisine göre ekranı yeniden oluşturmalısınız.
JavaScript:
function sayfayiGoster(sayfa) {
const icerik = document.querySelector('#icerik');
if (sayfa === 'urunler') {
icerik.textContent = 'Ürünler sayfası içeriği';
} else {
icerik.textContent = 'Ana sayfa içeriği';
}
}
window.addEventListener('popstate', function (event) {
const sayfa = event.state?.sayfa || 'ana-sayfa';
sayfayiGoster(sayfa);
});
Yeni bir geçmiş kaydı oluştururken ekranı da aynı mantıkla güncellerseniz akış tutarlı olur:
JavaScript:
history.pushState(
{ sayfa: 'urunler' },
'',
'/urunler'
);
sayfayiGoster('urunler');
Burada URL’nin değişmiş olması, içeriğin doğru yüklendiğini tek başına kanıtlamaz.
pushState() yalnızca geçmiş kaydını ve adres çubuğunu günceller. Veri gerekiyorsa bunu ayrıca fetch() ile almalı, gelen sonuca göre ekranı güncellemeli ve hata durumunu kullanıcıya göstermelisiniz.Dikkat edilmesi gereken sınırlar
Yeni URL aynı kaynak içindeki bir adres olmalıdır. Başka bir alan adına geçiş yapmak için
pushState() kullanılamaz; böyle bir durumda normal yönlendirme veya window.location gerekir. Ayrıca URL’ye kullanıcıya ait parola, erişim belirteci veya başka hassas veriler yazılmamalıdır; adres çubuğu ve tarayıcı geçmişi bu bilgileri görünür hâle getirebilir.URL’yi değiştirdikten sonra sayfa yenilendiğinde uygulamanın aynı durumu yeniden kurabilmesi için adresi başlangıçta da okumalısınız. Örneğin
window.location.pathname ile yol, URLSearchParams ile sorgu parametreleri alınabilir. Kullanıcı /urunler?sayfa=2 adresini doğrudan açtığında uygulamanız bu değeri okuyup ürünler görünümünü ve ikinci sayfayı oluşturmalıdır.Özetle, kullanıcı hareketi yeni bir gezinme adımı oluşturuyorsa
pushState(), mevcut adresi geçmişi büyütmeden düzeltmek istiyorsanız replaceState() kullanın. Her iki yöntemde de URL değişikliği ile ekran güncellemesini ve popstate olayını birlikte yönetmeniz gerekir.