window.open(url, '_blank'); 不适用于 iMac/Safari

IT技术 javascript macos safari
2021-01-19 05:46:34

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

if (url){
    window.open(url, '_blank');
} 

其中“url”是选择的页面。

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

    executing: window.open(http://www.mywebsite.com/44/threats.html, '_blank')

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

这在 Windows 7 上适用于所有浏览器,包括 Safari。

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

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

6个回答

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

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

var windowReference = window.open();

myService.getUrl().then(function(url) {
     windowReference.location = url;
});
如何使用 myService 来自哪里?
2021-03-24 05:46:34
代替 window.open,window.open("about:blank","_blank") 为我工作
2021-03-27 05:46:34
当 async 设置为 true 时,我尝试在成功方法中使用 window.open 进行 jquery $.ajax 调用。Safari 会忽略 window.open。将 jquery $.ajax 调用更改为 async: false 允许 window.open 工作。
2021-04-04 05:46:34
值得注意的是,如果无论出于何种原因,您不希望在 promise 解决时打开窗口,您可以调用windowReference.close()立即关闭它。
2021-04-05 05:46:34
这确定了问题、问题的原因和解决方法。这应该是选定的答案。
2021-04-08 05:46:34

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

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

我可以添加:“永远不要使用 <a href="#" onclick="window.open(...);">” developer.mozilla.org/en-US/上的window.open文档中有一个标题为该标题的小节docs/Web/API/Window/open似乎很清楚。
2021-03-14 05:46:34
@FrankConijn 感谢您的澄清和正确。我已经在我的帖子中进行了编辑以反映您的更正。
2021-03-20 05:46:34
OP 的结构更复杂,所以这个答案可能不是他的解决方案。但是对于正常的构造,这确实可以解决问题。至少在 iOS 11.3 上,Safari 具有默认设置。如果您放入window.open一个函数并使用 调用该函数onclick,Safari 将不会打开新标签页。该函数必须在 to click 元素内。对答案的小幅修正:<button onclick='window.open("https://www.google.com", "_blank");'>Open Google search</button>
2021-04-06 05:46:34

摘自史蒂夫于 2013 年 12 月 20 日发表的已接受答案评论:

实际上,有一种非常简单的方法可以做到:只需在 iMac/Safari 浏览器中单击“阻止弹出窗口”,它就会执行我想要的操作。

澄清一下,在 Mac OS X El Capitan 上运行 Safari 时:

  1. Safari -> 首选项
  2. 安全 -> 取消选中“阻止弹出窗口”
缺点:在 iPad 上,似乎没有一种方法可以普遍接受某个网站的弹出窗口,因此您必须每次都确认您确实想打开弹出窗口。
2021-03-13 05:46:34
但您不能阻止客户的弹出窗口
2021-04-02 05:46:34
@madd 我认为关键是你需要回到你的设计师那里,弄清楚如何在不通过 JS 打开新窗口或使用传统的href. 这个答案在这里的原因是提醒人们浏览器使打开弹出窗口变得更加困难。
2021-04-02 05:46:34

您不能依赖,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);
@Dallas 我猜您可以target在流程中添加该属性,使其按照 OP 的预期运行。
2021-03-30 05:46:34
这应该是一个可以接受的答案。谢谢。
2021-03-31 05:46:34
添加target属性并将其设置为_blank再次中断,safari 会将其阻止为弹出窗口
2021-04-02 05:46:34
这也不包括“_blank”(新标签)
2021-04-03 05:46:34

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

对。在坐立不安之后,这对我有用。我试图在 iPhone 中捕获 onScroll 并且它没有工作,尽管它通常在 Safari 上工作。谢啦。
2021-03-16 05:46:34
这会导致url在当前选项卡中打开,而不是在新选项卡中打开(如问题中所指定)。
2021-03-22 05:46:34
我想添加一条评论,当您想从某个 url 下载一些图像或文档时,这也适用。
2021-04-02 05:46:34
它为我工作。我不需要弹出窗口。只需要打开网址。太感谢了...
2021-04-08 05:46:34
@JonSchneider 它会导致在当前选项卡中打开,因为它被分配给window. 除此之外,url在你url是一个String类型的 senario 中分配工作更好
2021-04-10 05:46:34