2009-02-18 84 views
4

我正在进行一个站点间单点登录项目,并且在我的腿上掉了一个很小的问题。当用户退出“父”站点时,需要在包含“子”站点的弹出窗口中加载特定页面。但是,我无法存储对window.open(…)的返回值的引用,因为在注销之前必须允许用户在每个站点上随意导航。是否有可能确定一个命名窗口是否在JavaScript中打开?

如果我可以假设子站点始终打开,那么这很容易,因为到同一命名窗口的另一个window.open(…)将更改其URL。但是,弹出式窗口如果尚未打开(不是所有用户都有权访问子站点),则不会导致出现

我认为这给了我两个冲突的情况。当用户访问子站点时:

  1. 用户登录到父站点。
  2. 用户点击子网站的链接
  3. 子网站出现在名为“child_popup”的窗口中。
  4. 用户在父网站中浏览的范围很广,忘记了子窗口存在。
  5. 用户注销父站点。
  6. 子弹出被重定向到子站点的注销页面。

,并在用户没有或不能访问子站点:

  1. 用户登录到父站点。
  2. 用户在父网站中浏览的范围很广。
  3. 用户注销父站点。
  4. 不应该弹出窗口!

所以我的限制是:

  • 我不能储存在JS窗口的引用,因为用户可以导航到任何数量的访问子站点和退出之间的页面。
  • 我有控制子站点的内容(我的雇主运行父站点)。
  • 父站点无法转换为框架以提供“全局”JS范围。 :-)

我无法在Google或SO上找到任何相关资源。有没有办法做到这一点?

回答

1

我们无法找到一种方法来检测子站窗口是否仍然开放,但我们想出了这满足了我们的业务需求乡亲解决方法:

  1. 设置cookie的A在启动子弹出时从父站点发出。
  2. 从每个页面加载的子站点设置Cookie B.
  3. 从每个页面上的子站点清除cookie B un加载。
  4. 当注销父站点:
    1. 如果有cookie设置,明确并关闭本地连接到子站点。
    2. 如果设置了cookie B,清除它并在弹出窗口中打开子注销页面。
0

使用会话来存储弹出窗口的状态。

当用户点击一个链接打开子站点时,你需要做一个异步的JavaScript调用到父服务器,记录这个用户已经打开一个窗口到子站点。或者让链接打开存储以下会话信息的页面并返回Location:标头。

(注意我正在使用php,$ _SESSION [...]是数据存储的请求之间的用户特定阵列)

$_SESSION['inChildSite'] = true; 

当用户退出父站点的,该值被再次检查,或者通过一个asycnronous javascript调用,或者通过注销脚本。

if ($_SESSION['inChildSite'] ==true) 
    echo "<script>window.open(...)</script>" 

然后显示注销子窗口。确保在注销发生时取消设置会话变量。

瞧,利润。

+0

不幸的是,我没有访问服务器端会话数据(读*或*写)。从本质上讲,我被要求在纯JS中做到这一点。我现在正在推动,看看我能否得到一组更合理的要求。 – 2009-02-18 23:44:36

3

是的,你可以,受到一个重要的限制。

这取决于以下行为:

  1. 第2个参数的window.open是一个URL和一个窗口名称
  2. 如果一个窗口window.open返回到窗口
  3. 参考已经以指定名称打开,则返回对该窗口的引用,而不是对新窗口的引用
  4. 如果URL为NULL,则现有窗口将不会导航到新页面

这意味着您可以获取对现有窗口的引用,而不会丢失窗口打开的页面。但是,如果一个窗口不存在与该名称存在,它将打开

我们用这种方法在http://carbonlogic.co.uk/但由于Flash Player的问题的弹出窗口的内容不正确的时刻

+0

这真的很巧妙,但恐怕它实际上与我们所需要的相反。如果窗口打开,我*希望页面改变;我*不*想要一个新的窗口弹出,如果不是。 : - / – 2009-02-19 00:33:11

0

工作听起来好像你是在子窗口中的内容控制..如果是这样,你可以尝试设置“window.opener.some_attr = true”,当你第一次加载子窗口。因此,你的代码在父窗口可以做“if(window.some_attr)window.open(...)”或相反的“if(!window.some_attr)alert('no access')... “

相关问题