【问题标题】:How can I prevent Iframe messing browser's history after interactions with it?如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?
【发布时间】:2020-01-30 02:36:17
【问题描述】:

因此,就我而言,我使用 iframe 将 Grafana 附加到我的页面(这为我提供了美观且易于使用的图表)。

可能会注意到 Grafana 的 iframe 会在图表上的每次放大或缩小(使用鼠标单击)交互后触发我的 Angular 页面上的一种刷新,从而弄乱浏览器的历史记录。我在 Iframe 的 src 上没有看到任何更改来证明此页面刷新是合理的,并且它显然不会触发任何事情(例如,不会触发任何 onload)。

这是正常行为吗?我怎样才能防止这种情况发生?

我正在使用 Grafana 6.2.2 版和 Angular 6.1 的脚本仪表板。

【问题讨论】:

  • 请提供Stackblitz 或任何其他minimal-reproducible-example 以重现您的错误。
  • @zerocewl 这样做有点复杂,因为我需要一个始终为 iframe 内容提供服务的 Grafana 实例。 Grafana 是一个图形应用程序,可以绘制来自多个数据库的数据。
  • 如果 url 没有改变,很可能他们正在使用pushState。因此,也许它很简单,就像在 iframe 中运行 history.pushState = history.replaceState; 以将您的 lib 正在使用的调用更改为不会创建新历史条目的调用。如果这不起作用,您仍然可以监视导航事件并尝试将它们返回()。当然,如果你想保持后退按钮的工作方式,管理所有排列会更复杂,但听起来 iframe 无论如何都应该是只显示的。
  • @dandavis 我认为它也应该只显示。我已经在 Grafana 的 Github 上打开了一个 issue,但他们并没有对此给予很大的关注。 github.com/grafana/grafana/issues/17614

标签: javascript html angular grafana


【解决方案1】:

希望能提供帮助,我可能会在您的场景中尝试一些事情:

  1. 只有一个 grafana iframe 的空白 html 页面。看看它是否仍然刷新父页面。如果不是,那么问题可能出在 Angular 上。
  2. 您说沙盒会破坏 iframe?也许可以使用不同的沙盒值。像 allow-scripts 一样,看看它是否需要这些值之一才能工作

    https://www.w3schools.com/tags/att_iframe_sandbox.asp

  3. 也许尝试将 grafana iframe 放入另一个 iframe。我以前从未这样做过,但它可能会尝试刷新父 iframe 而不是父页面。

将您的 Angular html 代码也发布到问题中可能会有所帮助。里面可能有一些提示。

【讨论】:

  • 这一切都说得通。我会尝试这些建议,稍后我会得出结果。非常感谢
  • 1.问题仍然存在。 2- 当外面有另一个 iframe 时,Grafana iframe 停止工作。 3 - 尝试 sandbox="allow-same-origin allow-scripts" 以工作,但问题仍然存在。
【解决方案2】:

如果没有 iframe 的有效实施,很难提出最佳的行动方式。

想到的最简单的解决方案是iframesandbox属性:

<iframe src="my_iframe.html" sandbox></iframe>

什么是 iframe 沙盒?

沙盒属性为 iframe 中的内容启用了一组额外的限制。

当沙盒属性存在时,它将:

  • 将内容视为来自唯一来源
  • 阻止表单提交
  • 阻止脚本执行
  • 禁用 API
  • 防止链接针对其他浏览上下文
  • 防止内容使用插件(通过 、 、 或其他)
  • 阻止内容导航其顶级浏览上下文
  • 阻止自动触发的功能

沙盒属性的值可以只是沙盒(然后 应用所有限制),或以空格分隔的列表 将删除特定限制的预定义值。

参考:https://www.w3schools.com/tags/att_iframe_sandbox.asp

【讨论】:

  • 要更好地说明场景有点复杂,因为我需要一个始终为 iframe 内容提供服务的 Grafana 实例。 Grafana 是一个图形应用程序,可以绘制来自多个数据库的数据。
  • 除此之外,我已经尝试使用沙盒 iframe 的属性,但由于某种原因,Grafana 甚至无法加载。它只是永远处于加载状态。
  • 我已经在 Grafana 的 Github 上打开了一个 issue,但他们并没有对此给予很大的关注。 github.com/grafana/grafana/issues/17614
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2022-01-19
  • 2015-06-14
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多