【问题标题】:window.open(url, '_blank'); not working on iMac/Safariwindow.open(url, '_blank');不适用于 iMac/Safari
【发布时间】:2014-01-08 20:50:17
【问题描述】:

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

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

【问题讨论】:

    标签: javascript macos safari


    【解决方案1】:

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

    【讨论】:

    • 我不认为是这样。 Safari 不会在任何地方打开该站点。这就像我没有执行该行。
    【解决方案2】:

    要在 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 感谢您的澄清和正确。我已在我的帖子中进行了修改以反映您的更正。
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

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

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

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

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

    【讨论】:

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

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

    【讨论】:

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

    您不能依赖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 将阻止它作为弹出窗口
    • 这应该是一个可以接受的答案。谢谢。
    【解决方案8】:

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

    const link = 'https://google.com';
    
    const a = document.createElement("a");
    a.setAttribute('href', link);
    a.setAttribute('target', '_blank');
    a.click();
    

    【讨论】:

      【解决方案9】:

      使用 setTimeout

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-16
        • 2021-04-19
        • 2012-08-05
        • 1970-01-01
        • 2013-04-04
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多