2009-07-01 46 views
3

看來我必須錯過一些完全基本的東西。我想要實現的東西看起來很常見,所以這讓我想知道爲什麼沒有直接的方法。強制頁面刷新並跳轉到#部分

問題是我想從JavaScript刷新當前頁面,並同時登陸#section。如果我只是做:

document.location.href = document.location.href + "#section"; 

我測試的所有瀏覽器只是滾動到該#section(無重新加載)。這是有道理的。只是爲了完整性,如果我做

document.location.assign(document.location.href + "#section"); 

它做同樣的事情(毫不奇怪,它內部歸結爲相同的功能肯定)。最後,document對象似乎也有document.reload()函數,它接受一個可選的布爾參數,指定是否要強制重新加載,但很明顯,它不允許指定#section。我能找到(使用這些方法)的唯一途徑是以下組合:

document.location.assign(document.location.href + "#section"); 
document.location.reload(); 

但它不是理想的,因爲你可能已經猜到了,它滾動,然後這將導致實際滾動三次瀏覽器重新加載到底。

我知道有辦法繞過它:服務器端重定向或添加一些獨特的隨機查詢字符串參數,但似乎很奇怪,沒有簡單的方法。

+1

最明顯的問題是:爲什麼在世界上根本的頁面需要重新加載? – 2009-07-01 15:58:53

回答

1

這是位置對象的「散列」值。您需要設置它像這樣...

location.hash = "#section"; 

如果沒有始終如一地工作,你可能要考慮使用scrollToElement功能...

function scrollToElement(elem) { 
    if(typeof elem == 'string') elem = document.getElementById(elemId); 
    var top = 0; 

    if(elem) { 
     if(elem.offsetParent) { 
      top = elem.offsetTop; 

      while(elem = elem.offsetParent) { 
       top += elem.offsetTop; 
      } 
     } 

     window.scrollTo(0, top); 
    } 

} 

如果絕對需要一個頁面重載(不知道爲什麼你曾經會),嘗試在自己開了一扇窗......

window.open(location.href + '#section', '_top'); 

或者嘗試替換...

location.replace(location.href + '#section'); 
+0

謝謝。我沒有想到window.open(),但我只是測試它,如果我沒有弄錯,它的行爲方式是一樣的。它只是滾動並且不會觸發完整的重新加載。 – 2009-07-01 20:54:18

+0

我知道這可能聽起來有點腥(強迫一個reaload),也許它會,我稍後會改變它。但是這是我正在開發的第一個應用程序版本,優先考慮的是有一些完整的工作版本,然後研究細節。但無論如何,我驚訝於我期望在JavaScript中輕鬆完成的事情畢竟不是那麼容易。 – 2009-07-01 20:57:01

0

有一個非常非常簡單的解決方案:

if (document.location.href.match(/[?]/)) 
    document.location.href = document.location.href + '&fake_param=' + Math.random() + '#section' ; 
else  
    document.location.href = document.location.href + '?fake_param=' + Math.random() + '#section' ;