【问题标题】:Select and focus an already existing window选择并聚焦已存在的窗口
【发布时间】:2011-11-02 16:55:40
【问题描述】:

我经营一个电子商务网站,当客户提交订单时,我需要让这个弹出窗口正常工作。理想情况下,当订单成功页面加载时会出现弹出窗口,但弹出窗口阻止程序会阻止此。

相反,当用户单击“确认订单”按钮时,我会生成弹出窗口,但这会掩盖在订单完成之前结帐重定向到的 3DSecure 页面。

为了解决这个问题,我在用户单击“确认订单”时创建了弹出窗口,但会立即重新调整主窗口的焦点;如果你愿意的话,一个弹出窗口。我的计划是从订单成功页面重新关注这个新窗口。

问题是我找不到获取现有弹出窗口的对象的方法,因此我可以将焦点放在它上面。如果我使用window.open(url,windowName,options) 创建窗口,有没有办法可以从另一个页面引用它?类似于window.load(windowName) 的东西会很理想。

【问题讨论】:

    标签: javascript popup window


    【解决方案1】:

    这很棘手,但它适用于 Chrome。首先,打开窗口:

    window.open('/test', 'testw', '');
    

    另一个链接(甚至在另一个页面上)通过传递相同的窗口名称在同一个窗口中打开一个“页面”。 URL 是 JavaScript(所以它是一个 hack):

    window.open('javascript:void window.focus()', 'testw', '');
    

    http://jsfiddle.net/pimvdb/KeHtp/

    【讨论】:

    • 我正要写同样的东西 :) 请注意,这只有在所有三个页面(打开弹出窗口的页面、弹出页面和订单确认页面)都属于的情况下才有效到同一个域。
    • @Wladimir Palant:很高兴知道,我已经在考虑类似的事情了。确实不能跨域。
    • 我刚刚注意到,如果您关闭主选项卡并再次打开它,它就不起作用。可能是因为在那之后它们是不同的过程。
    • 这几乎是完美的,但它似乎对我不起作用。这可能是因为在此过程中间结帐重定向到的 3DSecure 检查位于不同的域中吗?
    • 这个解决方案的问题是它只适用于Chrome,其他浏览器可能不仅会忽略它,而且在某些特定情况下还会抛出错误。例如,当域不匹配时,IE11 会抛出“访问被拒绝”。
    【解决方案2】:

    window.open的签名是这样的。

    var windowObjectReference = window.open(strUrl, strWindowName[, strWindowFeatures]);
    

    MDN 指出,

    如果名称为 strWindowName 的窗口已经存在,则 strUrl 是 加载到现有窗口中。在这种情况下,返回值 方法是现有的窗口和 strWindowFeatures 被忽略。 为 strUrl 提供一个空字符串是一种获取对 在不更改窗口位置的情况下按名称打开窗口。

    所以这应该适合你。

    window.open('', 'windowName', '');
    

    根据 MDN,每当打开窗口时,都会创建对其的引用,

    var windowObjectReference = window.open("http://www.google.com", "popup", "width=500,height=500");
    

    您总是可以使用该引用来加载它,例如

    if(windowObjectReference != null || !windowObjectReference.closed) {
        windowObjectReference .focus();
    }
    

    【讨论】:

    • 他要求一种方法来引用来自不同页面的弹出窗口,而不是打开它的那个页面。
    • 您能否也将此引用传递给另一个页面?我很想知道引用是否可以序列化以及如何序列化。
    • 我正在经历这个。 stackoverflow.com/questions/87359/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2012-08-27
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多