【问题标题】:window.open() is blocked by browser when is called from promise当从 promise 调用时,window.open() 被浏览器阻止
【发布时间】:2020-06-17 13:55:54
【问题描述】:

我有这样的代码:

window.open('https://api.instagram.com/oauth/authorize/',
'_blank',
'width=700,height=500,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=0,top=0,modal=yes');

当从任何代码位置调用时,它都可以正常工作,但是当我在 promise 中使用它时(见下文),它总是被浏览器阻止。有什么建议吗?

action().success(function (r) {
  // window.open(...);
}

Promise 来自 Angular。

【问题讨论】:

  • 其他两个答案更好,应该被接受,而不是说你做不到的那个。

标签: javascript ajax angularjs


【解决方案1】:

Promise 会在您从 Ajax 请求中获得 HTTP 响应时触发。这不是用户触发的事件,因此弹出窗口被阻止。使用用户提供的窗口而不是创建新窗口。

【讨论】:

    【解决方案2】:

    我用来解决这个问题的方法是

    1. 立即打开窗口并保留引用(合法时,即在事件处理程序中)
    2. 启动异步操作
    3. 然后,在promise中,使用你打开的窗口并填写它(你可以使用win.location

    【讨论】:

    • 如果我事先不知道是否需要打开弹出窗口怎么办?如:action().then(doWindowOpenThing).catch(doSomethingElseThatDoesntOpenAPopup) 所以我不能事先打开一个窗口(以保留它的参考等),如果以后我不会使用它,对吧?
    • @luiz 一个骇人的解决方案可能是打开该窗口并在不需要时将其关闭。但我会寻找基于人体工程学的解决方法,例如执行可能失败的查询,然后显示一个对话框“事情有效,你想在新窗口中查看结果吗?”。
    【解决方案3】:
                var newTab = $window.open('', '_blank');
            promise
                .then(function () {
                    var url = '...';
                    newTab.location.href = url;
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2018-10-28
      相关资源
      最近更新 更多