在 iframe 中指定全局变量名称时,表单目标会中断

Form target breaks when global variable name is specified inside iframe

本文关键字:表单 目标 中断 变量名 iframe 全局      更新时间:2023-09-26

你有这样的HTML

<form action="frame.html" target="frame1"><input type="submit"></form>
<iframe name="frame1" id="frame1" src="frame.html"></iframe>

它可以很好地重新加载帧(在生产代码的情况下发送一些后期数据)。但是,如果在框架中.html有一个定义全局变量"name"的代码,则代码会中断并在新选项卡中打开框架.html而是。

var name = "a";

ChromeFirefox中的工作方式相同。

下面是 github.io 上的示例:
http://evigl.github.io/form-target-iframe-test/资料来源:https://github.com/EviGL/form-target-iframe-test/tree/gh-pages
(第一帧是正常工作帧,第二帧打开新窗口,几个控制台.log为清楚起见)。

很奇怪吧?即使 frame.html 在另一个域上,它的工作方式也相同。它不违反同源政策吗?

有没有办法覆盖此行为?我在框架中有一些不受控制的代码(用户生成的代码预览),更改它不是一种选择。它也在另一个域上。

很奇怪吧?

是的。这是非常早期的DOM设计的结果,为了向后兼容而保留了它(因为浏览器不会抛出网站实际上可能仍在使用的任何可怕的东西)。

它不违反同源政策吗?

不。JS没有跨源读取任何内容。

有没有办法覆盖此行为?

没有。您可以通过使用 getElementById 使用 JS 为框架分配一个新src来绕过它(我不知道链接到框架中的新页面是否会破坏它),或者通过完全销毁框架并用新框架替换它(也使用 JS)。