Ajax, geri düğmesi ve DOM güncellemeleri


113

Javascript, A sayfasındaki DOM'u değiştirirse, kullanıcı B sayfasına gider ve ardından A sayfasına geri dönmek için geri düğmesine basar. A sayfasının DOM'unda yapılan tüm değişiklikler kaybolur ve kullanıcıya orijinal olarak sunucudan alınan sürüm sunulur.

Stackoverflow, reddit ve diğer birçok popüler web sitesinde bu şekilde çalışır. (bu soruya test yorumu eklemeyi deneyin, ardından farklı sayfaya gidin ve geri dönmek için geri düğmesine basın - yorumunuz "gitmiş" olacaktır)

Bu mantıklıdır, ancak bazı web siteleri (apple.com, basecamphq.com vb.) Bir şekilde tarayıcıyı kullanıcıya sayfanın en son durumunu sunmaya zorluyor. ( http://www.apple.com/ca/search/?q=ipod adresine gidin , üstteki İndirilenler bağlantısını tıklayın ve ardından geri düğmesini tıklayın - tüm DOM güncellemeleri korunacaktır)

tutarsızlık nereden geliyor?


İlginç bir şekilde, Apple hash'i değiştirmeden durumu hatırlıyor .. hmmm
James

Apple, yanıt önbelleğe alma
işlemini

Başkalarının da önerdiği gibi, bu javascript veya ajax ile ilgili bir şey değil. Doğru yanıtları almak için bu etiketleri kaldırmalısınız.
BYK

Apple örneği zayıf. Bir arama alanı [ör: ürünler] ile sözleşme yaparsanız, bağlantınızı tıklayın, ardından geri tuşuna basın, DOM korunmaz. Birçoğunun önerdiği bir Karma Çözümü arıyorsunuz.
BigBlondeViking

Geri düğmesine bastığımda, Apple hangi arama sonuçları sayfasında olduğumu hiç hatırlamıyor. IE7 kullanarak. Bir hash çözüme ihtiyacınız var. Bakınız: Facebook.
Josh Stodola

Yanıtlar:


106

Bir yanıt: Diğer şeylerin yanı sıra, kaldırma olayları geri / ileri önbelleğin geçersiz kılınmasına neden olur .

Bazı tarayıcılar, web sayfasının tamamının mevcut durumunu sözde "bfcache" veya "page cache" olarak saklar. Bu, geri ve ileri düğmeleriyle gezinirken sayfayı çok hızlı bir şekilde yeniden oluşturmalarına olanak tanır ve DOM ve tüm JavaScript değişkenlerinin durumunu korur. Ancak, bir sayfa onunload olaylarını içerdiğinde, bu olaylar sayfayı potansiyel olarak işlevsel olmayan bir duruma sokabilir ve bu nedenle sayfa bfcache'de depolanmaz ve yeniden yüklenmesi gerekir (ancak standart önbellekten yüklenebilir) ve yeniden tüm yük işleyicilerini çalıştırmak da dahil olmak üzere sıfırdan oluşturulur. Bfcache aracılığıyla bir sayfaya geri dönüldüğünde, DOM onload işleyicilerini çalıştırmaya gerek kalmadan önceki durumunda tutulur (çünkü sayfa zaten yüklüdür).

Önbellek Denetimi ve diğer HTTP üstbilgileri açısından bfcache davranışının standart tarayıcı önbelleğinden farklı olduğuna dikkat edin. Çoğu durumda, tarayıcılar başka türlü standart önbellekte saklamasa bile bfcache'deki bir sayfayı önbelleğe alır.

jQuery, pencereye otomatik olarak bir kaldırma olayı ekler, bu nedenle maalesef jQuery, DOM koruması ve hızlı geri / ileri için sayfanızın bfcache'de depolanmasını engeller.. [Güncelleme: bu sadece IE için geçerli olacak şekilde jQuery 1.4'te düzeltilmiştir]


3
tamamen başardın. hem reddit hem de stackoverflow jquery kullanırken basecamp ve apple prototypejs kullanıyor. bu hemen hemen her şeyi açıklıyor.
lubos hasko

+1 ilginç (çapraz tarayıcı değil) soru başladığından çok farklı ...
BigBlondeViking

1
muhtemelen tarayıcılar arası olacaktır çünkü onu Internet Explorer'ımda da yeniden oluşturabiliyorum. Eminim javascript etkin olan her web tarayıcısı yine de bu sorunu çözmek zorunda kalmıştır. ancak bu gerçekten bir karmaşa, bunu düşündüğünüzde, geri düğmesi her zaman insanları tüm DOM güncellemeleri, javascript durumu vb. ile en son gördükleri sayfaya götürmeli. geliştiriciler, unload olayında bir şeyler yaparak bunu bozmamalı eğer yaparlarsa, web tarayıcıları bfcache'yi hiç kullanmayarak sorunu çözmeye çalışmamalıdır. tüm boşaltma olayı büyük bir şakadır. Eminim zamanın% 99'u bellek sızıntılarını düzeltmek için kullanılır.
lubos hasko

