我想将用户重定向到外部页面,同时跳出框架集。
最外层的框架集很可能与执行重定向的页面位于同一域内,但也有可能跨越域。在开发过程中,最外层的框架集甚至可能根本不存在。理想情况下,我想涵盖所有这些情况。
最里面的页面(具有突破代码的页面)将通过 HTTPS 提供服务。目标 URL 可以是 HTTP 或 HTTPS。重定向失败是可以接受的(有一个后备链接“单击此处继续”来涵盖该场景),但重定向应该在大多数情况下都有效。特别是出于这个问题的目的,我讨厌它比必要的更多地依赖于浏览器。
Web 应用程序本身是 ASP.NET。
由于框架集的原因,我不能简单地使用 HTTP 重定向。
到目前为止我有这个Javascript代码,它从类子类中注册为启动脚本
Page
,其中...
代表重定向目标URL:
((window.top == null) ? (window) : (window.top)).location = '...';
令我困扰的是 MDN 分别对 window.top 和 window.parent 的说法。 特别是, window.parent 的文档明确说明了
如果窗口没有父窗口,则其
属性是对其自身的引用。parent
这意味着我可以断言
window.parent != null
。但window.top
的值没有任何相似之处。
就我的问题而言,您可以假设这些都没有被重新分配。
所有这些都引出了实际问题:
window.top
是否做出与window.parent
类似的保证?(我有点担心条件表达式。在我迄今为止有限的测试中,它有效,但是并不能证明它正确。)
据我所知,至少 MDN 并没有明确说明。
window.top
,如下所示:
浏览上下文 b 中 Document 的 Window 对象的 top IDL 属性必须返回其顶级浏览上下文的 WindowProxy 对象(如果它本身就是顶级浏览上下文,则这将是它自己的 WindowProxy 对象),如果它有一个或它自己的 WindowProxy 对象(例如,如果它是一个分离的嵌套浏览上下文)。
因此
top
属性必须始终引用窗口。该规范还将 top
定义为 readonly
,因此不可能将其更改为指向其他内容(如果规范实施正确)。
如果
window.top == null
,事情就非常糟糕了!
自 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>