2014-07-06 71 views
3

我知道有很多與Chrome和popstate事件相關的主題,但是在將Chrome升級到版本35後,我遇到了一個新的問題。點擊後退按鈕後Chrome 35觸發popstate

這種情況:你選擇

我有類別和過濾器的列表頁面,之後類別,網頁等內容,通過AJAX重新加載和一切歷史API工作正常處理。

但是,當您轉到列表中的項目的詳細頁面 - 標準請求時,整個頁面將被重新加載 - 然後在瀏覽器上按下返回按鈕,您可以看到一個列表頁面,您可以在上次點擊某個項目後觸發popstate (我不會在這裏討論關於初始頁面加載時的chrome popstate,因爲在版本34中popstate不會在init中觸發),並且由於前面提到處理類別的代碼會重新加載整個頁面。

所以問題是,鉻35觸發popstate情況下,我們按後退按鈕後,我的問題是:

如何檢測該事件被觸發的用戶來了以後回來從詳細信息頁面到我的房源頁面不重新加載這一個。

我嘗試使用文檔對象引用等等,但當它看起來像第一次解決方案時總是有這種情況,當它不工作。

回答

0

我一直在遇到這個問題。我的解決方案有點破解,但它似乎工作得很好,否則。我發現在設置我的onpopstate處理程序之前等待150毫秒足以等待Chrome運行其初始onpopstate處理程序,您可以使用它來獲得「優勢」。例如,爲了檢測是否初始onpopstate已運行:

// wait for page to load 
$(function() { 
    var no_initial_onpopstate = true; 
    var enabled = true; 

    window.onpopstate = function() { 
    if(!enabled) return; 
    console.log("detected initial onpopstate"); 
    no_initial_onpopstate = false; 
    } 

    setTimeout(function() { 
    enabled = false; 
    console.log("No initial onpopstate: ", no_initial_onpopstate); 

    // no_initial_onpopstate indicates if the browser emitted an initial 
    // onpopstate event. Do with that information what you will 

    // 150ms delay seems to be the "magic number" to wait for Chrome to 
    // run all of its initial onpopstate handlers (in my tests on localhost, at least) 
    }, 150); 
}); 

所以,從這個據我瞭解,瀏覽器的DOM準備的事件後時間150ms設置你的`onpopstate」回調將跳過鉻的初始onpopstate。

相關問題