2012-07-04 7 views
6

Mam stronę, do której można uzyskać dostęp za pośrednictwem adresu URL/produktów. Gdy odwiedzam ją w przeglądarce, odpowiada ona całą stroną w układzie. Oto uproszczony przykład żądanie nagłówków i treści odpowiedzi:Przeglądarka nie rozróżnia częściowego kodu HTML uzyskanego za pośrednictwem AJAX i pełnej strony.

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

<layout> 
<products /> 
</layout> 

Gdy użytkownik wykonuje pewne przeszukać rezultaty javascript via AJAX. Wyniki te są świadczone bez układu, ponieważ potrzeba czasu do renderowania i nie trzeba go tak czy owak:

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

<products /> 

Tak, to działało w porządku, dopóki nie dodał buforowanie Cache-Control: private, max-age=3600. Początkowo chciałem dodać nagłówek Vary: X-Requested-With, a przeglądarka rozróżniłaby dwie odpowiedzi. Jednak gdy otrzymam/produkty za pośrednictwem AJAX, a następnie odwiedzę/produkty w przeglądarce, wyświetli się częściowa odpowiedź AJAX.

Czy istnieje prosty sposób rozwiązania tego problemu?

P.S. Używam Ruby on Rails i jQuery, jeśli to ma znaczenie.

+2

Czy próbowałeś 'Vary: Accept'? – regilero

+0

Tak, to też nie działa. Myślę, że przeglądarka prawidłowo buforuje obie odpowiedzi. Ale z powodu Content-Type: text/html traktuje je jednakowo i pokazuje ostatni, który jest częściowy. –

+0

Właściwie próbowałem odpowiedzieć JSONEM, a teraz pokazuje JSON. Więc nie zależy to od typu zawartości: text/html. Jestem zaskoczony, że "Vary" nie ma tutaj żadnego efektu. –

Odpowiedz

1

Niech twoje połączenie Ajax używa innego adresu URL, jak/products/partial.

+0

To na razie wygląda jak jedyne rozwiązanie. Oznacza to jednak, że będę musiał zmodyfikować każdy adres URL po javascriptie po stronie klienta, co nie jest zbyt wygodne. –

0

Powinieneś mieć Diferent URL dla częściowych wyników (tzn? Partial = TAK lub coś takiego ...)

LUB

można uzyskać całą stronę za pośrednictwem AJAX i wyodrębnić tylko część, którą chce używać jquery.load().

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

$ .load wezwie serwera z 'get' metodzie odzyskać całą zawartość, wyodrębnić #productsContainer stamtąd i wstawić na "#productsContainerHolder"

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

Nie renderuję układu, ponieważ zajmuje on znaczną ilość czasu odpowiedzi. Wydobywanie nie jest tutaj problemem. –

0

Ten article Steve Luscher opisuje podobny przypadek, w którym problem był bardziej przerywany niż opisywany. Proponowane rozwiązania są:

  1. Anuluj wszystkich żądań AJAX w czasie, gdy formularz jest składany

  2. użyć innego adresu URL w zależności od odpowiedzi można się spodziewać

Steve poszedł na # 1 używając cancel() w żądaniach ajax.

Nie wspominając Jakie przeglądarki użyłeś, nie jest przeglądarką powiązane pytanie here

+1

Pierwsze rozwiązanie nie ma zastosowania w mojej sytuacji. Ale cieszę się, że inni ludzie zgłaszają ten sam problem. Pytanie, które łączysz, nie jest dla mnie powiązane, ale używam Safari. Testowane również w Firefoksie. –

0

Przymież Vary: Accept. To powinno działać.

+0

Próbowałem tego, ale problem nadal istnieje. Kopiowanie moich myśli z góry: Myślę, że przeglądarka prawidłowo buforuje obie odpowiedzi. Ale z powodu Content-Type: text/html traktuje je jednakowo i pokazuje ostatni, który jest częściowy. –

0

prawdopodobnie najłatwiej jest ustawić na "False" parametr "cache" dla metody jonowej Ajax. Automatycznie doda sygnatury czasowe do identyfikatora URI, zapobiegając jego buforowaniu.

Można to zrobić aplikację szeroki z następującym fragmencie:

$.ajaxSetup({ 
    cache: false 
}); 

Jeśli bufor ma znaczenie nawet dla dynamicznego życzenie, można wygenerować samemu datownik w oparciu o datę wraz z godziną.

0

Spróbuj wysłać rewalidację musi zamiast prywatnego (co jest bardziej dla proxy).

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

polecam czytanie tego artykułu: http://www.mnot.net/cache_docs/ to może pomóc. A także użyj narzędzia Mark http://redbot.org/, aby przetestować swoje wyniki, aby wyeliminować lokalny komputer lub isp lub co nie.

Powiązane problemy