小编Ven*_*ras的帖子

我可以在iframe中使用window.location.replace吗?

我们可以使用它window.location.replace避免历史记录,定位页面锚,而无需重新加载页面,不能在iframe中使用吗?

问题是违反CSP(内容安全策略),script-src 'unsafe-inline'必须启用该状态。除非我没有定义CSP,即使我定义了一个CSP并允许script-src 'unsafe-inline'它仍然给出相同的违规错误。在ie11 / chrome / ff中得到相同的结果。

iframe位于同一域(位于同一目录中)。

  1. 在控制台中定位iframe并在控制台中使用window.location.replace('/samepage.html#onpage_anchor')
  2. 有用。 它以页面锚为目标,而无需重新加载页面,也没有历史记录。
  3. 将相同的代码内联在锚链接上,它可以工作。
  4. 外部脚本中使用相同的代码获取csp违规错误。 如果不在iframe中,则效果很好。

我试图创建一个CSP允许的动作,但即使是最宽松的内容安全策略可能会允许它。


编辑:所以我把示例放到允许多个文件的插件上,这样我就可以使用引用父/子页面的正确hrefs。

有关示例的示例的注释:

  1. 这些示例中未重现该问题。 该脚本即使在iframe中也可以完美运行。但是,相同的代码在我的本地服务器上不起作用,或者当我在VPS上实时运行该代码时。

  2. 我怀疑在plunker上不会触发CSP违规,因为plunker通过某种抽象层将内容呈现给浏览器。

  3. 第一次单击父级中的手风琴链接时,它会刷新。这是因为页面最初加载的方式没有引用index.html。后续点击将按预期工作,而无需重新加载页面。在iframe中这不是问题,因为它最初会引用child.html

  4. 这些是显示代码而无需进行任何更改即可使其工作的很好的示例(如需要更改href使其在stackoverflow代码段中工作,如下所述)。这也很好,因为它显示了javascript应该可以正常工作。但这并没有显示出实际的问题。您仍然需要在编辑器中加载它,然后在本地服务器或实时托管环境中运行它,才能看到真正的问题。

柱塞示例

有脚本: 无历史记录
无脚本: 有历史记录


简化的代码示例

一键输入的简单手风琴。足以重现问题。

单击打开/关闭将展开/折叠手风琴,不需要JS。JS应该做完全相同的事情,但是没有历史记录。工作正常,但不能在iframe中使用。

代码段注释:

  1. 您可以运行该代码段以了解我所描述的内容,但实际上并不能证明问题所在。

  2. 该代码段的行为与实际浏览器中的行为不同,JavaScript无法正常工作。

  3. 该代码段显示了代码,但应在iframe中运行以查看问题。在iframe外部运行它,以查看差异以及其工作原理。

  1. 由于链接如何与JS配合使用(替换整个url),因此它们实际上必须像这样, …

html javascript iframe browser-history content-security-policy

10
推荐指数
1
解决办法
251
查看次数