2012-07-04 32 views
6

URL/ürünlerinden erişilebilen bir sayfam var. Bir tarayıcıda ziyaret ettiğimde, bir düzen içinde tam sayfa ile yanıt verir. Bir kullanıcı bazı arama AJAX JavaScript güncellemeler sonuçları yaparTarayıcı, AJAX yoluyla alınmış kısmi bir HTML ile tam sayfa

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

<layout> 
<products /> 
</layout> 

: Burada istek başlıklarına ve yanıt gövdesinin basitleştirilmiş bir örnektir. render zaman alır çünkü sonuç bir düzen olmadan görüntülenir ve ben zaten gerek yoktur: Ben önbelleğe Cache-Control: private, max-age=3600 eklendi kadar

Accept: */*;q=0.5, text/javascript, application/javascript, application/ecmascript, application/x-ecmascript 
X-Requested-With: XMLHttpRequest 

<products /> 

Yani, bu iyi çalıştı. Başlangıçta ben Vary: X-Requested-With üstbilgisi eklerim ve bir tarayıcı iki yanıtı ayırt ederdi. Bununla birlikte, AJAX aracılığıyla/ürünler aldığımda/tarayıcıdaki/ürünleri ziyaret ettiğimde, kısmi AJAX yanıtını görüntüler.

Bu sorunu çözmenin basit bir yolu var mı?

P.S. Önemliyse Ruby on Rails ve jQuery kullanıyorum.

+2

'Vary: Accept' denediniz mi? – regilero

+0

Evet, ayrıca çalışmıyor. Tarayıcının her iki yanıtı da düzgün bir şekilde önbelleğe aldığını düşünüyorum. Ancak Content-Type (İçerik Türü): text/html nedeniyle bunları eşit olarak ele alır ve sonuncusu olanı gösterir. –

+0

Aslında JSON ile yanıt vermeye çalıştım ve şimdi JSON'u gösteriyor. Bu, İçerik Türü'ne bağlı değildir: text/html. "Vary" nin burada herhangi bir etkisi olmadığı konusunda oldukça şaşırdım. –

cevap

1

Ajax çağrınızın/products/parsiyel gibi farklı bir URL kullanmasını sağlayın.

+0

Şimdilik tek çözüm gibi görünüyor. Ancak bu, istemci tarafında javascript üzerinde çok uygun olmayan her URL'yi değiştirmem gerekeceği anlamına gelir. –

0

Sen kısmi sonuçlar için ayrılmakta url olmalıdır (yani? Kısmi = evet ya böyle bir şey ...)

VEYA

Eğer ajax ile tüm sayfayı almak ve ayıklamak sadece bir kısmını size jquery.load() kullanmak istiyorum.

$("#productsContainerHolder").load("/my/products/url #productsContainer", { myParam: "beer", myParam2: "cold"}); 

$ .Load Steve Lüscher tarafından

<div id="productsContainerHolder"> 
    <div id="productsContainer> 
     ... 
    </div> 
</div> 
+0

Düzen, önemli miktarda yanıt süresi aldığı için düzeni oluşturmuyorum. Ayıklamak gerçekten burada bir sorun değil. –

0

Bu article, tüm içeriğini almak, bir 'GET' yöntemi ile sunucu çağrı oradan #productsContainer ayıklamak ve "#productsContainerHolder" konulu ekleyecektir Benzer bir durumu açıklarsa sorun, açıkladığınızdan daha aralıklıdır. önerilen çözümler şunlardır:

  1. yanıta göre biçim

  2. kullanın farklı bir URL gönderildiği tarihte AJAX tüm istekleri iptal Eğer

bekliyoruz

Steve ajax isteklerinde cancel() kullanarak # 1 için gitti.

Sen kullanmış hangi tarayıcılarla söz etmeyin, bir tarayıcı ile ilgili soruyu here

+1

İlk çözüm benim durumumda gerçekten geçerli değil. Ama aynı sorunu bildiren diğer insanları gördüğüme sevindim. Bağladığınız soru benim için alakalı görünmüyor, ancak Safari kullanıyorum. Firefox'ta da test edilmiştir. –

0

Kullanım Vary: Accept yoktur. Bu çalışmalı.

+0

Bunu denedim ama sorun hala var. Düşüncelerimi yukarıdan kopyala: Tarayıcı her iki yanıtı da düzgün bir şekilde önbelleğe alıyor. Ancak Content-Type (İçerik Türü): text/html nedeniyle bunları eşit olarak ele alır ve sonuncusu olanı gösterir. –

0

Muhtemelen en kolayı, jquery Ajax yönteminin 'önbellek' parametresini 'False' olarak ayarlamaktır. Otomatik olarak, önbelleğe alınmasını engelleyen URI'ye bir zaman damgası ekler.

Bu

aşağıdaki parçada ile geniş bir uygulama yapılabilir: önbellek bile dinamik istek için fark etmez

$.ajaxSetup({ 
    cache: false 
}); 

varsa, saat birlikte tarihe göre zaman damgası kendini üretebilir.

0

Özel değil (mutlaka proxy için) özel olarak mutlaka-revalidate göndermeyi deneyin.

Cache-Control: max-age=3600, must-revalidate 

Ben bu makaleyi okumanızı öneririz: http://www.mnot.net/cache_docs/ için daha iyi olur. Ayrıca, yerel makinenizi veya isp cihazlarınızı elemek için sonuçlarınızı test etmek üzere Mark'ın aracını http://redbot.org/ kullanın.

İlgili konular