window.open(url,'_ blank'); 没有在iMac/Safari上工作

Ste*_*eve 46 javascript safari macos

我已经构建了一个网页,让您从下拉列表中选择一个页面名称,然后将浏览器传输到该页面.执行传输的代码是

if (url){
    window.open(url, '_blank');
} 
Run Code Online (Sandbox Code Playgroud)

其中"url"是选中的页面.

window.open行之前的控制台日志打印如下:

    executing: window.open(http://www.mywebsite.com/44/threats.html, '_blank')
Run Code Online (Sandbox Code Playgroud)

然后浏览器在新选项卡中打开页面.

这适用于所有浏览器的Windows 7,包括Safari.

在iMac上,它适用于Firefox但不适用于Safari.

有谁知道为什么iMac/Safari不会这样做?

小智 123

Safari阻止对在异步调用中进行的window.open()的任何调用.

我发现这个问题的解决方案是在进行asnyc调用之前调用window.open并在promise解析时设置位置.

var windowReference = window.open();

myService.getUrl().then(function(url) {
     windowReference.location = url;
});
Run Code Online (Sandbox Code Playgroud)

  • 当async设置为true时,我尝试在成功方法中使用window.open进行jquery $ .ajax调用.Safari会忽略window.open.将jquery $ .ajax调用更改为async:false允许window.open工作. (9认同)
  • 代替 window.open,window.open("about:blank","_blank") 为我工作 (4认同)
  • 如何使用 myService 来自哪里? (4认同)
  • 这可以确定问题,问题的原因和解决方法。这应该是选定的答案。 (2认同)
  • 值得注意的是,如果出于某种原因,您不希望在 Promise 解析时打开窗口,您可以调用“windowReference.close()”立即关闭它。 (2认同)

Mig*_*ens 58

使用setTimeout

编辑:有些人报告说此方法在最新的 Safari 上不再适用。

window.open(url, '_blank')使用 setTimeout 将代码行包装在异步函数中也可以,

setTimeout(() => {
    window.open(url, '_blank');
})
Run Code Online (Sandbox Code Playgroud)

setTimeout 代码在主线程上运行,而不是在异步线程上运行。在 Chrome 和 Safari 中测试。

  • 这个答案被低估了!谢谢! (4认同)
  • 更新 - `target="_blank"` 停止为我工作。必须使用 `target="_top"` (3认同)

use*_*238 18

要在safari中使用window.open(),必须将其放在元素的onclick事件属性中.

例如: <button class='btn' onclick='window.open("https://www.google.com", "_blank");'>Open Google search</button>

  • OP 的结构更复杂,所以这个答案可能不是他的解决方案。但是对于正常的结构,这确实可以解决问题。至少在 iOS 11.3 上,Safari 具有默认设置。如果您将 `window.open` 放在一个函数中并使用 `onclick` 调用该函数,Safari 将不会打开一个新选项卡。该函数必须在 to click 元素内。对答案的小幅修正:`&lt;button onclick='window.open("https://www.google.com", "_blank");'&gt;打开 Google 搜索&lt;/button&gt;`。 (2认同)

jnr*_*orp 17

取自史蒂夫于2013年12月20日接受的答案评论:

实际上,有一种非常简单的方法:只需在iMac/Safari浏览器中单击"阻止弹出窗口",它就可以实现我的目的.

为了澄清,在Mac OS X El Capitan上运行Safari时:

  1. Safari - >偏好设置
  2. 安全性 - >取消选中"阻止弹出窗口"

  • 但你不能阻止客户的弹出窗口 (18认同)

Abr*_*ham 10

您不能依赖,window.open因为浏览器可能有不同的策略。我有同样的问题,我改用下面的代码。

let a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = <your_url>;
a.download = <your_fileName>;
a.click();
document.body.removeChild(a);
Run Code Online (Sandbox Code Playgroud)

  • 添加 `target` 属性并将其设置为 `_blank` 会再次破坏此问题,safari 会将其阻止为弹出窗口 (3认同)

小智 7

window.location.assign(url)window.open(url)解决了 ios 设备中的问题

  • 这会导致“url”在当前选项卡中打开,而不是在新选项卡中打开(如问题中指定的)。 (8认同)

Ser*_*gii 7

使用 JavaScript 以编程方式在新选项卡中打开链接:safari、mobile safari 和其他浏览器:

const link = 'https://google.com';

const a = document.createElement("a");
a.setAttribute('href', link);
a.setAttribute('target', '_blank');
a.click();
Run Code Online (Sandbox Code Playgroud)

  • 这个技巧在 Safari ios 中不起作用。 (3认同)

Bil*_*ell 1

Safari 中的“选项卡”下有一个设置,标Open pages in tabs instead of windows:有带有几个选项的下拉菜单。我想你的可能会被设置为Always. 最重要的是,您不能依赖浏览器打开新窗口。