<iframe>标签和定时调用函数setInterval
iframe 标签和定时调用函数 setInterval
- 问题描述:
- 解决方法:
问题描述:
今天遇到一个前端问题,在浏览器页面上传Excel文件后,然后点击导入按钮,经后端Java类读取文件内容校验后,将校验结果返回给前端,要求整个校验过程中,整个界面禁止跳转,校验结果以弹框形式展示,然后用户根据校验结果,选择【确定】或【取消】决定是否真正导入该 Excel 文件数据;
项目中导入文件时使用的 form.submit(); 方法,form 表单属性enctype="multipart/form-data",通过这种方式将 内置的参数 传入到后端,后端根据这些参数来解析Excel文件获取数据来校验,因为项目框架限制,无法使用 FormData 工具、Promise、传统Ajax方式…(要不无法使用,可以使用的无法将解析 Excel 文件的关键内置参数传入后端)
界面参考:


test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head><title>文件上传界面</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4; /* 背景颜色 */margin: 0;padding: 0;display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 100vh; /* 全屏高度 */}.container {background-color: white; /* 内容区域背景色 */padding: 30px; /* 上下内边距,增加容器高度 */border-radius: 10px; /* 圆角 */box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */text-align: center; /* 文字居中 */width: 80%; /* 宽度 */max-width: 600px; /* 最大宽度 */min-height: 300px; /* 最小高度,容器高度增加 */}h1 {color: #333; /* 标题颜色 */margin-bottom: 20px; /* 标题底部留白 */}p {color: #666; /* 文字颜色 */margin-bottom: 20px; /* 段落底部留白 */}.file-upload {display: flex; /* 使用 flexbox 放置文件选择、文件名框和上传按钮 */align-items: center; /* 垂直居中 */justify-content: flex-start; /* 左对齐 */gap: 10px; /* 之间留白 */}.file-upload input[type="file"] {flex: 1; /* 文件选择框占据剩余空间 */display: none; /* 隐藏文件选择框 */}.file-upload .file-name {width: 100%; /* 文件名框占满空间 */padding: 10px;border: 1px solid #ccc; /* 边框 */border-radius: 5px; /* 圆角 */text-align: left; /* 文件名显示在左侧 */background-color: #f9f9f9; /* 背景颜色 */height: 40px; /* 高度统一 */}.choose-file-btn,.upload-btn {padding: 10px 20px; /* 按钮内边距 */border: none; /* 无边框 */border-radius: 5px; /* 圆角 */cursor: pointer; /* 鼠标指针样式 */height: 40px; /* 高度一致 */white-space: nowrap; /* 防止文字换行 */}.choose-file-btn {background-color: #007bff; /* 选择文件按钮的蓝色 */color: white; /* 按钮文字颜色 */}.choose-file-btn:hover {background-color: #0056b3; /* 蓝色按钮悬停效果 */}.upload-btn {background-color: #28a745; /* 上传按钮的绿色 */color: white; /* 按钮文字颜色 */}.upload-btn:hover {background-color: #218838; /* 绿色按钮悬停效果 */}</style>
</head>
<body>
<div class="container"><h1>欢迎来到文件导入界面</h1><p>请在下面上传您的文件。</p><form id="myForm" action="upload" method="post" enctype="multipart/form-data"><div class="file-upload"><input type="text" id="fileName" class="file-name" placeholder="请选择文件..." readonly><input type="file" name="file" id="fileInput" required onchange="updateFileName()"><button type="button" class="choose-file-btn" onclick="document.getElementById('fileInput').click();">选择文件</button><input type="submit" class="upload-btn" value="导入"></div></form><iframe name="upload_target" style="display:none;"></iframe>
</div><script>// 显示选择的文件名function updateFileName() {let fileInput = document.getElementById('fileInput');let fileNameField = document.getElementById('fileName');if (fileInput.files.length > 0) {fileNameField.value = fileInput.files[0].name;}}</script>
</body>
</html>
解决方法:
要求整个校验过程中,整个界面禁止跳转 这一过程可以通过 <iframe>标签来实现;
获取校验结果可以通过定时调用函数setInterval来实现。(因为异步提交表单导致获取校验结果的代码总是先结果返回之前执行,一直获取空,所以才采用定时调用函数setInterval来实现)
IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)
setInterval是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval方法会不停地调用函数,直到clearInterval被调用或窗口被关闭。
- 由
setInterval返回的ID值可用作clearInterval方法的参数。
示例代码:
function doImport() {let form = document.forms["myForm"];//获取name属性值为"myForm"的表单对象let ckUrl = 'XXXXXXX';//校验地址// 设置表单的目标属性为 'upload_target',即指定表单提交后显示的iframeform.setAttribute('target', 'upload_target');form.action = ckUrl; // 设置表单提交的URL地址form.submit();// 提交表单// 启动一个定时器,每200毫秒检查一次iframe内容const start = setInterval(function () {let ifm = document.getElementById('ifm'); // 获取iframe元素let ifDoc = ifm.contentDocument || ifm.contentWindow.document;// 获取iframe内部的文档对象let ifContent = ifDoc.body.innerHTML; // 获取iframe文档中的HTML内容// 判断iframe中的内容是否为空,如果不为空则执行以下操作if (ifContent !== '') {doStopGoal(); // 停止定时器let returnData = eval('(' + ifContent + ')');// 解析iframe中的内容let ckInfo = returnData.ckInfo;// 获取返回的数据中的ckInfo字段值if (ckInfo === 'ok') {//校验通过,调用导入函数importConfirm();} else {//逻辑代码...}}}, 200); // 每200毫秒执行一次// 停止定时器function doStopGoal() {clearInterval(start);}
}// 校验成功后,真正导入数据
function importConfirm() {let importUrl = 'YYYYYY'; // 导入地址let form = document.forms["myForm"];form.removeAttribute("target");// 移除表单的target属性form.action = importUrl;form.submit();
}

