重新加载一个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,这非常有用。
有关iframe
与object
之间差异的更多细节: 使用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');"
注意:对于这个脚本,所有onclick
, onmouseover
, onmouseout
, onload
和href="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') }