2009-05-04 294 views
53

我正在更改IFRAME的src以重新加載它,它的工作正常並在加載HTML時觸發onload事件。重新加載IFRAME而不添加到歷史記錄

但它增加了一個條目,我不想要的歷史。有什麼方法可以重新加載IFRAME,但不會影響歷史記錄?

+5

我猜問題是後退按鈕實際上會在前一頁之前循環訪問iframe。 –

+1

不管它做什麼,我不希望添加任何歷史記錄,或者有什麼方法可以刪除最新的歷史記錄? –

回答

27

您可以使用JavaScript location.replace

window.location.replace('...html'); 

與 一個所提供網址替換當前文檔。從分配()方法 區別是 ,使用更換後的()當前 頁面不會被保存在會議 歷史,這意味着用戶將不能 能夠使用後退按鈕 導航。

+2

這不是針對頁面本身嗎?我只想重新加載IFRAME,而且我無法控制在加載文檔中運行的腳本。 –

+5

只需將「window」替換爲對iframe的引用即可。 – Ishmael

+0

它並不那麼簡單! –

17

像Greg上面說的那樣,.replace()函數是如何做到這一點的。我似乎無法弄清楚如何回覆他的答案*,但訣竅是引用iFrames的contentWindow屬性。

var ifr = document.getElementById("iframeId"); 
ifr.contentWindow.location.replace("newLocation.html"); 

*剛學會了我需要更多的聲望來評論答案。

60

使用replace()只是您自己的域iframe的一個選項。它無法在遠程站點上工作(例如:Twitter按鈕),並需要一些瀏覽器特定的知識才能可靠地訪問子窗口。

取而代之,只需刪除iframe元素並在同一個位置構建一個新元素。歷史記錄項目只在修改src屬性後纔會創建,因此請確保在追加前設置它。

編輯:JDandChips正確地提到您可以從DOM中刪除,修改並重新追加。不需要構建新鮮。

+4

雖然這個答案比接受的答案新2年,但它是在不添加瀏覽器歷史記錄的情況下更改iframe URL/src的正確方法。出於安全原因,window.frames [frameName] .location和/或history.replaceState的任何其他組合都不適用於iframe。即使在同一個域名(我剛剛發現)。 –

+0

這是我嘗試過的最好的工作答案。解決了我的問題。 – pppglowacki

+0

解決方案就是這個!我需要創建iframe,以便歷史保持不變。 – roq

5

嘗試使用此功能,以取代舊的iframe有新的iframe這是從舊的複製:

function setIFrameSrc(idFrame, url) { 
    var originalFrame = document.getElementById(idFrame); 
    var newFrame = document.createElement("iframe"); 
    newFrame.id = originalFrame.getAttribute("id"); 
    newFrame.width = originalFrame.getAttribute("width"); 
    newFrame.height = originalFrame.getAttribute("height"); 
    newFrame.src = url;  
    var parent = originalFrame.parentNode; 
    parent.replaceChild(newFrame, originalFrame); 
} 

使用方法如下:

setIFrameSrc("idframe", "test.html"); 

這樣不會增加iframe的網址瀏覽器歷史記錄。

+1

這很方便。謝謝! –

+1

可愛的,適用於Chrome和Safari。 – Amoss

11

重新創建iframe的替代方法是從DOM中刪除iframe,更改src然後重新添加它。

在很多方面,這與replace()建議類似,但是當我用History.js嘗試這種方法並手動管理狀態時,我遇到了一些問題。

var container = iframe.parent(); 

iframe.remove(); 
iframe.attr('src', 'about:blank'); 

container.append(iframe); 
+0

我真的很喜歡這樣:事實證明,這比創建新的iframe更容易,因爲您不需要將所有屬性複製到新的iframe(id,size,style classes,...) – Legolas

+0

SAVED。 MY。生活。謝謝一百萬... – gcoladarci

7

一種解決方案是使用object標籤,而不是iframe標籤。

更換此:

<iframe src="http://yourpage"/> 

通過這樣的:

<object type="text/html" data="http://yourpage"/> 

將讓您在不影響歷史更新data屬性。如果您使用聲明性框架(例如React.js),那麼您不應該執行任何命令性命令來更新DOM,這非常有用。在iframeobject之間的差異

更多細節:Use of Iframe or Object tag to embed web pages in another

+0

!!!最佳答案 !!! – xiefei

+0

同意很好的答案@JBE這對我非常有幫助Angular2,並沒有iframe src更改觸發歷史記錄更新。 –

+0

這對我不起作用。我在Chrome中。即使銷燬iframe並將其替換爲對象,仍然會導致darn瀏覽器的歷史狀態(這是毫無意義的,因爲被銷燬的對象永遠不會獲得它的內容)。 Grrrrrrrrr。 – trusktr

0

最簡單,最快速裝載解決方案
使用window.location.replace加載頁面或幀時不更新歷史。

對於鏈接,它看起來是這樣的:

<a href="#" onclick="YourTarget.location.replace ('http://www.YourPage.com');"> 
The targeted Link</a> 

<a href="javascript:YourTarget.location.replace ('http://www.YourPage.com');"> 
The targeted Link</a> 



如果你希望它不是從一個鏈接行爲,但在加載框架時自動採取行動那麼從iframe中您應該將其放入iframe文件正文部分:

onload="window.location.replace ('http://www.YourPage.com');" 


如果由於某種原因在onload不會在iframe中加載,然後在語法像這樣把你的目標框架名稱,而不是窗口:

onload="YourTarget.location.replace ('http://www.YourPage.com');" 



注意:對於此腳本全部onclick,onmouseover,onmouseout,onloadhref="javascript:"將起作用。

0

使用replace方法繞過添加iframe的URL的歷史:

HTML:

<iframe id="myIframe" width="100%" height="400" src="#"></iframe> 

的JavaScript:

var ifr = document.getElementById('mIframe') 
if (ifr) { 
    ifr.contentWindow.location.replace('http://www.blabla.com') 
} 
相關問題