在非 ajax 调用中的客户端执行 JavaScript
Execute JavaScript on client side within an non ajax call
在我的应用程序中,用户可以按下按钮来创建和下载文件。该过程需要一些时间,因此我想在此过程中阻止 UI,直到出现下载窗口。
我正在处理响应的操作方法基本上如下所示:
public void download() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
// set content disposition etc.
XSSFWorkbook wb = getWorkbook();
wb.write(externalContext.getResponseOutputStream());
facesContext.responseComplete();
}
在我的 JSF 视图中,我正在触发一个 blockUI 组件来禁用按钮,如下所示:
<p:commandButton value="Doanload" id="b"
action="#{bean.doanload()}"
ajax="false"
onclick="PF('crBui').show();" />
<p:blockUI block=":trGrid" widgetVar="crBui" trigger="b">
<p:graphicImage value="/images/loading.gif" alt="loading..."/>
</p:blockUI>
我尝试使用 PrimeFaces RequestContext 来执行一些 JavaScript 来隐藏 blockUI 组件,但这不起作用。JavaScript 不会执行:
public void download() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
// set content disposition etc.
XSSFWorkbook wb = getWorkbook();
wb.write(externalContext.getResponseOutputStream());
RequestContext.getCurrentInstance()
.execute("PF('crBui').hide();");
facesContext.responseComplete();
}
如果我使用 ajax 调用而不是非 ajax 调用,则文件下载不再有效。
任何建议如何归档我的功能?
我最终使用了PrimeFaces 'PrimeFaces.monitorDownload()'
在我看来:
<p:commandButton value="Doanload" id="b"
action="#{bean.doanload()}"
ajax="false"
onclick="PrimeFaces.monitorDownload(start, stop);" />
<script type="text/javascript">
function start() {
PF('crBui').show();
}
function stop() {
PF('crBui').hide();
}
</script>
让下载监视器工作的主要技巧是简单地在响应中设置一个 Cookie:
externalContext.addResponseCookie(
org.primefaces.util.Constants.DOWNLOAD_COOKIE,
"true",
Collections.<String, Object>emptyMap()
);
这样,UI元素将被阻止,直到出现FileDownload的窗口,这正是我最终想要实现的目标。
您应该使用p:fileDownload
而不是尝试创建一些自制解决方案。从展示中修改的示例:
.xhtml:
<script type="text/javascript">
function start() {
PF('crBui').show();
}
function stop() {
PF('crBui').hide();
}
</script>
豆:
import java.io.InputStream;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
@ManagedBean
public class FileDownloadView {
private StreamedContent file;
public FileDownloadView() {
InputStream stream = <create your stream>
file = new DefaultStreamedContent(stream, "<your mime-type>", "<your filename>");
}
public StreamedContent getFile() {
return file;
}
}
相关文章:
- 通过ajax从客户端调用C#方法来执行C#方法
- 如何在VB中先执行客户端代码,然后再执行服务器端代码
- 正在使用在服务器端或客户端执行的 Jquery 函数
- Google API 的客户端库不会执行回调
- 在非 ajax 调用中的客户端执行 JavaScript
- 突出显示与perl正则表达式匹配的HTML部分 - 在服务器端perl或客户端javascript中执行此操作
- 如何使用Javascript执行客户端web抓取
- ASPxClientGridView之后激发的客户端事件.ApplyFilter执行其工作
- 客户端自定义验证不是't正在执行
- 如何在客户端Collection增长时立即反应性地执行代码
- 在执行客户端脚本后获取文档源
- C#/ASP-web,ASP:在客户端执行复选框消息框,如果是,则运行服务器端代码
- Meteor脚本确保在其他一切之前执行(在客户端上)
- 预计算客户端 Javascript 执行
- 如何对密码执行客户端表单验证
- 如何在客户端浏览器中执行类似SQL的查询
- 瓦丁.在客户端刷新页面时执行 smth
- meta send与reload()|服务器执行与客户端执行
- 如何使用JavaScript在客户端执行动态数学函数
- 从客户端执行服务器端