默认的 `window.top` 作为参考是否会无效?

问题描述 投票:0回答:2

我想将用户重定向到外部页面,同时跳出框架集。

最外层的框架集很可能与执行重定向的页面位于同一域内,但也有可能跨越域。在开发过程中,最外层的框架集甚至可能根本不存在。理想情况下,我想涵盖所有这些情况。

最里面的页面(具有突破代码的页面)将通过 HTTPS 提供服务。目标 URL 可以是 HTTP 或 HTTPS。重定向失败是可以接受的(有一个后备链接“单击此处继续”来涵盖该场景),但重定向应该在大多数情况下都有效。特别是出于这个问题的目的,我讨厌它比必要的更多地依赖于浏览器。

Web 应用程序本身是 ASP.NET。

由于框架集的原因,我不能简单地使用 HTTP 重定向。

到目前为止我有这个Javascript代码,它从类子类中注册为启动脚本

Page
,其中
...
代表重定向目标URL:

((window.top == null) ? (window) : (window.top)).location = '...';

令我困扰的是 MDN 分别对 window.topwindow.parent 的说法。 特别是, window.parent 的文档明确说明了

如果窗口没有父窗口,则其

parent
属性是对其自身的引用。

这意味着我可以断言

window.parent != null
。但
window.top
的值没有任何相似之处。

就我的问题而言,您可以假设这些都没有被重新分配。

所有这些都引出了实际问题:

window.top
是否做出与
window.parent
类似的保证?
(我有点担心条件表达式。在我迄今为止有限的测试中,它有效,但是并不能证明它正确。

据我所知,至少 MDN 并没有明确说明。

javascript redirect window language-lawyer
2个回答
3
投票

HTML5 规范定义了

window.top
,如下所示:

浏览上下文 b 中 Document 的 Window 对象的 top IDL 属性必须返回其顶级浏览上下文的 WindowProxy 对象(如果它本身就是顶级浏览上下文,则这将是它自己的 WindowProxy 对象),如果它有一个或它自己的 WindowProxy 对象(例如,如果它是一个分离的嵌套浏览上下文)。

因此

top
属性必须始终引用窗口。该规范还将
top
定义为
readonly
,因此不可能将其更改为指向其他内容(如果规范实施正确)。

如果

window.top == null
,事情就非常糟糕了!


0
投票

自 2014 年以来的某个时刻,HTML 规范对 window.top 的定义进行了细化,明确指出当

window.top
(或
null
)的 浏览上下文时,
Window
can
WindowProxy
无效

i.e.

:当您的脚本具有对 null 对象的有效(非

undefined
、非
Window
)引用,但现实生活中的浏览器窗口不再存在时,则
.top
(并且
.parent
等)将返回
null
例如:

<!DOCTYPE html> <iframe></iframe> <script> "use strict"; const element = document.querySelector("iframe"); const iframeWindow = element.contentWindow; element.remove(); console.assert(iframeWindow.top === null); console.assert(iframeWindow.parent === null); console.assert(iframeWindow.frameElement === null); </script>

它可以在 StackOverflow 代码片段中重现:

(我需要注释掉

.frameElement

访问,因为这违反了 StackOverflow 的 CSP)。

<!DOCTYPE html> <iframe></iframe> <script> "use strict"; const element = document.querySelector("iframe"); const iframeWindow = element.contentWindow; element.remove(); console.assert(iframeWindow.top === null); console.assert(iframeWindow.parent === null); //console.assert(iframeWindow.frameElement === null); </script>

© www.soinside.com 2019 - 2024. All rights reserved.