【问题标题】:Why does browser block popup windows in callback but not otherwise为什么浏览器在回调中阻止弹出窗口而不是在其他情况下
【发布时间】:2019-03-07 23:06:24
【问题描述】:

奇怪的行为 - 我试图在回调中打开一个新窗口 - 使用 Angular 但可能是一般的 JS 问题。

如果我这样做:

$window.open('http://google.com', '_blank');

它工作正常。然而这并没有因为它被我的浏览器阻止 - 我正在使用 Safari 7 并检查了“阻止弹出窗口”:

Items.list(function(items) {
  $window.open('http://google.com', '_blank')
});

为什么浏览器会阻止那个而不是另一个,我该如何规避这个?我玩了 setTimeout 以及一些 SO post 建议,在调用 async 之前将 $window.open 分配给一个变量,但在这里不起作用。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    当弹出窗口未作为用户操作(如点击)的直接结果打开时,弹出窗口阻止程序逻辑通常会阻止弹出窗口。

    异步发生的回调不是用户操作的直接结果 - 它是稍后的某个时间并且不直接连接到该操作(如浏览器所看到的那样),因此浏览器可能不允许它。

    通常的解决方法是立即打开弹出窗口(作为用户操作的直接结果),然后在异步回调发生并且内容可用后填充其内容。

    【讨论】:

    • 效果很好。我用var wnd = $window.open("", "_blank");打开了一个空白窗口,然后用wnd.document.location.href = string;在我的回调中写了一个字符串(在我的例子中生成一个pdf)
    【解决方案2】:

    Angular 6 是否支持像 javascript 一样的弹出窗口?我不是在寻找模态窗口解决方案。我希望能够像使用 JavaScript 弹出窗口一样将窗口移动到另一个屏幕。有这方面的文件吗?你怎么能在 Angular 5/6 上做这件事,即打开一个弹出窗口

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多