2012-01-17 115 views
0

我知道有類似的話題,但我仍然沒有得到工作解決方案。我想發送$.post方法到服務器,並且在它之前我想修改URL(以允許用戶彼此共享URL),但不重新加載頁面。怎麼做 ?修改網址而不重新加載頁面

編輯:換句話說,我想讓$.post方法過濾頁面上顯示的數據。但我也想修改用戶可以複製的URL。

+0

在現代瀏覽器中,你可以使用HTML5的['History.pushState'(http://badassjs.com/post/840846392/location-hash-is-dead-long-live-html5-pushstate) 。 – 2012-01-17 21:34:52

+0

但是這會修改歷史記錄,而不是當前的網址。 – Armin 2012-01-17 21:37:41

+0

@Armin:有['History.replaceState'](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_replaceState().C2.A0方法),它只會改變當前的URL而不會推入歷史。 – 2012-01-17 21:50:13

回答

0

這是不可能的。只有在#(哈希a.k.a.片段)之後的部分中,您可以修改而無需重新加載。之前的整個休息會啓動新的(或舊的)url的加載。

你可以用下面的JavaScript改變(與重裝):如果用戶使用的是最新的瀏覽器(幾乎任何東西,這不是IE)

location.href = 'http://www.whatever.com'; 
+0

您無法修改表單元素上的'action'屬性? – 2012-01-17 21:37:18

+0

你可以,但是,他想要什麼? – Armin 2012-01-17 21:38:05

+0

也許我讀錯了,但它聽起來像他想在實際發佈之前更改'POST'操作的URL。 – 2012-01-17 21:39:15

2

,您可以使用新的HTML5 history methods。具體而言,history.replaceState

replaceState()將更改頁面的URL而不重新加載它。您可以使用它像這樣:

$.post('/some/url/', {some: data}, function(d){ 
    // Do whatever with the returned data... 

    // Change page URL 
    history.replaceState({}, '', '/some/url/'); 
}); 

或者你也可以加載數據前更改URL:

// Change page URL 
history.replaceState({}, '', '/some/url/'); 
// load page data 
$.post('/some/url/', {some: data}, function(d){ 
    // Do whatever with the returned data... 
}); 

對於replaceState一個例子,去這裏:https://github.com/features/projects,並點擊4個選項卡。觀看網址更改,但沒有添加到歷史記錄:-)

+0

謝謝,我會試試看。那麼,如果用戶使用IE,URL不會改變? – Tony 2012-01-17 22:38:57

+0

@Tony:沒有。 'history.replaceState'在IE中不起作用。您應該在'replaceState'調用周圍添加'if(!!(window.history && window.history.replaceState))'。 – 2012-01-17 22:44:19

0

也許這就是你想要的?

<body> 
    ... 
    <div id='urltocopy'></div> 
    ... 
</body> 

function doPost() { 
    $('#urltocopy').html('<a href="http://newurltocopy">Please copy</a>'); 

    $.ajax({ 
      type: 'POST', 
      url: urlStr, 
      dataType: 'html', 
      success: function(data) { 

      }, 
      data: {}, 

     }); 
} 
相關問題