使用网页子框架时,创建者(父框架)通常为每个子框架指定一个“名称”,然后可以使用 mainWindow.dataFrame 等语法引用框架。我遇到了一个特定于浏览器的问题,我已追踪到从外部站点加载的子框架将其窗口重命名为与所使用的父级不同的名称。这会导致 Google Chrome 出现问题,但 Firefox 不会出现问题。
Firefox 似乎将同一子框架的父级名称和子级名称分开。这让父 javascript 继续按预期工作,而子 javascript 可以根据需要使用自己的名称。
Chrome 似乎有不同的想法,并且子框架只有一个名称。一旦子级重命名了框架,父级就无法再通过名称访问它。即使将不同的内容加载到子帧中,“损坏”仍然存在。
我还没有研究过其他浏览器的功能。
我知道此描述涉及跨域安全问题。一旦场外子框架加载进来,我们就无法访问子框架的内容。但是让 child 从 parent 这边重命名窗口似乎也是一个潜在的安全问题。
为了解决这个问题,我不得不停止使用 mainWindow.dataFrame 语法,现在在将新数据加载到子帧中时使用具有固定索引的frames[]数组 - 丑陋但可行。我想我正在寻找确认没有更好的方法来解决这个问题。很高兴知道 Firefox 和 Google 谁是“正确的”。我投票给 Firefox。
最佳答案
请忘记我对问题的最初分析。当我尝试简化正在修复的复杂代码时,我更多地意识到发生了什么。该问题似乎是 Firefox 中的意外行为。该框架对于父级和子级只有一个名称。当任一上下文询问 .name 属性时,您会得到相同的响应 框架。
奇怪之处与 javascript 维护的自动创建的变量/属性有关。如果 是使用 name="subName"属性创建的,则 self.subName 将为您提供对该框架的引用。如果父级或子级更改了框架的名称(如 self.subName.name=newName),则新的自动变量/属性 self.newName 会弹出并引用原始框架。在 Chrome 下,旧的变量/属性消失了。在 Firefox 下,旧名称不会消失(!!!),顶级窗口的两个属性仍然存在,并且都引用相同的子框架。这一切都解释了为什么我的原始代码在 Firefox 上有效,但在 Chrome 上失败。
关于javascript - 谁拥有 javascript 中子框架的名称,父框架还是子框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733211/