我有一个按钮,它将 window.location 设置为 php 文件,该文件生成一个提要,然后下载该提要。但是,由于文件大小因放入源中的数据而异,因此有时从单击按钮到弹出文件对话框可能需要一段时间。

我希望能够做的是单击按钮并显示loading.gif,直到对话框/文件完成。

任何想法都会很酷!

干杯

有帮助吗?

解决方案

只需让RSS生成脚本显示您想要的图像(输出图像的HTML,然后刷新输出缓冲区并开始生成数据)。在数据生成结束时:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

这就是全部。

其他提示

我不确定为什么你需要检查文件的大小?如果你使用ajax动态地执行get / post,并且你正在做的就是在发生这种情况时尝试显示加载图标,那么抛出异步活动指示器就相当简单了。例如,使用jquery:

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

上面的代码设置一个id为“loading”的DOM对象。在启动和停止任何异步请求时显示和隐藏。 .load(url)将url的内容加载到div #feeds中。如果您使用php设置content-disposition:attachment标头,它将自动启动文件下载窗口,即使它已异步加载到div中。这也是可能的,当然没有jquery,只有一堆浏览器兼容性javascript,它不像简单订阅ajaxStart和ajaxStop事件那样容易显示和隐藏你的加载img。

约什

在设置window.location之前,你可以用你的gif

显示一个隐藏的div

这是旧学校,但这可以通过服务器推送轻松完成

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

只需调整您要发送的数据的内容类型即可。 $ separator可以是任何值,只要它不会出现在正在发送的数据中。

我过去使用过的方法是这样的......

  • 将 window.location 设置为加载页面,并在查询字符串中传递目标页面。加载页面应显示动画 gif 或您喜欢的任何内容,以证明处理正在进行。加载页面应立即重定向到查询字符串(以及任何其他适用的查询字符串参数)中传递的目标页面。

编辑:加载页面应使用 javascript 重定向到目标页面(将 window.location 设置为查询字符串中提供的 URL)。这是很重要的一点,因为如果您在服务器端重定向,则不会显示加载页面。

编辑2:如果您的加载页面是 php 文件,您可以检查要下载的文件的大小并向用户显示估计的下载时间(以及动画“加载”gif),或者诸如此类。

  • 目标页面应在启用缓冲的情况下进行渲染(在渲染任何内容之前调用 ob_start())。启用缓冲后,在呈现整个页面之前不会向浏览器发送任何内容。同时,您的第 1 步的加载页面将继续显示。

您必须使用AJAX与服务器通信才能发现正在下载的文件的确切大小。然后你有一些东西需要测试。无法从客户端知道预期有效负载的大小。

您是否可以使用 iframe 加载 feed,然后使用间隔检查 iframe/文档的就绪状态?所以这个过程是:

  • 加载一个窗口,其中包含宽度和高度均为 100% 的 iframe 以及 iframe 上的 loading.gif。
  • 设置一个计时器检查 iframe.contentWindow.document.readyState 属性
  • 一旦readyState ==完成,显示保存文件对话框。

一个缺点是,对于大多数浏览器来说,PHP 文件需要位于同一域中(在 IE 上,您只需检查 iframe 的 readyState 属性)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top