通过iframe下载文件,怎么判断文件是否下载成功?

文章目录

    • 概要
    • 问题思考
    • 问题解决方案
    • 技术细节
    • 小结

概要

最近在客户现场开发,碰到客户反馈一个问题,他用tab去承接下载文件的接口,假如文件不存在,会导致tab页面关闭不了


问题思考

下载接口用tab承接,设计思路就不对

虽然tab页面也是通过iframe嵌套的,但是点击那个tab页面的关闭按钮时,会导致tab组件关闭事件里面报错,导致关闭不了。


问题解决方案

新创建一个iframe来承接下载接口,通过iframe加载完成的状态来控制即可。

// 假设 downloadPageUrl 是下载页面的 URL
let downloadPageUrl = "https://example.com/download";// 创建一个隐藏的 iframe 元素
let hiddenIframe = document.createElement('iframe');
hiddenIframe.style.display = 'none';// 将 iframe 加载到下载页面 URL
hiddenIframe.src = downloadPageUrl;// 将 iframe 添加到页面中
document.body.appendChild(hiddenIframe);//  通过iframe的加载状态进行控制
let iframeDoc = hiddenIframe.contentDocument;
if(iframeDoc &&  (iframeDoc.readyState == 'complete' || iframeDoc.readyState == 'interactive')){console.log("文件存在!");
}else{alert("文件不存在!");
}

技术细节

readyState很重要,下面详细说说。

readyState 属性返回当前文档的状态
语法:document.readyState

  1. UNINITIALIZED:XML 对象被产生,但没有任何文件被加载。
  2. LOADING:加载程序进行中,但文件尚未开始解析。
  3. LOADED:部分的文件已经加载且进行解析,但对象模型尚未生效。
  4. INTERACTIVE:仅对已加载的部分文件有效,在此情况下,对象模型是有效但只读的。
  5. COMPLETED:文件已完全加载,代表加载成功。

小结

最终通过上述方案解决了客户的问题,做下总结,方便以后遇到可快速解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学术神器ChatGPT在论文分析中的妙用!

话语分析是一个广泛的研究领域,它关注的是人们在实际社会交际场景中使用的语言单位。话语分析旨在揭示语言、社会和文化之间的互动关系,以及话诺在构建意义、传递信息、维护社会关系和表达权力等方面的作用。话语分析包括对话分析、批判性话语分析、语篇…

Android开发环境的安装配置及步骤详解

Android开发环境的安装配置是一个多步骤的过程,涉及JDK、Android Studio以及Android SDK的安装和配置。以下是详细的安装配置教程: 一、安装JDK 下载JDK:访问Oracle官方网站或JDK的官方下载页面,选择与你的操作系统和位数&#x…

二维码门楼牌管理系统应用场景:促进环境保护与资源管理的创新应用

文章目录 前言一、二维码门楼牌管理系统的概念与特点二、在环境保护领域的应用三、在资源管理领域的应用四、促进可持续发展的作用 前言 在数字化时代的浪潮下,二维码技术凭借其高效、便捷的特点,已经渗透到了我们生活的方方面面。二维码门楼牌管理系统…

defineExpose暴漏子组件的属性和方法!!!

需求&#xff1a;需要在父组件中使用子组件的方法或者属性 一、在子组件中定义方法&#xff0c;并将其暴漏出来 首先我引入了一个抽屉组件&#xff0c;通过open方法设置打开抽屉&#xff0c;然后通过difineExpose将open方法暴漏出来。 1、封装一个抽屉组件 <template>…

大模型笔记:最少到最多提示过程 (Least to Most prompting, LtM)

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS 2023 ICLR 1 概述 进一步发展维链提示过程 (CoT prompting) 分为两个阶段&#xff1a; 第一阶段&#xff1a;向语言模型提出查询&#xff0c;将问题分解成子问题。第二阶段&#xff1a;再次向语…

laravel-admin 头部添加操作