相关文章:
<iframe>标签和定时调用函数setInterval
iframe 标签和定时调用函数 setInterval 问题描述:解决方法: 问题描述: 今天遇到一个前端问题,在浏览器页面上传Excel文件后,然后点击导入按钮,经后端Java类读取文件内容校验后,将校验结果返回…...
MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析
前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少,主要讲解:聚合函数和简要介绍sql语句执行过…...
Qt——界面优化
一.QSS 1.背景 在网页前端开发领域中, CSS 是⼀个至关重要的部分。 描述了⼀个网页的 "样式"。 从而起到对网页美化的作用。 所谓样式,包括不限于大小,位置,颜色,背景,间距,字体等等…...
MySQL 数据库常见字段类型大全及详细解析
在工作期间会遇到数据库建表的业务,经常会使用复制粘帖等操作,而不清楚数据库的字段类型。本文记录了 MySQL 数据库常见字段类型,根据不同的数据需求,可以选择不同的字段类型来存储数据。 文章目录 一、整数类型1、TINYINT&#x…...
MATLAB 工具库的使用说明和案例示例
以下是一些常见的 MATLAB 工具库的使用说明和案例示例: 信号处理工具箱(Signal Processing Toolbox): 使用说明:提供了用于生成、测量、变换、过滤和可视化信号的函数和应用程序。包括重新采样、平滑、同步信号、设计…...
对于Docker的初步了解
简介与概述 1.不需要安装环境,工具包包含了环境(jdk等) 2.打包好,“一次封装,到处运行” 3.跨平台,docker容器在任何操作系统上都是一致的,这就是实现跨平台跨服务器。只需要一次配置好环境&…...
java基础学习——jdbc基础知识详细介绍
引言 数据的存储 我们在开发 java 程序时,数据都是存储在内存中的,属于临时存储,当程序停止或重启时,内存中的数据就会丢失,我们为了解决数据的长期存储问题,有以下解决方案: 通过 IO流书记&…...
第20篇:Python 开发进阶:使用Django进行Web开发详解
第20篇:使用Django进行Web开发 内容简介 在上一篇文章中,我们深入探讨了Flask框架的高级功能,并通过构建一个博客系统展示了其实际应用。本篇文章将转向Django,另一个功能强大且广泛使用的Python Web框架。我们将介绍Django的核…...
CukeTest使用 | 1 CukeTest是什么?如何下载安装?
CukeTest使用 | 1 CukeTest是什么?如何下载安装? 1 CukeTest是什么?2 关于开发者3 CukeTest有哪些特性?4 都支持哪些自动化技术类型?5 版本区别6 下载安装 特殊说明:学习内容主要来自官网的教程、以及网上公…...
An OpenGL Toolbox
3.An OpenGL Toolbox 声明:该代码来自:Computer Graphics Through OpenGL From Theory to Experiments,仅用作学习参考 3.1 Vertex Arrays and Their Drawing Commands 顶点数组及其绘制命令:将几何数据存储在一个位置,…...
R语言学习笔记之高效数据操作
一、概要 数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具,可以实现快…...
构造函数及实例化的过程:实例成员
构造函数:是一种特殊的函数,主要用来初始化对象 使用场景:比如我们创建了佩奇的对象,继续创建乔治的对象还需要重新写一遍,此时可以通过构造函数来快速创建多个类似的对象。 构造函数语法:大写字母开头的函数 function Pig(name,age,gender)…...
Linux的权限和一些shell原理
目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型: 基本权限: chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后: 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…...
LearnOpenGL——光照
教程地址:简介 - LearnOpenGL CN 前言 这篇开始光照的学习。 颜色 原文链接: 颜色 - LearnOpenGL CN总结: 重新搭建了一个简单场景,为后面的学习做准备。 现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我…...
落地 ORB角点检测与sift检测
ORB角点检测 可以说ORB是由FAST、灰度质心和BRIEF等技术组合优化形成的,不过更准确地说,ORB是在FAST特征检测算法基础上,结合了灰度质心确定方向以及改进后的BRIEF描述子等技术形成的,以下是具体分析: • FAST特征检…...
步入响应式编程篇(二)之Reactor API
步入响应式编程篇(二)之Reactor API 前言回顾响应式编程Reactor API的使用Stream引入依赖Reactor API的使用流源头的创建 reactor api的背压模式发布者与订阅者使用的线程查看弹珠图查看形成新流的日志 前言 对于响应式编程的基于概念,以及J…...
利用Redis实现数据缓存
目录 1 为啥要缓存捏? 2 基本流程(以查询商铺信息为例) 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除(半自动) 3.3 主动更新(手动) 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…...
如何使用 pytest-html 创建自定义 HTML 测试报告
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 测试 Python 代码对于提高代码质量、检测漏洞或意外行为至关重要。 但测试结果又该…...
服务器中的流量主要是指什么?
服务器流量就是指服务器在单位时间内所传输的数据量,服务器流量在互联网中起着十分重要的作用,一般会被用来处理网站的访问请求,当用户在网站中浏览网页和视频时,服务器会接收到用户的请求,同时会返回网站的内容。 服务…...
飞牛NAS安装过程中的docker源问题
采用CloudFlare进行飞牛NAS的远程访问 【安全免费】无需公网IP、端口号,NAS外网访问新方法_网络存储_什么值得买 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1panel.dev&quo…...
【动态规划】--- 斐波那契数模型
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 🏠 第N个泰波那契数模型 📌 题目解析 第N个泰波那契数 题目要求的是泰波那契数,并非斐波那契数。 &…...
php-phar打包避坑指南2025
有很多php脚本工具都是打包成phar形式,使用起来就很方便,那么如何自己做一个呢?也找了很多文档,也遇到很多坑,这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件,很方便 可通过phar help查看…...
ChirpIoT技术的优势以及局限性
ChirpIoT是一种由上海磐启微电子开发的国产无线射频通讯技术,ChirpIoT技术基于磐启多年对雷达等线性扩频信号的深入研究,并在此基础上对线性扩频信号的变化进行了改进,实现了远距离传输的一种无线通信技术。相关产品型号有E29-400T22D、E290-…...
java提取系统应用的日志中的sql获取表之间的关系
为了获取到对应的sql数据,分了三步骤 第一步,获取日志文件,解析日志文件中的查询sql,递归解析sql,获取表关系集合 递归解析sql,获取表与表之间的关系 输出得到的对应关联关系数据 第二步,根据获…...
PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(下.代码部分)
医疗 MLLM 框架编程实现 本医疗 MLLM 框架结合 Python 与 PyQt6 构建,旨在实现多模态医疗数据融合分析并提供可视化界面。下面从数据预处理、模型构建与训练、可视化界面开发、模型 - 界面通信与部署这几个关键部分详细介绍编程实现。 6.1 数据预处理 在医疗 MLLM 框架中,多…...
IMX6ull项目环境配置
文件解压缩: .tar.gz 格式解压为 tar -zxvf .tar.bz2 格式解压为 tar -jxvf 2.4版本后的U-boot.bin移植进SD卡后,通过串口启动配置开发板和虚拟机网络。 setenv ipaddr 192.168.2.230 setenv ethaddr 00:04:9f:…...
Linux(Centos 7.6)命令详解:wc
1.命令作用 打印文件的行数、单词数、字节数,如果指定了多个文件,还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…...
Gradle buildSrc模块详解:集中管理构建逻辑的利器
文章目录 buildSrc模块二 buildSrc的使命三 如何使用buildSrc1. 创建目录结构2. 配置buildSrc的构建脚本3. 编写共享逻辑4. 在模块中引用 四 典型使用场景1. 统一依赖版本管理2. 自定义Gradle任务 3. 封装通用插件4. 扩展Gradle API 五 注意事项六 与复合构建(Compo…...
六、深入了解DI
依赖注入是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象. 在上⾯程序案例中,我们使⽤了 Autowired 这个注解,完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…...
基于RAG构建Text2SQL的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...
