使用 jQuery 和 iFrame 下载大文件 - 需要文件就绪事件,以便我可以隐藏加载 gif

2023-12-26

我正在使用 jQuery 下载一些需要一些时间才能创建的文件,因此我显示了一个加载 gif 来告诉用户要有耐心。但问题是,加载 gif 当前显示和隐藏都在一瞬间。

有没有办法让我在下载完成后隐藏加载 gif,并且用户在屏幕上弹出“保存文件”窗口?

HTML

<tr data-report_id="5">
    <td>
        <input type="button" id="donwload"></input>
        <img class="loading" src="/Images/Loading.gif"/>
        <iframe id="hiddenDownloader"></iframe>
    <td>
</tr>

JS

var reportId = $(this).closest("tr").attr("data-report_id");
var url = "/Reports/Download?reportId=" + reportId;

var hiddenIFrameId = 'hiddenDownloader';
var iframe = document.getElementById(hiddenIFrameId);
if (iframe === null) {
    iframe = document.createElement('iframe');
    iframe.id = hiddenIFrameId;
    iframe.style.display = 'none';
    document.body.appendChild(iframe);
}
iframe.src = url;
$(".loading").hide();

我最终使用的解决方案

<script>
$("#download").on("CLICK", function () {
    var button = $(this);
    button.siblings(".loading").show();

    var rowNumber = GetReportId();
    var url = GetUrl();
    button.after('<iframe style="display:none;" src="' + url + '" onload="loadComplete(' + rowNumber + ')" />');
}

function loadComplete(rowNumber) {
    var row = $("tr[data-row_number=" + rowNumber + "]");
    row.find(".loading").hide();
}
</script>

<tr data-report_id="5">
    <td>
        <input type="button" id="download"></input>
        <img class="loading" src="/Images/Loading.gif" style="display:none;"/>
    <td>
</tr>

UPDATE

我在 Chrome 中使用此方法时遇到问题,因此我更改了所有 jquery 代码以查找下载完成处理时后端代码设置的 cookie。当jquery检测到cookie时,它会关闭加载gif和whiteout。

检测浏览器何时接收文件下载 https://stackoverflow.com/questions/1106377/detect-when-browser-receives-file-download


iframe onload事件调用您的代码:

var reportId = $(this).closest("tr").attr("data-report_id");
var url = "/Reports/Download?reportId=" + reportId;

var hiddenIFrameId = 'hiddenDownloader';
var iframe = document.getElementById(hiddenIFrameId);
if (iframe === null) {
    iframe = document.createElement('iframe');
    iframe.id = hiddenIFrameId;
    iframe.style.display = 'none';
    iframe.onload = function() {
        $(".loading").hide();
    };
    document.body.appendChild(iframe);
}

iframe.src = url;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 jQuery 和 iFrame 下载大文件 - 需要文件就绪事件,以便我可以隐藏加载 gif 的相关文章

随机推荐

  • 无法在 Angular2 中设置未定义 ckeditor 的属性“dir”

    每当我尝试加载 Ckeditor 时 都会收到 无法设置未定义的属性 dir 我正在使用 angular cli 来开发我的 Angular2 应用程序 CKEditor版本 4 4 7 当我使用 ngserve 运行应用程序时 此问题不会
  • 使用 JAX-RS 进行文件上传

    我尝试将文件从 JavaScript 客户端上传到 JAX RS Java 服务器 我在我的服务器上使用以下 REST 上传功能 POST Produces application json UploadDto upload Context
  • 从字符串中删除所有出现的 \

    我正在尝试使用 JSON 从服务器获取对象数组 服务器向我发送以下字符串 DealComment null DealVotes DealId 1 CompanyId 1 StartDate 2012 12 13T00 00 00 EndDa
  • 在vba中连接两个数组?

    我如何将这些数组与结果结合起来 2 4 5 3 7 6 array1 Array 4 5 3 7 6 array2 Array 2 你有可能Join 并连接两个数组 然后Split 结果返回到一个新数组 array3 Split Join
  • 防止 Visual Studio Code 中的自动分号

    我正在使用 Visual Studio 代码 我不想在 CSS 属性后面加上自动分号 但 VS Code 给了我一个我不喜欢的自动完成选项 如何停止 CSS 属性末尾的自动完成分号 设置 gt 扩展 gt CSS 取消选中带有分号的完整属性
  • “无法加载包‘regex-posix’……未知符号‘regerror’”

    对于一个新项目 我一直在尝试构建threepenny gui包 我过去已经做过很多次了 没有任何问题 然而这一次 我遇到了一条不寻常的错误消息 gt stack build threepenny gui gt configure three
  • ODEi​​nt:任意精度的自适应积分

    ODEi nt 是否可以使用adaptive具有任意精度算术的积分例程 例如 我想将 Boost 多精度库与集成自适应 函数和受控步进器一起使用 ODEi nt 文档提供了对integrat const 使用任意精度算术的示例 但我无法修改
  • Windows Phone 8.1 上使用 .resx 资源时出现 MissingManifestResourceException

    我正在开发一个也针对 Android Xamarin 的 Windows Phone 8 1 应用程序 正如我在 PCL 上添加字符串资源 resx 并在启动器项目中引用它们以在我的视图中使用它一样 这一切在 WP 8 1 silverli
  • MySQL 中的字符串连接

    我正在使用 MySQL 和 MySQL Workbench 5 2 CE 当我尝试连接两列时 last name and first name 它不起作用 select first name last name as Name from t
  • + 运算符什么时候比 StringBuilder 更快? [复制]

    这个问题在这里已经有答案了 过去 我一直相信你应该使用StringBuilder and append String 当用变量构建字符串时 而不是string split i 在什么情况下这是准确的 我问是因为通常情况下 如果我要写以下内容
  • 直接从无窗口 Linux 终端启动 OpenGL 应用程序

    究竟如何让 OpenGL 应用程序直接从终端 Ubuntu Server 9 04 全屏运行 我在我的服务器上开发了一个用于视觉诊断的应用程序 但是 我不完全确定让它在无窗口环境中运行的最佳方法 理想情况下 我会运行我的程序 visuald
  • 在 TFS 中的解决方案之间共享代码 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有几个不同的应用程序 我需要在它们之间共享代码以减少维护 我尝试在 stackoverflow 和 web 上阅读大量
  • 提取两个字符串之间不同的字符

    我用过adist计算两个字符串之间不同的字符数 a lt Happy day b lt Tappy Pay adist a b result 2 现在我想提取那些不同的字符 在我的示例中 我想获取字符串 Hd or TP 没关系 我试着看一
  • 通过 Gmail 发送电子邮件时出现错误

    在这里 我尝试使用 gmail 发送邮件 但出现以下错误 javax mail AuthenticationFailedException 534 5 7 14
  • 在 Laravel 4 中显示自定义验证的错误消息

    我通过创建一个类创建了一个自定义错误函数
  • 未定义参数的性能损失

    我经常在函数中使用可选参数 但一些测试显示它们在 Firefox 和 safari 中性能受到巨大影响 70 95 奇怪的是 如果我传入文字值不明确的那么就没有处罚 这里可能发生什么 我不会认为这是一个作用域链问题 因为它们本质上是函数的本
  • 正则表达式也匹配重音字符

    我有以下 PHP 代码 search foo bar que search string str replace search text This is my foo text with qu and other accented char
  • 如何以只读方式打开 Eclipse 项目?

    有谁知道有没有办法在 Eclipse 中以只读模式打开项目 如果打开了很多类似的项目 很容易对错误的项目进行更改 当您从前一个项目创建另一个实例时 将项目置于只读模式非常有用 因此 您复制旧项目中的所有文件 然后在新实例中进行更改 错误地编
  • Primefaces 数据表的列标题中的工具提示

    在基于的应用程序中JSF 2 1 and Primefaces 6 0 我正在尝试向数据表的标题添加工具提示 在我当前的解决方案中 仅当将鼠标精确指向文本标题 Projekttyp 时才会出现工具提示 我需要每当鼠标指针位于列标题中时就显示
  • 使用 jQuery 和 iFrame 下载大文件 - 需要文件就绪事件,以便我可以隐藏加载 gif

    我正在使用 jQuery 下载一些需要一些时间才能创建的文件 因此我显示了一个加载 gif 来告诉用户要有耐心 但问题是 加载 gif 当前显示和隐藏都在一瞬间 有没有办法让我在下载完成后隐藏加载 gif 并且用户在屏幕上弹出 保存文件 窗