新建html 样式及js namespace App\Admin\Extensions\Nav;class Links {public function __toString(){return <<<HTML<li><a href"" οnclick"js_method();return false;"><i class"fa fa-floppy-o"></i><s…

Meta的Llama2模型已上线!但我为何更推荐你从HuggingFace获取?还有Code Llama等你来解锁!

嘿&#xff0c;朋友们&#xff0c;今天给你们介绍一个新东西——Llama2模型&#xff0c;这是Meta&#xff08;对&#xff0c;就是Facebook那家&#xff09;推出的。 你可以直接去Llama的官网下载这个模型&#xff0c;然后按照他们GitHub上的指南来调用。 不过呢&#xff0c;我…

88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

mongo和redis的数据备份和还原

redis 安装 Redis安装和基本使用&#xff08;windows版&#xff09; - 知乎 window环境下Redis7服务器的安装和运行_redis7 windows-CSDN博客 备份数据 Redis SAVE 命令用于创建当前数据库的备份。 该命令将在 redis 安装目录中创建dump.rdb文件 查询路径 CONFIG GET dir…

排序算法之选择排序|c++实现

引言 排序算法学习第二弹之选择排序&#xff0c;这也是入门的一个基础算法。 算法描述 从序列中选择最大&#xff08;小&#xff09;的元素&#xff0c;放在序列的结束位置&#xff08;下标为n-1&#xff09; 从剩下的未排序序列中继续选择最大&#xff08;小&#xff09;的…

强化学习工具箱(Matlab)

1、Get Started 1.1、MDP环境下训练强化学习智能体 MDP环境如下图 每个圆圈代表一个状态每个状态都有上或下的选择智能体从状态 1 开始智能体接收的奖励值为图中状态转移的值训练目标是最大化累计奖励 &#xff08;1&#xff09;创建 MDP 环境 创建一个具有 8 个状态和 2 …

每日OJ题_牛客HJ87 密码强度等级(IO型OJ)

目录 牛客HJ87 密码强度等级 解析代码 牛客HJ87 密码强度等级 密码强度等级_牛客题霸_牛客网 题目描述 密码按如下规则进行计分&#xff0c;并根据不同的得分为密码进行安全等级划分。 一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二…

设计模式-状态模式使用方法

状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为&#xff0c;看起来就好像改变了它的类一样。状态模式主要用于实现一个对象的状态转换逻辑分离&#xff0c;以及避免使用大量的条件判断语句。 状态…

C# LINQ基础

LINQ基础 1. 入门2. 运算符流语法2.1 连续使用查询运算符2.2 使用Lambda表达式2.2.1 Lambda表达式及Func的方法签名2.2.2 Lambda表达式和元素类型2.2.3 自然排序2.2.4 其他查询运算符 3 查询表达式4 延迟执行4.1 重复执行4.2 捕获的变量4.3 延迟加载的工作原理4.4 查询语句的执…

【思考】crud接口命名规范

写代码时取名字真的是痛苦。 方法命名 1、阿里命名规范 Service/Dao 层命名规约 1&#xff09; 获取单个对象的方法用 get 做前缀。 2&#xff09; 获取多个对象的方法用 list 做前缀。 3&#xff09; 获取统计值的方法用 count 做前缀。 4&#xff09; 插入的方法用 save&am…

c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符&#xff0c;用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性&#xff0c;它是唯一具有此能力的C风格的转型操作符。在C11中&#xff0c;const_cast可以完成…

李子柒的精致生活只是一种文人想象

社会运行有两种基本的赚钱方式&#xff1a;1.做出有意义的社会贡献&#xff0c;获得与贡献的社会价值相称的报酬。劳动时间与劳动价值同酬。2.利用市场的无效率&#xff0c;在不产生任何实质价值的情况下摘取资金。劳动时间与劳动价值不同酬。 找一份工作、从事有用的工作、编…

【经验】测试工装排错小结

最近在整产品测试工装&#xff0c;看起来很简单的几项检测功能&#xff0c;前后也就几百行代码&#xff0c;但是却花了两周时间将功能调试出来&#xff0c;过程可谓一波三折&#xff0c;现总结如下。 1&#xff1a;对于电源控制类的检测&#xff0c;最好考虑下电平稳定时间。 …

SpringMVC拦截器和过滤器执行顺序及区别

拦截器&#xff08;Inteceptor&#xff09;和过滤器&#xff08;Filter&#xff09;执行顺序&#xff1f; 拦截器和过滤器区别&#xff1f; 1、拦截次数不同&#xff1a; 过滤器&#xff1a;一次请求只能被一个过滤器拦截一次&#xff0c;它们按照在web.xml中的声明顺序依次执…

RBAC详细解释

关于RBAC **RBAC** **R**ole **B**ased **A**ccess **C**ontrol&#xff08;基于角色的访问控制&#xff09; RBAC是经典的用户权限管理的设计思路。在这样的设计中&#xff0c;会存在3种类型&#xff1a;用户、角色、权限&#xff0c;权限将分配到各种角色上&#xff0c;用户…