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

时间:2016-04-22 10:51:22

标签: javascript html iframe

你有HTML这样:

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

它可以很好地重新加载帧(在生产代码的情况下发送一些发布数据)。但是,如果在 frame.html 中有一个代码定义全局变量&#34; name&#34; ,则代码会中断并打开 frame.html 新标签中。

var name = "a";

Chrome Firefox 中的工作方式相同。

以下是github.io上的示例: https://jsfiddle.net/hyk18g88/2/
来源:http://evigl.github.io/form-target-iframe-test/
(第一帧是正常工作帧,第二帧是打开新窗口,为了清晰起见,有几个console.log&#39;

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

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

1 个答案:

答案 0 :(得分:2)

  

很奇怪,是吗?

是。它是早期DOM设计的结果,它一直保持向后兼容性(因为浏览器不会丢弃网站可能仍然使用的任何可怕的东西)。

  

它是否违反了同源政策?

没有。 JS并不是任何来源的东西。

  

有没有办法覆盖这种行为?

不是真的。您可以使用public class Solution { // DO NOT MODIFY THE LIST public ArrayList<Integer> spiralOrder(final List<ArrayList<Integer>> a) { ArrayList<Integer> result = new ArrayList<Integer>(); // Populate result; /* * m=no. of rows, n=no. of cols, t=top row of untraversed list, b=bottom * row of untraversed list, l=left most col of untraversed list and * r=right most col of untraversed list */ int m = a.size(); int n = a.get(0).size(); int dir = 0; int t = 0; int b = m - 1; int l = 0; int r = n - 1; while (l <= r && t <= b) { if (dir == 0) { for (int i = l; i <= r; i++) { result.add(a.get(t).get(i)); dir = 1; t++; } } else if (dir == 1) { for (int i = t; i <= b; i++) { result.add(a.get(i).get(r)); dir = 2; r--; } } else if (dir == 2) { for (int i = r; i >= l; i--) { result.add(a.get(b).get(i)); dir = 3; b--; } } else if (dir == 3) { for (int i = b; i >= b; i++) { result.add(a.get(i).get(l)); dir = 0; l++; } } } return result; } } 使用JS为框架指定新的getElementById来破解它(我不知道链接到框架内的新页面是否会破坏该框架),或者完全摧毁框架并用新框架替换它(也用JS)。

相关问题