Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Tapestry5中同时返回页面和流?_Javascript_Tapestry - Fatal编程技术网

Javascript 如何在Tapestry5中同时返回页面和流?

Javascript 如何在Tapestry5中同时返回页面和流?,javascript,tapestry,Javascript,Tapestry,我正在使用Tapestry 5 framework/javascript开发一个web应用程序项目。此应用程序只接受少量输入并返回pdf文件 我得到了一个新的要求,即当用户单击表单提交按钮时禁用它。在生成报告之前,该按钮应保持禁用状态。我计划编写javascript来禁用submit按钮。但在返回pdf文件时,如何重新启用按钮 我已经阅读了Tapestry文档。根据单据,有效的返回类型为“无、字符串、类、页、链接、流”。如果我返回一个页面,我可以重新启用提交按钮。如果我返回一个流,用户将能够下载

我正在使用Tapestry 5 framework/javascript开发一个web应用程序项目。此应用程序只接受少量输入并返回pdf文件

我得到了一个新的要求,即当用户单击表单提交按钮时禁用它。在生成报告之前,该按钮应保持禁用状态。我计划编写javascript来禁用submit按钮。但在返回pdf文件时,如何重新启用按钮

我已经阅读了Tapestry文档。根据单据,有效的返回类型为“无、字符串、类、页、链接、流”。如果我返回一个页面,我可以重新启用提交按钮。如果我返回一个流,用户将能够下载pdf。但我想两者兼而有之。是否有任何方法可以返回多个对象(可能是另一个对象中的一个对象)。(或者)有人能提出解决这个问题的办法吗


谢谢

我猜您的工作流是表单提交处理程序指向一个页面,该页面在onActivate方法中返回一个流(pdf)。我还猜您应该设置响应头,以便下载文件而不是通过浏览器打开文件

如果执行此操作,浏览器通常会创建一个“另存文件为”对话框,并且当前页面永远不会被导航离开(不会刷新)。您将永远不会收到任何回调,告诉您文件已下载

因此,使用上述工作流,您将无法重新启用按钮作为下载启动或完成的响应。这是因为流响应只是任意二进制数据,而不是浏览器能够执行的html/javascript。不能返回html/javascript+二进制文件数据的混合响应

您所能达到的最佳效果是禁用按钮一段时间,然后重新启用它以防止双击。如果您不想给应用程序增加太多的复杂性,我推荐这种方法

但是,您可以更改工作流,在表单提交和下载之间插入额外的请求响应

i、 e.不直接指向返回流的页面,您可以重新加载当前页面,然后请求下载:

  • 表单提交将pdf生成参数保存到会话并返回响应(重新加载页面)
  • 新页面将与元刷新或脚本指令一起加载,以重定向到下载url
  • 调用下载url将返回流响应以及正确的标题集,以便用户看到“将文件另存为”对话框
  • 可能还有其他方法可以实现您所需的功能,但是模式是相同的,在表单提交和文件下载之间需要额外的请求响应


    这不是真正的tapestry问题,无论框架如何,您都会遇到相同的问题(除非框架做了一些特殊的事情来处理这种情况)。这就是http/浏览器技术的工作原理。

    非常感谢您的及时和详细的回复。我将尝试第二种方法(使用meta refresh标记)。但是我喜欢第一种方法,它可以很容易地解决双击问题。很乐意帮忙。如果有效,请打勾。这就是使用stackoverflow的方法。