ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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 不这样做?


J
Jeff Victorino

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

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

var windowReference = window.open();

myService.getUrl().then(function(url) {
     windowReference.location = url;
});

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

要在 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 元素内。对答案的小修正:<button onclick='window.open("https://www.google.com", "_blank");'>Open Google search</button>
@FrankConijn 感谢您的澄清和正确。我已在我的帖子中进行了编辑以反映您的更正。
我可以补充一下:“永远不要使用 <a href="#" onclick="window.open(...);">" developer.mozilla.org/en-US/docs/Web/API/Window/open 上的 window.open 文档中有一个带有该标题的小节。似乎很清楚。
D
David Buck

您不能依赖 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);

这也不包括“_blank”(新标签)
@Dallas我想您可以在过程中添加属性 target 以使其行为符合 OP 的预期。
添加 target 属性并将其设置为 _blank 再次打破这一点,Safari 将阻止它作为弹出窗口
这应该是一个公认的答案。谢谢。
o
oguz ismail

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

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

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

Safari -> 首选项安全 -> 取消选中“阻止弹出窗口”


但你不能阻止客户的弹出窗口
@madd 我认为关键是你需要回到你的设计师那里,弄清楚如何在不通过 JS 打开新窗口或使用传统的 href 的情况下解决需求。这个答案在这里的原因是提醒人们浏览器正在使打开弹出窗口变得更加困难。
缺点:在 iPad 上,似乎没有办法普遍接受某个网站的弹出窗口,所以你必须确认你真的想每次都打开弹出窗口。
S
Stephen Rauch

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


这会导致 url 在当前选项卡中打开,而不是在新选项卡中打开(如问题中所指定)。
是的。在坐立不安之后,这对我有用。我试图在 iPhone 中捕获 onScroll ,但它无法正常工作,尽管它通常在 Safari 上工作。谢啦。
@JonSchneider 它导致在当前选项卡中打开,因为它已分配给 window。除此之外,在您的 urlString 类型的情况下,分配 url 效果更好
它为我工作。我不需要弹出窗口。只需要打开网址。太感谢了...
我想添加一条评论,当您想从某个 url 下载一些图像或文档时,这也适用。
S
Sergii

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

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

const a = document.createElement("a");
a.setAttribute('href', link);
a.setAttribute('target', '_blank');
a.click();

M
Miguel Stevens

使用 setTimeout

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

setTimeout(() => {
    window.open(url, '_blank');
})

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


很酷的解决方法!为我解决了 iPhone Safari 上的问题。并感谢您的解释。
B
Bill Criswell

在 Safari 中的“标签”下有一个标记为 Open pages in tabs instead of windows: 的设置,带有一个带有几个选项的下拉菜单。我想你的可能设置为 Always。底线是你不能依赖浏览器打开一个新窗口。


我不认为这是它。 Safari 不会在任何地方打开该站点。这就像我没有执行该行。
l
lyuboe

这应该有效:window.location.assign(url); 通常在离开页面之前保存状态很重要,因此也要记住这一点。


G
Guido

正确的语法是 window.open(URL,WindowTitle,'_blank') open 中的所有参数都必须是字符串。它们不是强制性的,可以删除窗口。因此,如果您打算自己填充 newWin.document,只需 newWin=open() 也可以。但是您必须使用所有三个参数,第三个参数设置为 '_blank' 来打开一个新的真实窗口而不是标签。


不正确,请先阅读文档:developer.mozilla.org/en-US/docs/Web/API/Window/open