1
Özellikle, IE bellek sızıntıları. :) jQuery unload olayı ayrıca Firefox 2'deki (tamamen ilgisiz) bir hatayı düzeltir. Ancak diğer tarayıcılar için gereksizdir. dev.jquery.com/ticket/3015 Sanırım onunload için giden tıklama izleme veya web uygulaması durumunu kaydetme gibi başka kullanımları duydum, ancak bunu kendim kullanmak için hiçbir nedenim olmadı ve geliştiriciler siteleri daha yavaş ve kullanıcıları için daha acı verici (yorum sayfalarına geri dönmenin, yorumun daraltılmış durumunu sıfırlamasından nefret ediyorum), bu onların ayrıcalıkları.
Mil

1
Unload olayı, firefox ve chrome için değil, sadece IE için eklenir. Safari'nin son sürümü, devin herhangi bir şey yapmasına gerek kalmadan dom durumunu korur.
David

15

Chrome'un Safari'nin yaptığı gibi davranmasını sağlamaya çalışıyorum ve bunun işe yaradığını bulmamın tek yolu Cache-control: no-storebaşlıklarda ayarlamak . Bu, tarayıcıyı, kullanıcı geri düğmesine bastığında sunucudan sayfayı yeniden getirmeye zorlar. İdeal değil, ancak güncel olmayan bir sayfanın gösterilmesinden daha iyi.


5
Bu, orijinal sorunun doğru cevabıdır. Geri düğmede bir sunucuyu yeniden yüklemeye zorlamak istiyorsanız, önbellek denetimini kullanın 'saklamasız, önbelleksiz, yeniden doğrulamalı'. Chrome saklamak istemiyor ve IE yeniden doğrulama istiyor. Diğer tarayıcılar (ve w3c) için önbellek yok yeterli.
2013

3

Facebook, ajax istekleri için URL'deki hash tanımlayıcısını değiştirerek sayfa durumunu hatırlar. Bu değişiklikler tarayıcı geçmişine kaydedilir, bu nedenle kullanıcı geri düğmesini tıkladığında, karma eskisine göre değişir. Öyleyse, tanımlayıcıyı izlemek ve tarayıcı tarafından değiştirildiğinde tepki vermek için bir Javascript'e ihtiyacınız olacağı ima edilir. Andreas Blixt'in bir hash izleme komut dosyası var .


bugün itibariyle ölmüyor, bana facebook'un şimdi ne yaptığını söyleyebilir
Ravinder Payal

3

Bunun karma (#) sembolüyle ilgisi yoktur.

Apple'ın HTTP başlıklarını kontrol ederseniz, sadece sayfayı önbelleğe almaktır.


Apple örneği zayıf, sayfa durumunu "
kaydetmiyor", DOM'un

2

URL karma / parça tanımlayıcısını kullanmak, Ajax ve DOM güncellemelerine dayanan bir web uygulamasında durumu bağlamak / hatırlamak için oldukça yaygın bir yoldur.

Bazı fikirler için Gerçekten Basit Tarih projesine göz atın . Karma değişikliklere karşı URL'yi izlemek mümkündür ve rsh, tarayıcı farklılıklarını dikkate alarak bunu yapar.


1

Sorun yaşayan herkes için Railsve bu - senin sorunun bfcache değil (öyle olduğunu sanıyordum) - bu turbolinksmücevher. İşte nasıl kaldırılacağı.

Umarım bu size biraz zaman kazandırır ve kafanızı duvara vurur.


0

Aradığınız şey, bir tür URL karma yönetimi içindir. URL’deki # yalnızca istemci tarafı içindir.

Sırtın durumunu JS ile değiştirdiğinizde, URL'nin # içindeki verileri güncellersiniz.

Ayrıca, karmanın değişip değişmediğini izleyen ve karmadaki yeni verilere dayanarak sayfanın durumunu yükleyen bir tür yoklama eklersiniz.

Şuna bir bak:

http://ajaxpatterns.org/Unique_URLs


3
bunun hash sembolüyle hiçbir ilgisi yoktur.
Luca Matteis

3
Yanılıyorsunuz, bir AJAX çözümünde sayfa durumunu korumanın en yaygın yolunu arıyor.
BigBlondeViking
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.