如何打开并关闭窗口,避免被阻止为弹出窗口?

8
我希望能够引导电商网站的客户通过Paypal的网站进行支付。我希望该付款在新标签页/窗口中完成,以便客户不会失去当前所在的网页状态。
为了让Paypal窗口在不被阻止的情况下打开,我使用了一个带有target="_blank"的锚点。这个方法工作得很完美,但问题是,当Paypal支付完成后,我无法关闭它,因为window.close()对于不是通过window.open()打开的窗口无效。
我该如何做到既不被阻止弹出窗口,又能够在之后通过JS关闭呢?

https://dev59.com/8nNA5IYBdhLWcg3wn_U1 和 http://stackoverflow.com/questions/9616150/window-open-getting-blocked-in-some-browsers 可能是重复的问题。 - shareef
将状态信息放在回调URL中。不要创建多个窗口的工作流程。 - Quentin
缺乏研究.. 可能是重复的问题 - yajay
1个回答

28

为了避免弹出窗口被拦截,我使用了一个带有target="_blank"的锚。

这是一种方法,但只要你从用户生成的事件处理程序(比如click)中调用window.open,就可以打开弹出窗口。所以只需确保在链接上的click处理程序中调用window.open(然后你可以关闭它)。现代的弹出窗口拦截器(最近几年的任何一个)会阻止不是由用户事件触发的弹出窗口,但允许那些是由用户事件触发的。

Live example | source:

HTML:

<p><a href="#" id="target">Click to open popup</a>; it will close automatically after five seconds.</p>

JavaScript:

(function() {

  document.getElementById("target").onclick = function() {
    var wnd = window.open("http://stackoverflow.com");
    setTimeout(function() {
      wnd.close();
    }, 5000);
    return false;
  };

})();

这里为什么需要定时器,你能更清楚地解释一下吗? - Varun Kumar
@VarunKumar:上面的setTimeout是异步PayPal支付调用的占位符。 - T.J. Crowder

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