在执行某些服务器端Java代码并且客户端在不使用Ajax的情况下从Web服务器获取HTTP响应时,有没有办法让动画gif图像消失?
我使用以下Struts2提交按钮:
<s:submit value="show Data" onclick="myJsFunction()" />
显示动画gif图像的方法:
function myJsFunction(){
$("#containerWithGifImage").fadeIn("fast");
}
消除动画gif图像的方法(但我不知道,如何在没有Ajax的情况下调用它):
function myJsFunction2(){
$("#containerWithGifImage").fadeOut("fast");
}
现在出现了gif,但是在执行了Web服务器上的java代码之后它并没有消失。
答案 0 :(得分:0)
您的问题(此问题和the other one)都是XY problem。
的示例在寻找特定技术,技术或黑客之前,请先明确定义您的目标:
- 下载文件而不转移到其他页面;
- 同时,显示一个指标(进度条,动画gif,叠加等......);
- 下载文件后,隐藏指示符。
醇>
将您的触发器绑定到javascript函数as described here:
<a href="javascript:myJsFunction();"> download </a>
在你的Javascript函数中:显示指标,启动计时器以检查下载是否结束(然后隐藏指标),然后下载文件:
function myJsFunction(){
$("#containerWithGifImage").fadeIn("fast"); // Show the indicator
setInterval(function(){
$.ajax({
url : "/isDownloadFinished.action", type : "GET",
success : function(data,textStatus,jqXHR) {
$("#containerWithGifImage").fadeOut("fast"); // Hide the indicator
},error : function(jqXHR, textStatus, errorThrown) {
console.log("Download is still in progress, do nothing...");
}
});
}, 1000); // Check every second if download has finished
window.location='/download.action'; // Start the download
}
Download.action 必须在会话中添加一个指示下载已开始的属性,并在结束时进行更新。
由于使用stream
结果,您将控制对浏览器的响应(因此在完成后无法运行代码),您可以直接写入响应,然后返回{{1} },as described here:
NONE
您还可以让浏览器通过指定public class Download extends ActionSupport implements SessionAware, ServletResponseAware {
@Setter private Map session;
@Setter private HttpServletResponse response;
public String execute(){
ServletOutputStream os = null;
try {
session.put("DOWNLOAD_STATUS","active");
response.setContentType("myContentType");
response.addHeader("Content-Disposition", "attachment; filename=\"foo.bar\"");
os = response.getOutputStream();
IOUtils.copy(getMyFileInputStreamSomeHow(), os);
} finally {
IOUtils.closeQuietly(os);
session.put("DOWNLOAD_STATUS","finished");
}
return NONE;
}
}
响应标头(Content-Length
)as described here为您绘制进度条,您还可以在其中看到类似的机制来阻止并发下载。
在 IsDownloadFinished.action 中,您需要检查会话属性。我不存在或与完成不同,这意味着下载尚未开始,或仍在进行中,因此什么都不做。否则,返回一个成功的httpheader,它将使您的jQuery $ .ajax函数运行response.setHeader("Content-Length", 1337);
回调。您可以使用success:
或httpHeader
,as described here:
json
这个问题有不同的解决方案,我向你展示了最简单的解决方案。
更优雅和复杂的解决方案将涉及长期请求和Comet techniques(读取:WebSocket),但我想您可以从此启动示例开始使用轮询计时器,根据您的需求进行自定义,当对这个论点更加满意时,最终会发展它。