重新加载一个IFRAME而不添加历史logging

我正在更改一个IFRAME的src为了重新加载它,它的工作正常,并在其加载HTML时触发onload事件。

但它增加了一个我不想要的历史logging。 有没有办法重新加载IFRAME,但不影响历史?

你可以使用javascript location.replace

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

使用提供的URLreplace当前文档。 与assign()方法的不同之处在于,在使用replace()之后,当前页面将不会保存在会话历史logging中,这意味着用户将无法使用“后退”button导航到该页面。

使用replace()只是您自己的域名iframe的一个选项。 它无法在远程站点上工作(例如:推特button),并需要一些浏览器特定的知识才能可靠地访问子窗口。

相反,只要删除iframe元素,并在同一地点构build一个新的。 历史logging项仅在修改src属性到DOM之后才创build,因此请确保在追加前设置它。

编辑:JDandChips正确地提到,你可以从DOM中删除,修改,并重新追加。 不需要构build新鲜。

像Greg上面所说,.replace()函数是如何做到这一点的。 我似乎无法弄清楚如何回复他的答案*,但诀窍是引用iFrames的contentWindow属性。

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

*刚学到我需要更多的声誉来评论一个答案。

重新创buildiframe的另一种方法是从DOM中删除iframe,更改src然后重新添加。

在很多方面,这与replace()build议类似,但是当我用History.js尝试这种方法并手动pipe理状态时,我遇到了一些问题。

 var container = iframe.parent(); iframe.remove(); iframe.attr('src', 'about:blank'); container.append(iframe); 

尝试使用此function来replace旧的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的URL添加到浏览器历史logging中。

一种解决scheme是使用object标签而不是iframe标签。

取代这个:

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

这样:

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

将允许您更新data属性而不影响历史logging。 如果您使用声明式框架(如React.js ,那么您不应该执行任何命令性命令来更新DOM,这非常有用。

有关iframeobject之间差异的更多细节: 使用Iframe或Object标签将网页embedded到另一个中

最简单和快速的加载解决scheme
加载页面或框架时,请使用window.location.replace不更新历史logging。

对于链接看起来像这样:

 <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');" 

注意:对于这个脚本,所有onclickonmouseoveronmouseoutonloadhref="javascript:"都可以工作。

使用replace方法绕过添加iframe的URL到历史logging:

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') }