<iframe>标签和定时调用函数setInterval

news2025/1/26 15:25:02

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来实现

IFRAMEHTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)


setInterval 是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval方法会不停地调用函数,直到 clearInterval被调用或窗口被关闭。

  • setInterval返回的ID值可用作clearInterval方法的参数。

示例代码:

function doImport() {
    let form = document.forms["myForm"];//获取name属性值为"myForm"的表单对象
    let ckUrl = 'XXXXXXX';//校验地址
    // 设置表单的目标属性为 'upload_target',即指定表单提交后显示的iframe
    form.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();
}

在这里插入图片描述

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

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

相关文章

Qt——界面优化

一.QSS 1.背景 在网页前端开发领域中&#xff0c; CSS 是⼀个至关重要的部分。 描述了⼀个网页的 "样式"。 从而起到对网页美化的作用。 所谓样式&#xff0c;包括不限于大小&#xff0c;位置&#xff0c;颜色&#xff0c;背景&#xff0c;间距&#xff0c;字体等等…

java基础学习——jdbc基础知识详细介绍

引言 数据的存储 我们在开发 java 程序时&#xff0c;数据都是存储在内存中的&#xff0c;属于临时存储&#xff0c;当程序停止或重启时&#xff0c;内存中的数据就会丢失&#xff0c;我们为了解决数据的长期存储问题&#xff0c;有以下解决方案&#xff1a; 通过 IO流书记&…

CukeTest使用 | 1 CukeTest是什么?如何下载安装?

CukeTest使用 | 1 CukeTest是什么&#xff1f;如何下载安装&#xff1f; 1 CukeTest是什么&#xff1f;2 关于开发者3 CukeTest有哪些特性&#xff1f;4 都支持哪些自动化技术类型&#xff1f;5 版本区别6 下载安装 特殊说明&#xff1a;学习内容主要来自官网的教程、以及网上公…

An OpenGL Toolbox

3.An OpenGL Toolbox 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 3.1 Vertex Arrays and Their Drawing Commands 顶点数组及其绘制命令&#xff1a;将几何数据存储在一个位置&#xff0c…

R语言学习笔记之高效数据操作

一、概要 数据操作是R语言的一大优势&#xff0c;用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作&#xff0c;包括排序、更新、分组汇总等。R数据操作包&#xff1a;data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具&#xff0c;可以实现快…

Linux的权限和一些shell原理

目录 shell的原理 Linux权限 sudo命令提权 权限 文件的属性 ⽂件类型&#xff1a; 基本权限&#xff1a; chmod改权限 umask chown 该拥有者 chgrp 改所属组 最后&#xff1a; 目录权限 粘滞位 shell的原理 我们广义上的Linux系统 Linux内核Linux外壳 Linux严格…

LearnOpenGL——光照

教程地址&#xff1a;简介 - LearnOpenGL CN 前言 这篇开始光照的学习。 颜色 原文链接&#xff1a; 颜色 - LearnOpenGL CN总结&#xff1a; 重新搭建了一个简单场景&#xff0c;为后面的学习做准备。 现实世界中有无数种颜色&#xff0c;每一个物体都有它们自己的颜色。我…

步入响应式编程篇(二)之Reactor API

步入响应式编程篇&#xff08;二&#xff09;之Reactor API 前言回顾响应式编程Reactor API的使用Stream引入依赖Reactor API的使用流源头的创建 reactor api的背压模式发布者与订阅者使用的线程查看弹珠图查看形成新流的日志 前言 对于响应式编程的基于概念&#xff0c;以及J…

利用Redis实现数据缓存

目录 1 为啥要缓存捏&#xff1f; 2 基本流程&#xff08;以查询商铺信息为例&#xff09; 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除&#xff08;半自动&#xff09; 3.3 主动更新&#xff08;手动&#xff09; 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…

php-phar打包避坑指南2025

有很多php脚本工具都是打包成phar形式&#xff0c;使用起来就很方便&#xff0c;那么如何自己做一个呢&#xff1f;也找了很多文档&#xff0c;也遇到很多坑&#xff0c;这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件&#xff0c;很方便 可通过phar help查看…

java提取系统应用的日志中的sql获取表之间的关系

为了获取到对应的sql数据&#xff0c;分了三步骤 第一步&#xff0c;获取日志文件&#xff0c;解析日志文件中的查询sql&#xff0c;递归解析sql&#xff0c;获取表关系集合 递归解析sql&#xff0c;获取表与表之间的关系 输出得到的对应关联关系数据 第二步&#xff0c;根据获…

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(下.代码部分)

医疗 MLLM 框架编程实现 本医疗 MLLM 框架结合 Python 与 PyQt6 构建,旨在实现多模态医疗数据融合分析并提供可视化界面。下面从数据预处理、模型构建与训练、可视化界面开发、模型 - 界面通信与部署这几个关键部分详细介绍编程实现。 6.1 数据预处理 在医疗 MLLM 框架中,多…

IMX6ull项目环境配置

文件解压缩&#xff1a; .tar.gz 格式解压为 tar -zxvf .tar.bz2 格式解压为 tar -jxvf 2.4版本后的U-boot.bin移植进SD卡后&#xff0c;通过串口启动配置开发板和虚拟机网络。 setenv ipaddr 192.168.2.230 setenv ethaddr 00:04:9f:…

Gradle buildSrc模块详解:集中管理构建逻辑的利器

文章目录 buildSrc模块二 buildSrc的使命三 如何使用buildSrc1. 创建目录结构2. 配置buildSrc的构建脚本3. 编写共享逻辑4. 在模块中引用 四 典型使用场景1. 统一依赖版本管理2. 自定义Gradle任务 3. 封装通用插件4. 扩展Gradle API 五 注意事项六 与复合构建&#xff08;Compo…

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…

【论文阅读】HumanPlus: Humanoid Shadowing and Imitation from Humans

作者&#xff1a;Zipeng Fu、Qingqing Zhao、Qi Wu、Gordon Wetstein、Chelsea Finn 项目共同负责人&#xff0c;斯坦福大学 项目网址&#xff1a;https://humanoid-ai.github.io 摘要 制造外形与人类相似的机器人的一个关键理由是&#xff0c;我们可以利用大量的人类数据进行…

第25篇 基于ARM A9处理器用C语言实现中断<一>

Q&#xff1a;怎样理解基于ARM A9处理器用C语言实现中断的过程呢&#xff1f; A&#xff1a;同样以一段使用C语言实现中断的主程序为例介绍&#xff0c;和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯&#xf…

Spring WebSocket 与 STOMP 协议结合实现私聊私信功能

目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接&#xff1a; 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 功能补充拓展1. 安全性和身份验证2. 异常处理3. 消息…

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…