码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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;
        }
    

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

  • 相关阅读:
    共享新机遇 共谋新发展 | 蓝海创意云携元宇宙技术参展2022昆明南博会
    系统移植--前言
    Spring Cloud Gateway系列【5】GatewayFilter网关过滤器详解
    【分享】集简云小程序识别财务票据同步到金蝶云星辰流程搭建示例
    资产实物综合管理系统应用方案介绍
    nuxt.js + vue-i18n + nuxt-i18n 实现多语言国际化
    【Java基础】继承、抽象类、注解
    vue-router 学习知识汇总
    基于微信小程序的校园生活管理系统设计与实现(源码+lw+部署文档+讲解等)
    有了这个网站,妈妈再也不用担心我找不到好看的配图了!
  • 原文地址:https://blog.csdn.net/JaneLittle/article/details/127112241
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号