使用JavaScript从Web应用程序强制在移动Safari中打开链接

43

在 iOS 的 web 应用中,调用 window.open() 方法时,页面会在 web 应用中打开,而不是在移动 Safari 中打开。

我该如何强制让网页在移动 Safari 中打开?

注意:使用直接的 <a href> 链接不是一个选项。


你的意思是<a href="http://www.stackoverflow.com" target="_blank">前往SO</a>无法使用? - JOM
4个回答

68
这是可能的。已经在iOS5独立的网络应用中进行了测试:
HTML:
<div id="foz" data-href="http://www.google.fi">Google</div>

JavaScript:

document.getElementById("foz").addEventListener("click", function(evt) {
    var a = document.createElement('a');
    a.setAttribute("href", this.getAttribute("data-href"));
    a.setAttribute("target", "_blank");

    var dispatch = document.createEvent("HTMLEvents");
    dispatch.initEvent("click", true, true);
    a.dispatchEvent(dispatch);
}, false);

可在此处进行测试:http://www.hakoniemi.net/labs/linkkitesti.html


1
难道不应该是<div id="foz" data-href="http://www.google.fi">Google</div>吗?用<div>开头,然后用</a>结尾并不合理。而且最后的</li>是什么意思? - Timo Ernst
1
在Facebook应用程序浏览器中对我无效。我已经修复了分号@laker。 - Jeremy Haile
1
已在iOS 8.3上测试,对于以WebApp模式保存到主屏幕的网页有效。可用。 - Design by Adrian
5
对于我之前的评论:在iOS 10.1上,示例可以正常工作,但是当我尝试从WebGL按钮而不是div中调用它时,什么也没有发生。要解决这个问题,只需删除“a.setAttribute("target", "_blank");”,并使用“a.dispatchEvent(new MouseEvent("click",{'view':window,'bubbles':true,'cancelable':true});)”。然后会打开一个新的Safari窗口。绝对不知道为什么在这种情况下target=_blank是不必要的。 - Selirion
3
在iOS 11上,这对我没用。它只是在嵌入的UIWebView中打开链接。 - Axeva
显示剩余17条评论

10

原来使用 JavaScript 的 window.open() 无法在 iOS web 应用程序中打开链接,如果你想在移动 Safari 中打开链接,你必须使用 <a href> 链接。


2
能否详细说明一下?我想在iOS上从Chrome / Opera打开Safari的<a href>链接。 - unsynchronized

2

Vue实现。希望有所帮助。

<template>
<div @click='handler()'>{{ text }}</div>
</template>

<script>
export default {
  props: {
    href: String,
    text: String,
  },
  methods: {
    handler() {
      const a = document.createElement('a')
      a.setAttribute('href', this.href)
      a.dispatchEvent(new MouseEvent("click", {'view': window, 'bubbles': true, 'cancelable': true}))
    }
  }
}
</script>

0

如果您使用window.open(),则可以强制iOS在safari中打开PWA链接,前提是您要么使用不同的子域,要么使用http而不是https。

例如,对于take example.com

window.open('http://example.com','_blank')

注意:一旦在浏览器中打开,我的服务器将会将http重定向到https。因此不存在安全问题。
(或者)
window.open('api.example.com','_blank')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接