2011-04-13 67 views
6

我在網上做了一些窺探,發現window.location.hash = "etc"是一個廣泛採用的方法來更新瀏覽器的位置,而無需重新加載/刷新頁面。我申請的是對這個例子中,我已經熟了起來:http://dl.dropbox.com/u/1595444/locationExample/index.htmlwindow.location.hash在Chrome中刷新?

作品以及在Safari,但...

我已經注意到的是,在Chrome 10或可通過改變hash

  • 有一些類似於重新加載。
  • 產生的症狀是用戶向下滾動或向上滾動時的呃逆。
  • 我的控制檯輸出被保留(如果您檢查您的控制檯項目字符串的輸出)。
  • favicon似乎正在重新加載。
  • 有沒有人遇到過這個問題?知道一個修復?

    回答

    6

    有最有可能兩件事情怎麼回事:

    • 的圖標和停止/刷新按鈕閃爍,因爲a Chrome bug(即提到pushState,但哈希變化 相同的代碼路徑)。
    • 滾動時的輕微打嗝是因爲Chrome執行整頁重繪和高質量縮放來更新頁面縮略圖,因爲它將散列更改視爲生成新URL。這也是a bug。你可以在巡視時間軸視圖中看到這一點,大多數滾動事件導致重繪窗口寬度 x 一些小高度,但偶爾會出現全窗口重繪。 This blog post有更多的細節。

    兩種解決方法都是推遲哈希更新,直到用戶完成滾動(您仍然可以立即更新顯示在當前項目下的白色條)。您可以通過有喜歡的東西做到這一點:因爲它看起來像你正在使用jQuery

    var scrollTimeout; 
    window.onscroll = function() { 
        // update current item display here 
        if (scrollTimeout) 
        clearTimeout(scrollTimeout); 
        scrollTimeout = setTimeout(function() { 
        scrolTimeout = undefined; 
        // update hash here 
        }, 100); 
    }; 
    

    ,有debouncing plugins,可能會有幫助。

    +0

    目前只有在沒有散列集的情況下跳轉到錨纔有效。 (例如:your.tld/blog#comment-1)爲了跳轉到一個新的錨,你必須在應用新的散列之前將散列設置爲null(window.location.hash = null)(window.location.hash ='#評論-2'),而不是它的作品。希望能幫助別人。 – daslicht 2014-08-28 11:33:01

    1

    我沒有一個明確的答案,但首先我會嘗試:

    1. 在前面加上井號(#)的值(即使用window.location.hash =「#etc」) 。
    2. 註冊window.onhashchange處理程序的處理程序。
    3. 或者,如果您試圖完成的操作是使後退按鈕返回到先前的邏輯位置,則可以考慮使用history.pushState(我不清楚您正在嘗試完成的操作,無論您是想跳到某一節該頁面,或更復雜的東西)。
    +0

    http://groups.google.com/a/chromium.org/group/chromium-discuss/browse_thread/thread/5e8cc6b1ee6c470f – jonobr1 2011-04-18 20:09:46

    1
    var r='#hello'; 
    if(navigator.userAgent.indexOf('Chrome/')!=-1){ 
    top.history.pushState("", "", r); 
    return; 
    }; 
    if(r.charAt(0)=='/'){ 
        top.location.replace(r); 
    }else{ 
        top.location.hash=r; 
    }; 
    

    爲我工作。實際上,我花了很長時間才弄清楚這一點。 Firefox現在也支持history對象,所以我們可能會在幾年內擺脫整個「散列」事情。

    編輯:是的,重新加載的東西是一個Chrome的錯誤。

    相關問題