2009-09-09 79 views
2

我有一个按钮,它将window.location设置为一个php文件,该文件生成一个feed,然后下载。但是,由于文件中的数据大小各不相同,因此从点击按钮到弹出文件对话框有时需要一段时间。检测文件是否已被提供给浏览器?.. kinda

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

任何想法都会很酷!

干杯

+1

问题是操作是异步的。当我不应该关注我的未婚妻时,让我做一些测试并回复你。 – 2009-09-12 07:21:02

+0

您是否有样本页面我可以查看一下,这样我可以更好地了解您要做什么? – 2009-09-15 08:25:00

+0

通过“下载”你的意思是提供给用户的实际下载/保存对话框? – 2009-09-17 16:29:14

回答

0

只需制作RSS生成脚本显示图像(输出图像的HTML,然后刷新输出缓冲区并启动数据生成)。在数据生成结束时,请执行以下操作:

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

就是这样。

+0

此外,请注意“某些版本的Microsoft Internet Explorer只有在收到256个字节的输出后才会开始显示页面,因此您可能需要在刷新之前发送额外的空格以使这些浏览器显示该页面。” – 2009-09-18 12:34:11

1

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

+0

我们如何知道何时再次隐藏它? – Serxipc 2009-09-09 16:25:20

+0

隐藏在window.location之后我会想象。 – CodeMonkey1313 2009-09-10 00:43:30

+0

是的...这不会工作 – 2009-09-17 14:43:53

0

你将不得不使用AJAX来与服务器通信,以发现你正在下载的文件的确切大小显示隐藏的股利。然后你有什么要测试。无法仅从客户端获知预期有效负载的大小。

+0

请参阅贾斯汀约翰逊的评论。该文件是异步的,因此无法确定文件大小,只能通过ajax处理一次文件,然后再次不是真正的选项,因为有时该文件可能会对数据库造成巨大负担。 :) – Joel 2009-09-14 09:11:45

+0

即使您有大小,那么如何检测何时弹出对话框/文件已完成。 – Joel 2009-09-14 09:12:24

+0

您可以使用文档模糊事件来公平地指示对话何时出现,并重点说明用户何时返回页面。虽然这并非万无一失。 – Fenton 2009-09-14 14:11:27

0

是否有可能使用iframe加载提要,然后使用间隔检查iframe /文档的readyState?因此,该过程将是:

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

一个缺点是,对于大多数浏览器PHP文件需要在同一个域(在IE上,你可以检查iframe的readyState属性)。

5

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

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

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

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

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

乔希

1

这是老同学,但是可以使用服务器推送很容易做到

<?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可以是任何值,只要它不出现在正在发送的数据中。

1

我已经在过去使用的是这样的一种方法,...

  • 设置窗口。位置加载到加载页面,并在查询字符串中传递目标页面。加载页面应该显示一个动画gif或者任何你想要证明处理正在发生的东西。加载页面应立即重定向到在查询字符串中传递的目标页面(以及任何其他可用的查询字符串参数)。

编辑:加载页面应该重定向到目标页面使用JavaScript(设置window.location到查询字符串中提供的URL)。这是一个重要的观点,因为如果您在服务器端重定向,加载页面将不会显示。编辑2:如果你的加载页面是一个php文件,你可以检查下载的文件的大小,并显示预计的下载时间给用户(以及动画“加载”gif),或者什么都不是。

  • 目标页面应该在启用缓冲的情况下呈现(在呈现任何内容之前调用ob_start())。启用缓冲后,在整个页面呈现之前,浏览器都不会发送任何内容。同时,步骤1中的加载页面将继续显示。
+0

是的,这应该工作,并且很容易实现。 +1 – 2009-09-17 19:06:21