• window.open在 ios safari中打开新页面失败


    上周写一个移动端的小需求,遇到了一个问题:window.open在 ios safari中打开新页面失败。再次记录一下(解决办法在文章最后)。
    当时的需求是:在页面A点击按钮,发送一个请求,该请求返回一个url(这个url是一个第三方的网站地址),然后前端用这个url跳转到第三方的页面。
    本来是一个挺简单的需求,结果部署之后发现在安卓上一切正常,但是ios手机上有问题:就是点击按钮之后,整个页面没有反应。(其实加了loading效果的话能看到lioading的过程,用抓包工具也能抓到请求,但是请求成功之后就没有下一步动作了)
    最初的代码是:
    在这里插入图片描述

    const params = { ... // 请求参数, 这里略过 };
    try {
          data.isLoading = true;
          const res: any = await authorizeGetNewUrl(params);
          window.open(res.data);
        } catch {
          data.isLoading = false;
        } finally {
          data.isLoading = false;
        }
    

    就是在then里面写的跳转,然而网上一查发现是:因为 safari 浏览器有一些安全策略,禁止在回调函数中执行window.open方法,以防页面不断弹出窗口。
    例如:
    有效打开: 如果你是提前获取了文件地址,然后通过点击触发下载就可以生效:
    window.open(url)
    无效打开: 如果你是先发送请求获取地址,然后请求的成功回调里触发下载就不会生效:
    axios.get(‘xxx’).then((url) => {
    window.open(url, ‘_blank’);
    });
    后来尝试用a标签跳转,也失败:

    const params = { ... // 请求参数, 这里略过 };
     try {
          data.isLoading = true;
          const res: any = await authorizeGetNewUrl(params);
          const a = document.createElement("a");
          a.target = "_blank";
          a.href = res.data;
          a.click();
        } catch {
          data.isLoading = false;
        } finally {
          data.isLoading = false;
        }
    

    最后解决办法: window.location.href

    const params = { ... // 请求参数, 这里略过 };
    try {
          data.isLoading = true;
          const res: any = await authorizeGetNewUrl(params);
          window.location.href = res.data;
        } catch {
          data.isLoading = false;
        } finally {
          data.isLoading = false;
        }
    

    在这里插入图片描述
    希望本文对你有所帮助!

  • 相关阅读:
    Curl 命令方式对elasticsearch备份和恢复—— 筑梦之路
    .NET 面试题集锦
    git submodule使用
    微服务实践k8s&dapr开发部署实验(1)服务调用
    全网最通透:MySQL 的 redo log 保证数据不丢的原理
    ESP32 Arduino实战协议篇-BLE 客户端实现温度和湿度数据传输
    【二叉树】输出二叉树
    Linux系统卡顿处理记录(Debian)
    数据服务器之raid1使用
    Linux--CentOS6和CentOS7的区别
  • 原文地址:https://blog.csdn.net/JaneLittle/article/details/127112241