以编程方式确定 window 是独立的还是孤立的

Programmatically determine whether a window is standalone or orphaned

我需要弄清楚 window 是作为独立打开的还是孤立的。让我说明一下我的意思。

假设我有两个 ASP 页面,我将它们称为 PARENT.asp 和 CHILD.asp。此外,还有一个重定向页面,我将其称为 CHILD-REDIRECT.asp.

当点击 CHILD.asp 上的某个按钮时,它会重定向到 CHILD-REDIRECT.asp,其中包括需要 运行 某个按钮的客户端 Javascript 代码方式,取决于它是否有父级(基于 window.opener == null)。为了便于说明,我会说 Javascript 代码是一个布尔变量,我将其称为 IsOrphan.

因此,我打开一个新浏览器 window 并导航到 CHILD.asp。然后我单击重定向到 CHILD-REDIRECT.asp 的按钮并启动 Javascript。因为我把它作为一个独立的页面打开,IsOrphan = FALSE.

现在,我打开一个新的浏览器并导航到 PARENT.asp。此页面包含一个 window.open 调用,可在新的 window 中打开 CHILD.asp。当 CHILD.asp 打开时,我关闭 PARENT.asp,这样 CHILD.asp 现在处于孤立的 window 中。所以现在当我单击按钮并且页面重定向到 CHILD-REDIRECT.asp 时,我需要 IsOrphan = TRUE.

关于如何做到这一点有什么想法吗?我正在研究通过 CHILD.asp onload 事件上的 window.opener 为父级设置一个变量;然而,由于这些页面的复杂性,这并不像听起来那么容易。现在,Javascript 检查 window.opener 以启动代码,但当然,它不知道独立页面和孤立页面之间的区别。我希望有人知道 good/better 的方法来做到这一点。

我成功了。

在我的 CHILD.asp 页面中,我在页面顶部设置了以下内容:

<script>
   var isChild;
   if (window.opener == null) { isChild = false } else { isChild = true }
</script>

这会在页面加载时实例化 isChild 客户端变量。

我的服务器端经典 ASP 代码包含如下内容:

response.write("javascript: if (1=1) { window.location.href='CHILD-REDIRECT.asp?ID=" & someID & "';")

我不得不承认我的一个难题是如何将其发送到服务器端代码。然而,我随后意识到这将是一个有争议的问题,因为客户端值在呈现时应该存在。

所以,我这样重写了它:

response.write("javascript: if (1=1) { window.location.href='CHILD-REDIRECT.asp?ID=" & someID & "&isChild=' + isChild;")

在CHILD-REDIRECT.asp中,我添加了:

var boolChild = <%request.QueryString("isChild")%>

所以现在,我有一个标志,指示该页面是否由父级生成。在代码的后面,我有这个:

if (window.opener == null && boolChild) { 
   // do something 
}

果然,它正在做我需要它做的事情。