2009-10-19 28 views
33

我正嘗試用不同的網址哈希重新加載當前頁面,但它不能按預期工作。如果所有在url中更改的內容都是散列,如何強制頁面重新加載?

(澄清我怎麼想它的工作:重新加載頁面,然後滾動到新的哈希)

方法1:

window.location.hash = "#" + newhash; 

只有滾動到這種定位的不重裝頁。

方法2:

window.location.hash = "#" + newhash; 
window.location.reload(true); 

有點兒工作,但它首先滾動到錨,然後再重新加載頁面,然後滾動到錨。

方法3:

window.location.href = window.location.pathname + window.location.search + "&random=" + Math.round(Math.random()*100000) + "#" + newhash; 

作品,但我寧願不是隨機的垃圾,將網址添加。

有沒有更好的解決方案?

回答

30

刪除您要導航到的錨點,然後使用方法#2?由於沒有錨,因此設置散列不應滾動頁面。

+5

起初,我不明白你的意思是從DOM中刪除它。它的工作,謝謝。 – serg 2009-10-19 17:07:51

+1

如果你想保持顯示更完整,只要刪除它的'name'或'id'屬性就可以滿足這些目的 - 節點本身可以​​保留。 – ecmanaut 2012-10-16 01:10:19

2

應該預計#foo將滾動到id的錨點「foo」。如果你想使用方法#1並重新加載,這種方法可能會起作用。

if (Object.defineProperty && Object.getOwnPropertyDescriptor) { // ES5 
    var hashDescriptor = Object.getOwnPropertyDescriptor(location, "hash"), 
    hashSetter = hashDescriptor.set; 
    hashDescriptor.set = function (hash) { 
     hashSetter.call(location, hash); 
     location.reload(true); 
    }; 
    Object.defineProperty(location, "hash", hashDescriptor); 
} else if (location.__lookupSetter__ && location.__defineSetter__) { // JS 
    var hashSetter = location.__lookupSetter__("hash"); 
    location.__defineSetter__("hash", function (hash) { 
     hashSetter.call(location, hash); 
     location.reload(true) 
    }); 
} 
+0

我無法讓它工作。即使它確實聖潔$%^&:) – serg 2009-10-19 19:57:26

+0

我從來沒有測試過它,但它應該在每個主要的瀏覽器中工作(不包括IE <8),如果不是這樣,它很可能是因爲IE不允許重新定義描述符location.hash爲「安全原因」,雖然這是公牛 – 2009-10-19 20:48:24

+0

這種方法適合我!奇怪的 – fabio 2013-08-10 16:02:00

3

我有這樣的,如果有附加到我的情況下,URL的哈希其檢測$(document).ready()發射了jQuery函數,所以我一直認爲功能相同,然後就使用武力重載每當散列變化是檢測:

$(window).on('hashchange',function(){ 
    window.location.reload(true); 
}); 

然後我的另一個功能 -

$(document).ready(function() { 
    var hash = window.location.hash;  
    if(hash) { 
      //DO STUFF I WANT TO DO WITH HASHES 
    } 
}); 

在我而言,這是罰款UX - 也許不是爲別人好。

+1

jQuery的ready事件不會在'window時觸發。location =「#myHash」'被執行,我相信這將成爲這個問題的一個重點。但是,此代碼對於加載動態內容很有用,例如,如果重新加載頁面。 – JoeBrockhaus 2014-12-30 19:03:19

0

另一種選擇是去除哈希並將其存儲在會話存儲上重裝要檢索:

var newUrl = location.href + '#myHash'; 
var splitUrl = newUrl.split('#'); 
newUrl = splitUrl[0]; 
if (splitUrl[1]){ 
    sessionStorage.savedHash = splitUrl[1]; 
} 
location.href = newUrl; 

,然後在你的頁面的頂部,你可以有下面的代碼:

var savedHash = sessionStorage.savedHash; 
if (savedHash){ 
    delete sessionStorage.savedHash; 
    location.hash = savedHash; 
} 
相關問題