3

在 JavaScript 中,<iframe>我需要在父窗口中调用一个函数。两个窗口都来自同一个域。

使用安全window.parent.myFunction();吗?

4

1 回答 1

2

简短的回答

是的,您可以window.parent在同一个域中使用。

WhatWG规范第 6 章:加载网页说:

  • iframe.parent存在
  • iframe.parentiframe的父级 DOM 的代理
  • 如果来源相同,则允许访问

真的很长很长的答案

我试图通过阅读规范向您展示如何得出这个结论,同时牢记:从内部访问的特征是什么?parentiframe

开始吧。这是一篇长文。

1.DOM属性parent

WhatWG#dom-parentwindow.parent

浏览上下文bWindow中 a 的对象的 parent IDL 属性必须返回父浏览上下文的对象,如果有的话(即如果b是子浏览上下文),或者浏览上下文b的对象本身,否则(即,如果它是顶级浏览上下文或分离的嵌套浏览上下文)。DocumentWindowProxyWindowProxy

parent是访问类似于父窗口的 DOM 的属性。然而:

  • 什么是浏览上下文
  • 做什么WindowProxy

让我们继续阅读。

2. 浏览上下文

浏览上下文是Document向用户呈现对象的环境。

WhatWG#Browsing 上下文说:

Web 浏览器中的选项卡或窗口通常包含浏览上下文,就像框架集中的 iframe 或框架一样。每个浏览上下文都有一个对应的 WindowProxy 对象。

3.窗口代理

窗口代理是代理window对象并实施例如安全约束的对象。对于一个window对象,可以有多个代理(例如iframes,来自两个不同域的两个代理访问同一个父级)。

WhatWG#proxy-object说:

WindowProxy 对象允许脚本就像每个浏览上下文都有一个 Window 对象一样,同时仍然为每个 Document 保留单独的 Window 对象。

4. 安全

我们就快到了。继续阅读。

WhatWG#security-nav说:

如果以下条件之一为真,则允许浏览上下文 A 导航第二个浏览上下文 B:
  • A 的活动文档的来源与 B 的活动文档的来源相同,或者
  • 浏览上下文 A 是一个嵌套的具有顶级浏览上下文的浏览上下文,它的顶级浏览上下文是 B,或者
  • 浏览上下文 B 是辅助浏览上下文,并且允许 A 导航 B 的开启者浏览上下文,或
  • 浏览上下文 B 不是顶级浏览上下文,但存在 B 的祖先浏览上下文,其活动文档与 A 的活动文档具有相同的来源(实际上可能是 A 本身)。

5. 扣减

如果两者都来自同一个域,可以从它的iframe访问函数吗?parent让我们推断。

  1. parent不是window父对象,而是一个WindowProxy.
  2. 浏览上下文可以iframe访问其父级,因为它们都具有相同的来源(参见上面的第一个安全条件)。

您会看到:如果您仔细阅读规范,您可以找到浏览器应该如何运行的答案。阅读规范是一项后天的技能。它需要耐心和准确。

然而:世界没有那么美好。有些浏览器没有按照它们应该的那样实现规范。买者自负

于 2012-10-18T18:18:49.440 回答