Dom 为什么window.parent会自动引用?

Dom 为什么window.parent会自动引用?,dom,design-decisions,window-object,window.parent,Dom,Design Decisions,Window Object,Window.parent,我从文档和几个相关的StackOverflow帖子中了解到,如果没有其他父项,window.parent将自引用,因此永远不会被未定义 我似乎找不到一个像样的理由来解释这是为什么。JavaScript确实有它的特点,但这一点似乎很奇怪 只是说 如果当前窗口没有父窗口,即它占据整个浏览器窗口,则父窗口返回当前窗口的窗口对象 州 如果窗口没有父窗口,则其父属性是对其自身的引用 还有它本身 窗口对象的父属性值必须是父文档的窗口对象,如果没有父文档,则必须是文档的窗口对象 我还没见过其他语言有这样的表现

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

我似乎找不到一个像样的理由来解释这是为什么。JavaScript确实有它的特点,但这一点似乎很奇怪

只是说

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

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

还有它本身

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

我还没见过其他语言有这样的表现,这种自引用设计的原因是什么?当您点击窗口中最上面的元素时,“null”或“undefined”是否会导致更明显的情况


那么,为什么呢?

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

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

在这种方法中,当程序请求对“右”窗口的引用时,返回“false”或“undefined”在概念上是很奇怪的,因为必须有一个窗口

例如,Bob正在编程:

鲍勃:我嵌入了一个iframe!好的,让我来看看包含整个iframe的
窗口(而不是iframe本身的
窗口)

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

我只是说,
window.parent
可能并不意味着严格地从DOM中获取父对象(就像
.parentElement
那样),而是更像是指向一个窗口,它不仅绝对地包装了脚本,而且还包装了在较低级别包装它的所有其他内容

对于最顶层的窗口(您的脚本正在执行的地方),该语句可能返回相同的窗口,因为没有比它更重要的窗口,它只是成为查找高级容器时使用的“正确窗口”


我希望我有点道理。

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

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

如果您想要的是“父窗口或当前窗口”,那么能够以“父窗口”的形式访问它会使您的代码变得更短。如果你知道是这样,那就没什么大不了的了。您可以说,获得某个窗口比空窗口更好


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

Uhm。。。让我想想。。。因为JavaScript开发人员决定这样做。你的问题就像问“为什么facebook的徽标是蓝色的?”。我想这只是一个惯例,我们作为开发者必须意识到这一点。如果您将其改为“null”,那么可能有人会问为什么它没有被设置为“undefined”。我想这只能归结为选择一个选项:-)@MarcoBonelli是的,但是为什么呢?有了C#你可以了解历史上几乎每一个设计决策,我几乎找不到像这样的问题。我想一个问题是为什么不?您可以很容易地执行
if(window.parent===window)
来检查它是否是同一个实例,但是您已经将自己的
if(window.parent){//do Something}
保存在其余代码中。如果我使用几乎任何其他语言在循环中遍历父元素,顶级元素要么没有父属性,或者父属性将设置为null。JavaScript没有遵循这种方法,相反,他们认为循环顶部引用是一个更好的主意。我知道存在解决方法,但我想知道为什么实现是循环的,而不是有一个确定的结束。在iframe中,Bob将调用window.parent并获取包含的元素。从那里,Bob将调用window.parent并获取包含的元素。从那里,Bob将调用window.parent并获取包含的元素。我想我看不出仅仅说全局对象的父对象是未定义的有什么用处。也许我只是停留在C++/C#的思维中,其中“null/undefined”是一个非常有效的答案,不仅适用于尚未初始化的数据。要获取href,只需使用window.parent.location.href,无论页面是否在iframe中都有效。比(window.parent | | window.location.hrefThis)更简单