2011-11-16 29 views
11

Mam aplikację szyny i wciąż otrzymuję dziwne zachowanie z żądaniami pjax. Kiedy zajrzę do moich logów programistycznych, zauważyłem, że tworzone są dwie prośby. Pierwsza prośba to pjax, a następna nie. W rezultacie strona wciąż się ładuje.żądanie przesłania jquery pjax dwa razy

Doceniam, czy ktoś mógłby mi w tym pomóc.

+2

Musimy zobaczyć więcej niż nieliczne wyjaśnienie twojego pytania. Opublikuj odpowiedni kod, pliki dziennika lub inne rzeczy. – Bojangles

+0

Używam tego samego problemu. Mam przykład dostępny [tutaj na cloudfoundry] (http://scaffolding.cloudfoundry.com/book/list). Łącza do sortowania paginacji i tabel powinny być pjax, ale za pomocą firebuga można je obserwować, wykonując jedno żądanie XHR, a następnie odświeżając całą stronę. Kod źródłowy uruchomionej aplikacji to [tutaj na GitHub] (https://github.com/robfletcher/grails-enhanced-scaffolding/tree/pjax) odpowiedni plik prawdopodobnie będący 'grails.list.js' –

+1

z Firebug Ustaliłem, że w moim przypadku domyślny moduł obsługi powodzenia pjax nie znajdzie żadnej zawartości za pomocą selektora fragmentów, który mu dałem. Patrząc na [kod pjak] (https://github.com/defunkt/jquery-pjax/blob/master/jquery.pjax.js#L106) w takim przypadku wykona on pełne odświeżenie strony. Nie jestem jasne, dlaczego selektor nie działa, ponieważ odpowiedź AJAX wydaje się być w porządku i selektor jest ważny. –

Odpowiedz

14

Wtyczka JQuery pjax ma domyślną obsługę błędów, która po prostu przeładuje stronę docelową. Ten moduł obsługi błędów zostaje wywołany, gdy upłynął limit czasu, który jest bardzo niski. W rezultacie, jeśli twoja prośba trwa zbyt długo, zobaczysz dwie identyczne żądania. Żądanie pjax (prawdopodobnie z zestawem atrybutów _pjax), po którym następuje kolejne żądanie niepubliczne. W przeglądarce najprawdopodobniej zobaczysz przeładowanie całej strony.

Jedną z rzeczy, które znalazłem w mojej sytuacji, było to, że sama reakcja nie trwała tak długo. Jednak HTML, który został zwrócony, zawiera osadzony flash. Nie jestem pewien, czy kod pjax dostaje odpowiedź przed załadowaniem Flasha czy po nim.

Aby rozwiązać ten problem, zmieniłem kod PJax aby wyglądać ...

$.pjax({ 
     url: xhr.getResponseHeader('Location'), 
     container: '#container', 
     timeout: 4000 // pick a suitable timeout 
     }); 

Oczywiście, to jest bezpośrednio dzwoniąc pjax. Jeśli nie dzwonisz bezpośrednio, musisz znaleźć podobne rozwiązanie.

+0

Uratowałem mi życie! :) To nie było wysyłanie dwóch wniosków, ale po prostu anulowanie pierwszego, a następnie przeładowanie .. Anyways - działa idealnie! –

1

W tym numerze również znalazłem się - wygląda na to, że jest to problem związany z buforowaniem przeglądarki. Zauważyłem, że jeśli wyczyści historię i pamięć podręczną, przestanie się dziać w Chrome. Nie udało mi się go jeszcze rozwiązać, ale wyobrażam sobie, że ma to coś wspólnego z wyłączeniem buforowania przeglądarki?

+1

Okazało się, że moim problemem było upłynięcie limitu czasu. Upłynięcie limitu czasu: 2000 w funkcji pjax naprawiło to dla mnie. Znalazłem również pusty kontener pjax w części mojego układu. Kiedy nawigowałem do tego fragmentu, powodowało to błąd w konsoli przeglądarki. Udało mi się to naprawić, umieszczając w nim pusty element. – andrewajo