重新加载IFRAME,而不添加到历史记录中


68

我正在更改IFRAMEsrc以便重新加载它,它的工作正常,并在onload加载HTML时触发该事件。

但这为历史添加了一个条目,我不想。有什么方法可以重新加载IFRAME而不影响历史记录吗?


6
我猜问题是后退按钮实际上会在实际转到上一页之前在iframe中循环。
Darryl Hein

3
无论执行什么操作,我都不想在历史记录中添加任何内容,或者有什么方法可以删除最新的历史记录条目?
罗宾·罗德里克斯

Answers:


32

您可以使用javascript location.replace

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

用提供的URL中的文档替换当前文档。与Assign()方法的区别在于,使用replace()之后,当前页面将不会保存在会话历史记录中,这意味着用户将无法使用“后退”按钮导航到该页面。


3
这不会定位到页面本身吗?我只想重新加载IFRAME,但无法控制加载的文档中运行的脚本。
罗宾·罗德里克斯

6
只需将“窗口”替换为对iframe的引用即可。
以实玛利

3
为什么不是那么简单?var ifr = document.getElementById(“ iframeId”); ifr.location.replace(ifr.src);
epascarello,2009年

2
尝试使用window.frames['frame_name'].location
ChrisD 2011年

14
您也可以使用iframe.contentWindow.location.replace(href);
Kyle

75

使用replace()仅是您自己的域iframe的一种选择。它无法在远程站点上工作(例如,twitter按钮),并且需要一些特定于浏览器的知识才能可靠地访问子窗口。

相反,只需删除iframe元素并在同一位置构建一个新元素即可。仅当您src在DOM中修改属性后才创建历史记录项,因此请确保在附加属性之前进行设置。

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


6
虽然此答案比接受的答案新2年,但这是更改iframe URL / src而不添加浏览器历史记录的正确方法。出于安全原因,window.frames [frameName] .location和/或history.replaceState的任何其他组合在iframe中均无法使用。即使在同一个域中(正如我刚刚发现的)。
塞缪尔·克莱

这是我尝试过的最佳工作答案。解决了我的问题。
pawelglow

解决的办法就是这个!我需要创建iframe,以便历史记录保持不变。
roq

好答案。我试图添加带有iframe和angular的vimeo嵌入式视频,如下所示:<div ng-repeat="item in ct.items"><iframe src="{{item.url}}"></iframe></div>。碰巧在angular设置iframe网址之前,html尝试使用错误的url(如)加载iframe {{item.url}},结果是iframe的src更改了,从而导致了浏览器历史记录问题!解决方案是稍后在用角度渲染所有内容后使用jquery创建iframe。
法比奥·马加宁(FábioMagagnin)'18年

如果从iframe本身内部更改了网址,是否还会发生此问题(例如,如果用户单击或JS重定向到iframe内部的第二页)?我不直接通过DOM更改iframe src。例如:我在SPA的iframe中嵌入了一个AdobeEsign页面,该页面重定向到同一iframe中的“感谢”页面(然后,“感谢”页面将windows.postmessage发送回我的主框架,以便我可以关闭iframe)。 ..,但此时单击我SPA中的“浏览器后退”按钮似乎就像是要“离开页面”(当用户离开SPA时会触发我的window.beforeunload事件)。
Armyofda12mnkeys

21

就像上面的Greg一样,.replace()函数就是执行此操作的方法。我似乎无法弄清楚如何回答他的答案*,但诀窍是引用iFrames contentWindow属性。

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

*得知我需要更多声誉才能对答案发表评论。


13

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

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

var container = iframe.parent();

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

container.append(iframe);

我真的很喜欢:事实证明,这比创建新的iframe容易得多,因为您无需将所有属性都复制到新的iframe(id,大小,样式类,...)
Legolas

9

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

替换为:

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

这样:

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

将允许您在data不影响历史记录的情况下更新属性。如果您使用声明性框架(例如React.js,您不应该执行任何命令性命令来更新DOM的地方),这将很有用。

iframe和之间的区别的更多详细信息object使用iframe或Object标签将网页嵌入另一个


同意很好的答案@JBE,这对Angular2极大地帮助了我,并且没有iframe src更改会触发历史记录更新。
N.Schipper

这对我不起作用。我在Chrome中。即使销毁iframe并将其替换为对象仍然会导致浏览器的历史记录状态变糟(这没有意义,因为被销毁的对象将永远无法收回其内容)。咕rr咕rr
trusktr

5

尝试使用此功能将旧iframe替换为从旧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

使用该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')
}

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


如果由于某种原因未在iframe中加载onload,请使用以下语法将目标框架名称而不是window放置:

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



注:对于此脚本所有onclickonmouseoveronmouseoutonloadhref="javascript:"将工作。


0

JDandChips答案在跨源iframe(youtube)上为我工作,这是在普通JS中(没有JQuery):

const container = iframe.parentElement;

container.removeChild(iframe);

iframe.setAttribute('src', 'about:blank');

container.appendChild(iframe);

0

@JDandChips在上面有一个很好的答案,但是语法应该从parent()更新为parentElement

var container = iframe.parentElement;

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

container.append(iframe);

欢迎来到StackOverflow!如果答案在很大程度上是正确的,并且只需要稍作更新,则应建议对答案进行修改,而不要自己发布新答案。如果您的建议被接受,它将为您提供徽章:)
Das_Geek '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.