Chrome 105'te NavigationEvent değişiklikleri

Ali Poşet
Ali Polat

Chrome 105, pratikte sorun yaşadığı yöntemleri iyileştirmek için Navigation API'nin NavigateEvent özelliğinde (102 yılında kullanıma sunuldu) iki yeni yöntem sunar. Geliştiricilerin gezinme sonrasında durumu kontrol etmesine olanak tanıyan intercept(), kullanımı zor olan transitionWhile() ürününün yerini aldı. URL'de belirtilen bir bağlayıcıya giden scroll() yöntemi, tüm gezinme türlerinde çalışmayan restoreScroll() öğesinin yerini alır.

Bu makalede, her ikisiyle ilgili sorunları ve yeni yöntemlerin bu sorunları nasıl çözdüğünü açıklayacağım.

Chrome 102'de Navigation API ile kullanıma sunulan NavigateEvent.trasitionWhile() yöntemi, tek sayfalık uygulamalarda istemci tarafı geçişlerde gezinmeye müdahale eder. İlk bağımsız değişkeni, tarayıcıya ve web uygulamasının diğer bölümlerine işlemin tamamlandığını bildiren bir vaattir.

Bu pratikte işe yaramadı. Şu yaygın kodlama kalıbını göz önünde bulundurun:

event.transitionWhile((async () => {
  doSyncStuff();
  await doAsyncStuff();
})());

Bu, işlevsel olarak aşağıdaki koda eşdeğerdir. API, geliştiricinin gezinmeye müdahale etmek istediğini anlamadan önce gezinmenin bir kısmının çalışmasına neden olur.

doSyncStuff();
event.transitionWhile((async () => {
  await doAsyncStuff();
})());

Bu durumun bir uygulamayı bozabileceği durumlara örnek olarak kaydırma geri yükleme mantığı verilebilir.

Neler değişti?

transitionWhile() öğesinin yerini almak için mevcut spesifikasyonda NavigateEvent.intercept() kullanıma sunuldu. Yeni yöntem, transitionWhile() tarafından desteklenen focusReset ve scrollRestoration özelliklerine ek olarak bir işleyici alır. Yeni işleyici, gezinme kaydedildikten sonra her zaman çalışır ve kaydırma konumları gibi öğeler yakalanarak transitionWhile() ile ilgili sorunların önüne geçer.

transitionWhile() yöntemi hâlâ kullanılabilir, ancak kullanımdan kaldırılmıştır ve Chrome 108'de kaldırılacaktır.

Intercept() kullanma

NavigateEvent.intercept() öğesi tüm gezinme etkinliklerinde çağrılamayacağından transitionWhile() ile aynı kısıtlamalara sahiptir. Kaynaklar arası gezinmeler ve dokümanlar arası geçişler müdahale edilemez. Bunu yaparsanız "SecurityError" türünde bir DOMException döndürülür.

intercept() kullanmak için özel işleyicinizi çağırırken iletmeniz yeterlidir.

navigation.addEventListener("navigate", event => {
  event.intercept({
    async handler() {
      doSyncStuff();
      await doAsyncStuff();
    }
  });
});

Sayfanın üst kısmından sabit öğeye gitme gibi bir gezinme (ör. /a konumundan /a#id konumuna geçiş olsun), tek sayfalık bir uygulamada bile tarayıcı tarafından tamamen işlenir. Ancak çok sayfalı uygulamalarda basit bir işlem olan başka bir "sayfada" (/a-/b#id) sabitlenmiş bir sayfaya gitmek tek sayfalık uygulamalar için daha karmaşıktır. Uygulama, NavigateEvent.transitionWhile() kullanarak /b#id gezinmesine müdahale etmeli, ardından anchor'ı görünüme getirmek için NavigateEvent.restoreScroll() yöntemini çağırmalıdır. Yukarıda belirtildiği gibi, bunu yapmak şu anda zor.

Neler değişti?

Tek sayfalık uygulamalarda, artık tarayıcının bir bağlayıcıya kaydırma yapıp yapmayacağını veya kodunuzun kod yazma işini yapıp yapmayacağını kontrol edebilirsiniz.

Scroll() kullanma

Varsayılan olarak, tarayıcı, müdahale işleyici yerine getirildikten sonra kaydırmayı otomatik olarak işlemeye çalışır. Kaydırma işlemini kendiniz yapmak istiyorsanız scroll öğesini "manual" değerine ayarlayın ve tarayıcının kaydırma konumunu ayarlamaya çalışması gerektiğinde NavigateEvent.scroll() işlevini çağırın.

navigation.addEventListener("manual", event => {
  scroll: "manual",
  event.intercept({
    async handler() {
      doSyncStuff();
      // Handle scrolling earlier than by default:
      event.scroll();
      await doAsyncStuff();
    }
  });
});

restoreScroll() yöntemi hâlâ kullanılabilir, ancak kullanımdan kaldırılmıştır ve Chrome 108'de kaldırılacaktır.

Sonuç

Yakında Gezinme API'sı ile ilgili makalemizi güncellemeyi umuyoruz. Bu sırada, bu API'nin spesifikasyonu web geliştiricileri için özel olarak hazırlanmış çok fazla bilgi içermektedir.

Fotoğraf: Tim Gouw, Unsplash'te