当使用网页子帧时,创建者(父母)通常为每个子帧提供“名称”,然后可以使用类似mainWindow.dataFrame的语法来引用这些帧。我遇到了一个浏览器特定的问题,我已经跟踪到从外部站点加载的子帧将其窗口重命名为与使用的父窗口不同的事实。这会导致Google Chrome出现问题,但Firefox无法解决问题。
Firefox似乎将父级的名称与子级名称分开。这使得父javascript可以按预期继续工作,而子javascript可以根据需要使用自己的名称。
Chrome似乎有不同的想法,并且只有一个名称用于子帧。子进程重命名后,父进程无法再按名称访问它。即使将不同的内容加载到子帧中,“腐败”仍然存在。
我还没有调查其他浏览器的用途。
我知道此描述中涉及跨域安全问题。一旦异地儿童加载,我们就无法访问子帧的内容。但让孩子从父母那边重命名窗口似乎也是一个潜在的安全问题。
要解决这个问题,我必须停止使用mainWindow.dataFrame语法,现在在将新数据加载到子帧时使用带有固定索引的frames []数组 - 丑陋但可行。我想我正在寻找确认没有更好的解决方法。知道谁是“正确”,Firefox或谷歌会很高兴。我正在投票支持Firefox。
答案 0 :(得分:0)
请忘记我对问题的初步分析。当我试图简化我正在修复的复杂代码时,我意识到了更多正在发生的事情。问题似乎是Firefox中的意外行为。父框架和子框架只有一个名称。当任一上下文要求.name属性时,您会得到相同的响应 帧。
奇怪的是与javascript维护的自动创建的变量/属性有关。如果< frame>使用name =“subName”属性创建,然后self.subName为您提供对该帧的引用。如果父级或子级更改框架的名称(与self.subName.name = newName一样),则会自动生成一个新的自动变量/属性self.newName并引用原始框架。在Chrome下,旧的变量/属性消失。在Firefox下,旧名称不会消失(!!!)并且顶级窗口的两个属性继续存在,并且两者都指向相同的子帧。这一切都解释了为什么我的原始代码适用于Firefox但在Chrome上失败。