2

我从文档和几个相关的 StackOverflow 帖子中了解到,如果没有其他父级,window.parent 将自我引用,因此永远不会被定义。

我似乎找不到一个正当的理由来解释为什么会这样。JavaScript 确实有它的特性,但这个特性看起来很奇怪。

MSDN简单地指出

如果当前窗口没有父窗口,即占据了整个浏览器窗口,则 Parent 返回当前窗口的 Window 对象。

MDN状态

如果窗口没有父窗口,则其父属性是对自身的引用。

以及W3 标准本身

Window 对象的 parent 属性的值必须是父文档的 Window 对象,如果没有父文档,则该文档的 Window 对象

我还没有看到其他语言有这样的行为,这种自引用设计的原因是什么?当您点击窗口中最顶部的元素时,'null' 或 'undefined' 会不会造成更明显的情况?

所以为什么?

4

3 回答 3

0

在使用 iframe 时,开发人员通常会自动化通过窗口导航的流程。虽然它们的核心算法将包含相同的基本逻辑,但概念方法会有所不同。

有时开发人员不会以父子方式工作,而是以这样一种方式设计系统,它似乎不是在寻找父级,而只是为了使用正确的窗口。控制(不一定持有)代码当前运行的区域的那个。

在这种方法的情况下,程序在询问“正确”窗口的引用时返回“false”或“undefined”在概念上会很奇怪,因为必须有一个。

例如,Bob 正在编程:

Bob:我嵌入了一个 iframe!好吧,让我玩一下window包含我的整个 iframe 的那个(而不是windowiframe 本身的那个)

鲍勃:什么?无效的?但我不明白,我的 iframe 已启动并正在运行,怎么可能没有任何控制它的窗口?

我只是说这window.parent 可能并不意味着从字面上和严格地从 DOM 中获取父级(就像这样.parentElement做),但更喜欢指向一个窗口,该窗口不仅完全包含您的脚本,而且还包含在较低位置的所有其他内容水平。

在最上面的窗口(正在执行脚本的地方)的情况下,该语句可能会返回相同的窗口,因为没有任何其他窗口比它更重要,它只是在寻找上级时使用的“正确的”容器。

我希望我有点道理。

于 2014-08-07T21:08:52.957 回答
0

我会说这有助于窗口通信。加载第三方内容时,它可能会利用 window.parent.postMessage 作为与其实现上下文通信的形式,但它可能在没有父窗口的情况下实现。在 iframe 中加载内容的 html 页面将有自己的窗口作为 iframe 窗口的父窗口,但是加载到诸如电子 webview 之类的浏览器插件之类的内容将没有父窗口,因此 postmessage 将失败并且实现上下文不会能够监听该事件。所以基本上它只是允许一个安全网允许开发人员总是能够使用 window.parent 因为他们可能不知道他们的代码是否会从 window.top 运行。

于 2018-07-26T17:59:33.350 回答
0

我认为这只是不幸的命名。该属性可以更好地命名为“parentOrCurrentWindow”。

如果您想要的是“父窗口或当前窗口”,那么能够以“父窗口”的身份访问它会使您的代码更短一些。如果你知道是这样,那么这并不重要。你可以说获取一些窗口比获取空值更好。

但请注意,这与 JavaScript 语言无关。这是关于浏览器实现的 DOM 模型。可以改进 DOM 模型以包含两个属性“parentOrCurrent”和“parentOrNull”。事实上,您可以在自己的代码中分配这些变量,以明确您在说哪一个。

于 2018-10-15T21:57:16.813 回答