选择并聚焦于一个已存在的窗口

4
我经营着一个电子商务网站,当客户提交订单时,我需要让这个弹出窗口工作。理想情况下,当订单成功页面加载时,弹出窗口会出现,但是弹出窗口拦截器会阻止它的出现。
相反,当用户点击“确认订单”按钮时,我生成弹出窗口,但这会遮挡结账之前重定向到3DSecure页面的页面。
为了解决这个问题,我在用户点击“确认订单”时生成弹出窗口,但立即将主窗口重新聚焦;类似于弹出窗口的下拉式窗口。我的计划是从订单成功页面重新聚焦这个新窗口。
问题是我找不到获取现有弹出窗口对象的方法,以便可以在其上运行聚焦。如果我使用 window.open(url,windowName,options) 创建窗口,是否有办法从另一个页面引用它呢? 最好能够使用window.load(windowName) 这样的东西。
2个回答

3
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();
}


1
他询问如何引用来自不同页面的弹出窗口,而不是打开它的那个页面。 - Wladimir Palant
你能把这个引用传递到另一个页面吗?我很好奇这个引用是否可以被序列化。 - pimvdb
我正在查看这个链接:https://dev59.com/HHVD5IYBdhLWcg3wGXpI - naveen

2

这有点棘手,但在Chrome上可以实现。首先打开窗口:

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

另一个链接(甚至在另一页上),通过传递相同的窗口名称,在同一窗口中打开“页面”。 URL 是 JavaScript(因此它更像是一种黑客技巧):

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

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


3
我马上就要写同样的话了 :) 请注意,这只有在所有三个页面(打开弹窗的页面、弹窗页面和订单确认页面)属于同一域名时才有效。 - Wladimir Palant
@Wladimir Palant:好知道,我已经在考虑这种情况了。它确实不能跨域工作。 - pimvdb
我刚刚注意到如果关闭主标签页再打开,它就无法正常工作了。这可能是因为那之后它们是不同的进程。 - pimvdb
这几乎是完美的,但它似乎对我不起作用。这可能是因为结帐过程中重定向到的3DSecure检查位于不同的域上吗? - Geoff
这种解决方案的问题在于它只适用于Chrome浏览器,而其他浏览器不仅可能会忽略它,而且在某些特定情况下还会抛出错误。例如,当域名不匹配时,IE11会抛出“访问被拒绝”的错误。 - Mariano Desanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接