IOS 安全机制拦截 window.open
摘要
在ios环境,在某些情况下执行window.open不生效
一、window.open
window.open(url, target, windowFeatures)
1. url:「可选参数」,表示你要加载的资源URL或路径,如果不传,则打开一个url地址为about:blank的空白页。
2. target:「可选参数」,它可以给以下两种值
第一种是target关键字
_self:当前标签页加载;
_blank(默认值):新标签页打开;
_parent:作为当前浏览环境的父级浏览上下文打开,没有父级浏览上下文,效果与_self相同;
_top:作为最顶级的浏览上下文打开,没有顶级浏览上下文,效果与_self相同。
第二种是一个字符串:
表示加载资源的浏览上下文的名称,也就是标签页的名称,如果这个名称在现有的标签页中不存在,则会开启一个新的标签页,如果存在,会跳转到这个标签页。
3. windowFeatures:「可选参数」,它是一个字符串,用来描述窗口的特性,其格式是"key1=value1, key2=value2",即将key和value以=号连接拼接成字符串,多个key value以逗号隔开,比如我们要打开一个宽为500,高为600的窗口可以这么写:
window.open(url, 'new-window', 'width=500,height=600');
二、Bug
复现问题的demo:
async function jump() {await fetch('/xxx');window.open('https://www.xxx.cn');
}
正常情况下执行window.open是能正常新标签页打开传入的url的,但是一旦前面用await做了异步操作后,再执行window.open,就不生效了。
三、原因分析
- 安全机制拦截:IOS的Safari浏览器为了防止恶意网站通过
window.open/a标签打开其他网站,于是对它们的调用有所限制,如果不是由用户直接交互触发的,而是由程序自动触发的,Safari会拦截这个操作。 - 异步操作:在AJAX回调中执行
window.open/a标签跳转,被浏览器认为是非用户交互行为,所以被拦截。
四、解决方案
方案1:改用location.href
async function jump() {await fetch('/xxx');location.href = 'https://www.xxx.cn';
}
safari不会拦截location.href
并不是所有场景下都适合用location.href,因为location.href会刷新页面,所以需要根据具体场景来选择。
方案2:先打开一个空标签页
async function jump() {const newWin = window.open("", "_blank"); // 提前打开一个窗口const { jumpUrl } = await fetch('/xxx');if (jumpUrl) {newWin.location = jumpUrl;} else {newWin.close();// ... }
}
这里根据有没有jumpUrl进行跳转,如果没有jumpUrl,我需要调用close方法关闭刚才提前打开的那个窗口,而这样用户就会体验到的流程就是,先出来一个新窗口,随后被秒关闭,这样用户体验很差。
方案3:setTimeout/requestAnimationFrame
async function jump() {await fetch('/xxx');setTimeout(() => {window.open('https://www.xxx.cn');}, 0)
}
async function jump() {await fetch('/xxx');requestAnimationFrame(() => {window.open('https://www.xxx.cn');})
}
五、总结
如果setTimeout不生效,可以尝试加点延时看看,比如100毫秒,我这边实测的ios机型都能生效,所以就没加延时。
相关文章:
IOS 安全机制拦截 window.open
摘要 在ios环境,在某些情况下执行window.open不生效 一、window.open window.open(url, target, windowFeatures) 1. url:「可选参数」,表示你要加载的资源URL或路径,如果不传,则打开一个url地址为about:blank的空…...
jmeter中对接口进行循环请求后获取相应数据
1、工作中遇到一个场景就是对某个单一接口进行循环请求,并需要获取每次请求后返回的相应数据; 2、首先就在jmeter对接口相关组件进行配置,需要组件有:循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…...
【QT】-explicit关键字
explicit explicit 是一个 C 关键字,用于修饰构造函数。它的作用是防止构造函数进行隐式转换。 为什么需要 explicit? 在没有 explicit 的情况下,构造函数可以用于隐式类型转换。这意味着,如果你有一个接受某种类型的参数的构造…...
【深度学习】 自动微分
自动微分 正如上节所说,求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单,只需要一些基本的微积分。 但对于复杂的模型,手工进行更新是一件很痛苦的事情(而且经常容易出错)。 深度学习框架通过自动…...
字节跳动自研HTTP开源框架Hertz简介附使用示例
字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架,专为高并发、低延迟的场景设计。它基于 Go 语言开发,结合了字节跳动在微服务架构中的实践经验,旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…...
skynet 源码阅读 -- 核心概念服务 skynet_context
本文从 Skynet 源码层面深入解读 服务(Service) 的创建流程。从最基础的概念出发,逐步深入 skynet_context_new 函数、相关数据结构(skynet_context, skynet_module, message_queue 等),并通过流程图、结构…...
每日十题八股-2025年1月23日
1.快排为什么时间复杂度最差是O(n^2) 2.快排这么强,那冒泡排序还有必要吗? 3.如果要对一个很大的数据集,进行排序,而没办法一次性在内存排序,这时候怎么办? 4.面试官:你的…...
MongoDB部署模式
目录 单节点模式(Standalone) 副本集模式(Replica Set) 分片集群模式(Sharded Cluster) MongoDB有多种部署模式,可以根据业务需求选择适合的架构和部署方式。 单节点模式(Standa…...
opencv笔记2
图像灰度 彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有256*256*256变化。而灰度图像是R,G,B三个分量…...
springboot使用ssl连接elasticsearch
使用es时ssl证书报错 unable to find valid certification path to requested target 1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>2…...
Linux内核中的InfiniBand核心驱动:verbs.c分析
InfiniBand(IB)是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)、数据中心和云计算等领域。Linux内核中的InfiniBand子系统通过提供一组核心API(称为Verbs API)来支持InfiniBand设备的操作。drivers/infiniband/core/verbs.c是InfiniBand核心驱动的重要组…...
把网站程序数据上传到服务器的方法和注意事项
将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法: 使用FTP: 1. 选择FTP客户端软件: - 常见的FTP客户端包括FileZilla(开源)、…...
完全平方数——唯一分解定理
文章目录 一、唯一分解定理是什么?1.定义2.示例3.代码模板 二、例题1>问题描述(2021蓝桥杯省赛)输入格式输出格式样例输入 1样例输出 1样例输入 2样例输出 2评测用例规模与约定 2>解题思路3>假娃3>C嘎嘎 一、唯一分解定理是什么&…...
(详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源
文章目录 Springboot 整合多动态数据源 这里有mysql(分为master 和 slave) 和oracle1. 引入相关的依赖2. 创建相关配置文件3. 在相关目录下进行编码,不同路径会使用不同数据源 Springboot 整合多动态数据源 这里有mysql(分为maste…...
mock可视化生成前端代码
介绍:mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件,来解决我们的问题。目前支持vite和webpack。(配置超级简单!) 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…...
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中,我们常常会遇到各种有趣且具有挑战性的问题。今天,我们就来深入探讨一个在实际开发中较为常见的问题:当连续快速发送 Post 请求时,前端会弹出 “数据正在处理,请…...
鸿蒙Harmony json转对象(1)
案例1 运行代码如下 上图的运行结果如下: 附加1 Json_msg interface 案例2 import {JSON } from kit.ArkTS; export interface commonRes {status: numberreturnJSON: ESObject;time: string } export interface returnRes {uid: stringuserType: number; }Entry Component …...
常见的RocketMQ面试题及其简要答案
以下是一些常见的RocketMQ面试题及其简要答案: 一、基础概念与架构 简述RocketMQ是什么,并说明其主要作用。 答案: RocketMQ:是阿里巴巴在2012年开源的一款分布式消息中间件,目前已经捐赠给Apache软件基金会ÿ…...
C#Object类型的索引,序列化和反序列化
前言 最近在编写一篇关于标准Mes接口框架的文章。其中有一个非常需要考究的内容时如果实现数据灵活和可使用性强。因为考虑数据灵活性,所以我一开始选取了Object类型作为数据类型,Object作为数据Value字段,String作为数据Key字段,…...
Unity3D项目开发中的资源加密详解
前言 在Unity3D游戏开发中,保护游戏资源不被非法获取和篡改是至关重要的一环。资源加密作为一种有效的技术手段,可以帮助开发者维护游戏的知识产权和安全性。本文将详细介绍Unity3D项目中如何进行资源加密,并提供相应的技术详解和代码实现。…...
Android 11+ 适配实战:破解TextToSpeech ‘speak failed: not bound to TTS engine‘ 的权限与引擎绑定之谜
1. 当语音突然沉默:Android 11的TTS报错之谜 那天我正在调试一个天气预报应用,当代码执行到语音播报"今天晴转多云"时,控制台突然抛出红字警告:speak failed: not bound to TTS engine。这个错误在Android 10及以下版本…...
Kandinsky-5.0-I2V-Lite-5s短视频质量控制:5秒内关键帧稳定性与抖动抑制技巧
Kandinsky-5.0-I2V-Lite-5s短视频质量控制:5秒内关键帧稳定性与抖动抑制技巧 1. 引言:为什么需要关注短视频质量 当你使用Kandinsky-5.0-I2V-Lite-5s生成短视频时,是否遇到过这些问题:画面突然跳变、主体运动不连贯、镜头移动卡…...
Ostrakon-VL扫描终端效果:不同材质价签(纸质/塑料/金属)识别
Ostrakon-VL扫描终端效果:不同材质价签(纸质/塑料/金属)识别 1. 像素特工:Ostrakon-VL扫描终端介绍 这是一个基于Ostrakon-VL-8B多模态大模型开发的Web交互终端,专门针对零售与餐饮场景优化。与传统工业级UI不同&…...
Swift-All镜像推荐:免配置快速部署,新手也能轻松上手
Swift-All镜像推荐:免配置快速部署,新手也能轻松上手 想体验大模型的强大能力,却被复杂的安装、环境配置和依赖问题搞得头大?今天,我为你介绍一个能彻底解决这些烦恼的“神器”——Swift-All镜像。它就像一个为你量身…...
开源大模型效果展示:Pixel Language Portal对emoji+文字混合输入的语义解析
开源大模型效果展示:Pixel Language Portal对emoji文字混合输入的语义解析 1. 项目概览 Pixel Language Portal(像素语言跨维传送门)是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件不同,它将语言转换…...
Phi-3 Forest Lab应用场景:科研人员实验设计思路启发助手
Phi-3 Forest Lab应用场景:科研人员实验设计思路启发助手 1. 引言:当科研思路遇到“森林智者” 你有没有过这样的时刻?面对一个全新的研究课题,实验方案想了三天三夜,却总觉得思路打不开,或者陷入了某个细…...
AudioSeal环境部署:Ubuntu+CUDA 12.x+PyTorch 2.3适配性配置指南
AudioSeal环境部署:UbuntuCUDA 12.xPyTorch 2.3适配性配置指南 1. 引言 如果你正在寻找一种可靠的方法来为AI生成的音频打上“数字指纹”,以便后续进行检测和溯源,那么Meta开源的AudioSeal项目绝对值得你花时间研究。简单来说,A…...
HY-Motion 1.0作品集展示:12类日常动作+8类专业运动生成效果
HY-Motion 1.0作品集展示:12类日常动作8类专业运动生成效果 1. 引言:当文字能驱动骨骼 想象一下,你正在为一个游戏角色设计一套连贯的格斗动作,或者为一个虚拟主播编排一段自然的舞蹈。传统流程需要动画师一帧一帧地调整骨骼&am…...
【2026年最新600套毕设项目分享】springboot足球训练营系统(14309)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
像素剧本圣殿惊艳效果:深紫+荧光绿UI中生成的古装剧场景描述高清截图
像素剧本圣殿惊艳效果:深紫荧光绿UI中生成的古装剧场景描述高清截图 1. 视觉震撼:当复古像素美学遇上AI剧本创作 在数字创作工具同质化严重的今天,像素剧本圣殿以其独特的视觉风格脱颖而出。这款基于Qwen2.5-14B-Instruct深度微调的专业剧本…...
