1

使用网页子框架时,创建者(父级)通常给每个子框架一个“名称”,然后可以使用类似 mainWindow.dataFrame 的语法来引用这些框架。我遇到了一个特定于浏览器的问题,我已经追踪到这样一个事实,即从外部站点加载的子框架将其窗口重命名为与使用的父级不同的窗口。这会导致 Google Chrome 出现问题,但不会导致 Firefox 出现问题。

Firefox 似乎将同一子框架的父名和子名分开。这使父 javascript 可以继续按预期工作,而子 javascript 可以根据需要使用自己的名称。

Chrome 似乎有不同的想法,并且子框架只有一个名称。一旦子级重命名框架,父级就不能再按名称访问它。即使将不同的内容加载到子帧中,“损坏”仍然存在。

我还没有调查其他浏览器的作用。

我知道此描述涉及跨域安全问题。一旦异地子加载进来,我们就无法访问子框架的内容。但是让孩子从父母一方重命名窗口似乎也是一个潜在的安全问题。

为了解决这个问题,我不得不停止使用 mainWindow.dataFrame 语法,现在在将新数据加载到子帧时使用带有固定索引的 frames[] 数组 - 丑陋但可行。我想我正在寻找确认没有更好的解决方法。很高兴知道谁是“正确的”,Firefox 或 Google。我投票给火狐。

4

1 回答 1

0

请忘记我对问题的初步分析。当我试图简化我正在修复的复杂代码时,我意识到更多正在发生的事情。问题似乎是 Firefox 中的意外行为。该框架只有一个名称用于父级和子级。当任一上下文要求框架的 .name 属性时,您会得到相同的响应。

奇怪之处与 javascript 维护的自动创建的变量/属性有关。如果 <frame> 是使用 name="subName" 属性创建的,那么 self.subName 会为您提供对该框架的引用。如果父级或子级更改框架的名称,如 self.subName.name=newName,则新的自动变量/属性 self.newName 会弹出并引用原始框架。在 Chrome 下,旧的变量/属性会消失。在 Firefox 下,旧名称不会消失(!!!),顶级窗口的两个属性继续存在,并且都引用同一个子框架。这一切都解释了为什么我的原始代码适用于 Firefox,但在 Chrome 上却失败了。

于 2012-12-06T19:56:37.590 回答