【问题标题】:Showing progress indicator when clicking on link单击链接时显示进度指示器
【发布时间】:2022-05-14 01:29:33
【问题描述】:

我的页面上有一个 HTML 链接。

 <a id="myDownLoadlink" data-bind="attr: { href: uRlPath }" style="visibility: hidden">Get data file</a>

当我单击链接时,我会调用 Web API 服务并下载一些文件。我不明白如何在下载内容时显示进度条。这就是我调用 Web API 服务的方式

uRlPath("/api/GetMyData?id=" + 2
                + "&name=" + name.toString());
$('#myDownLoadlink').click();

location.href = $('#linkToDownload').attr('href');

如果我可以使用 Ajax 调用,那么显示进度条可能很容易,但在我的情况下,由于某种原因我不能这样做。请告诉我是否有任何出路。

【问题讨论】:

  • 除非您使用 Ajax,否则您无法控制页面加载。浏览器只是加载一个新页面,而旧页面被忽略/丢弃。唯一的解决方案是使用 Ajax 调用(然后您可以进行进度、转换等)。
  • @TrueBlueAussie 除了 Ajax 就没有办法了吗?应该有办法的。过去我们没有 Ajax。请检查是否可以做些什么。我真的需要它。我会非常感谢你
  • 在“过去”中,如果没有 Ajax,您也无法做到这一点。 Ajax 已经存在了很长时间。 为什么你不能使用Ajax/jQuery/Javascript?
  • @TrueBlueAussie 所以你说这是不可能的
  • 您应该询问 文件损坏,因为 错误地设置了请求或响应。 Ajax 不会无缘无故地破坏数据! :)

标签: jquery html hyperlink asp.net-web-api


【解决方案1】:

看到您有服务器访问权限,您可以尝试执行此操作。 一点解释。您应该在 iFrame 中加载下载链接。然后会开始下载,但是因为当加载的 url 是附件时浏览器不会给出 onload 回调,我们需要一个服务器解决方法。

解决方法需要您向后端发送令牌。然后,当您发回文件时,您必须使用此响应将客户端的 cookie 设置为此值。

cookie 参数应称为 downloadtoken。如果设置了此 cookie,代码将每 200 秒检查一次。仅当页面加载完成时才会设置,也就是当您进入文件时。

玩得开心。

function getCookie( name ) {
    var parts = document.cookie.split(name + "=");
    if (parts.length == 2) return parts.pop().split(";").shift();
}

function expireCookie( cName ) {
    document.cookie = 
      encodeURIComponent( cName ) +
      "=deleted; expires=" +
      new Date( 0 ).toUTCString();
}



var downloadFile = function(url,completeCallback){
    var downloadToken = new Date().getTime();
    iframe  = document.createElement('iframe');
    iframe.style.display = 'none';
    document.body.appendChild(iframe);



    iframe.src = url + '&downloadtoken=' +downloadToken;

    var checkServerFeedback = function(){
        var outcome = getCookie('downloadtoken');
        if(downloadtoken == outcome){
            expireCookie('downloadtoken');
            completeCallback();
        }
        setTimeout(checkServerFeedback,200);
    };
    setTimeout(checkServerFeedback,200);
};



/**
    Start of app code
**/
console.log('Add loader here');
downloadFile('http://fortawesome.github.io/Font-Awesome/assets/font-awesome-4.2.0.zip',function(){
    console.log('The file has been downloaded remove loader here.');
});

【讨论】:

  • 不明白我应该从服务中返回什么以及我需要发送到后端什么。如果您看到我的网址,我会发送 2 个参数。你的意思是我发送更多的东西?我将响应作为 HttpResponseMessage 发回。
  • iframe.src = url + '&downloadtoken=' +downloadToken;是将令牌发送到后端的东西,您应该在后端读取此令牌。并将其设置为 cookie。
  • 但是我从后端返回了 HttpResponseMessage,那么如何将它设置为 cookie?你有这方面的例子吗?
  • 您的后端工作方式因您的语言/框架而异。它不会是一个复制粘贴解决方案。它是 Web 开发的最基本原则之一,应该很容易在 google 上找到。
  • 很高兴我无法为您提供示例阅读我的评论,这完全取决于您的语言/框架。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2020-02-10
  • 2014-02-15
  • 2012-06-17
相关资源
最近更新 更多