我从文档和几个相关的StackOverflow帖子中了解到,window.parent,如果没有其他父级,将自我引用,因此永远不会被定义。
我似乎无法找到一个合理的理由,因为为什么会这样。 JavaScript确实有它的特性,但这个看起来很奇怪。
MSDN只是陈述
如果当前窗口没有父窗口,即它占用整个浏览器窗口,则Parent返回当前窗口的Window对象。
MDN州
如果窗口没有父窗口,则其父属性是对自身的引用。
如果没有父文档,则Window对象的父属性的值必须是父文档的Window对象或文档的Window对象
我没有看到其他语言就像这样,这种自我引用设计的原因是什么?当你点击窗口中最顶层的元素时,“null”或“undefined”是否会导致更明显的情况?
那么,为什么?
答案 0 :(得分:0)
使用iframe时,开发人员通常会自动执行导航窗口的流程。虽然算法的核心将包含相同的基本逻辑,但概念方法将有所不同。
有时,开发人员不会以父子方式工作,而是以这样的方式制作系统,使其看起来不会寻找父级,而只是寻找合适的窗口。控制(不一定保持)代码当前运行区域的那个。
在这种方法的情况下,当要求对“右”窗口进行引用时,程序返回“假”或“未定义”在概念上会很奇怪,因为必须有一个。
例如,Bob编程:
Bob:我嵌入了一个iframe!好吧,让我来讨论包含我整个iframe的window
(而不是iframe本身的window
)
我只是说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”。实际上,您可以在自己的代码中分配这些变量,以明确说明您在谈论哪个变量。