为什么window.parent自引用?

时间:2014-08-07 18:43:24

标签: dom design-decisions window-object window.parent

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

我似乎无法找到一个合理的理由,因为为什么会这样。 JavaScript确实有它的特性,但这个看起来很奇怪。

MSDN只是陈述

  

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

MDN

  

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

W3 standard本身

  

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

我没有看到其他语言就像这样,这种自我引用设计的原因是什么?当你点击窗口中最顶层的元素时,“null”或“undefined”是否会导致更明显的情况?

那么,为什么?

3 个答案:

答案 0 :(得分:0)

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

有时,开发人员不会以父子方式工作,而是以这样的方式制作系统,使其看起来不会寻找父级,而只是寻找合适的窗口。控制(不一定保持)代码当前运行区域的那个。

在这种方法的情况下,当要求对“右”窗口进行引用时,程序返回“假”或“未定义”在概念上会很奇怪,因为必须有一个。

例如,Bob编程:

Bob:我嵌入了一个iframe!好吧,让我来讨论包含我整个iframe的window(而不是iframe本身的window

鲍勃:什么?空值?但是我没有得到它,我的iframe已经开始了。运行,怎么没有任何窗口控制它?

我只是说window.parent 可能不是字面意义并严格从DOM获取父级(如.parentElement所做的那样),但更喜欢指向到窗口,它不仅包含你的脚本,还包括在较低级别包装它的所有其他内容。

在最顶层窗口(正在执行脚本的位置)的情况下,该语句可能会返回相同的窗口,因为没有任何窗口比它更重要,它只是在查找时变得“正确”对于高级容器。

我希望我能说清楚。

答案 1 :(得分:0)

我会说这有助于进行窗口通信。加载第三方内容时,它可能会利用window.parent.postMessage与其实现上下文进行通信的形式,但可能没有父窗口即可实现。在iframe中加载内容的html页面将具有其自己的窗口(作为iframe窗口的父窗口),但是加载到类似浏览器插件(例如electronic webview)之类的内容将没有父窗口,因此后消息将失败并且实现上下文不会能够收听该事件。因此,基本上,它只是提供了一个安全网,使开发人员始终能够使用window.parent,因为他们可能不知道他们的代码是否将从window.top运行。

答案 2 :(得分:0)

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

如果您想要的是“父窗口或当前窗口”,则能够像“父窗口”一样访问它,从而使您的代码短一些。而且,如果您知道是这样,那就没关系了。您可能会说,拥有SOME窗口比保留null更好。

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