2011-11-16 69 views
11

我有一個rails應用程序,我不斷收到奇怪的行爲與pjax請求。當我查看我的開發日誌時,我可以看到有兩個請求正在進行。第一個請求是pjax,下一個不是。結果頁面仍然重新加載。jquery pjax請求發送兩次

我很感謝有人能幫助我。

+2

我們需要看到的不僅僅是你的問題的稀疏解釋。請發佈一些相關的代碼,日誌文件或其他東西。 – Bojangles

+0

我遇到了同樣的問題。我有一個可用的示例[這裏是cloudfoundry](http://scaffolding.cloudfoundry.com/book/list)。分頁和表格排序鏈接應該是pjax,但使用螢火蟲,您可以觀察到它們發出一個XHR請求,然後整個頁面刷新。運行在那裏的應用程序的源代碼是[在GitHub上](https://github.com/robfletcher/grails-enhanced-scaffolding/tree/pjax)相關文件可能是'grails.list.js' –

+1

With Firebug我已經確定,在我的情況下,pjax的默認成功處理程序無法使用我給出的片段選擇器來查找任何內容。在這種情況下,查看[pjax代碼](https://github.com/defunkt/jquery-pjax/blob/master/jquery.pjax.js#L106),它將執行整頁刷新。我不清楚爲什麼選擇器不工作,因爲AJAX響應看起來很好,選擇器也是有效的。 –

回答

14

JQuery pjax插件有一個默認的錯誤處理程序,它將簡單地重新加載目標頁面。這個錯誤處理程序在超時過後被調用,這個pjax設置得非常低。因此,如果您的請求時間過長,您會看到兩個相同的請求。 pjax請求(可能帶有_pjax屬性集),後面是另一個非pjax請求。在瀏覽器中,您可能會看到整個頁面重新加載。

我在我的情況中發現的一件事是,反應本身並沒有花費太多時間。但是,返回的HTML包含Flash內嵌。我不確定pjax代碼是否在加載Flash嵌入之前或之後得到響應。

爲了解決這個問題,我改變了我的PJax代碼看起來像......

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

當然,這是直接調用pjax。如果你不直接打電話,你必須找到一個類似的解決方案。

+0

拯救了我的生命! :)它不是發送兩個請求,而只是取消第一個,然後重新加載..無論如何 - 完美的作品! –

1

我也遇到過這個問題 - 它看起來像是一個與瀏覽器緩存相關的問題。我注意到,如果我清除歷史記錄並將其緩存在Chrome中停止發生。我還沒有能夠解決它,但我想這與禁用瀏覽器緩存有關。

+1

原來我的問題是請求超時。在pjax函數中傳遞超時:2000爲我解決了這個問題。我還發現我的佈局中有一個空的pjax容器。當我導航到這個片段時,它給了我一個瀏覽器控制檯的錯誤。我能夠通過在其中放置一個空的span元素來修復它。 – andrewajo