我需要将Primefaces AJAX Status对话框的显示延迟X毫秒,但OmniFaces ExceptionHandler对javascript超时解决方案的反应非常糟糕。
这是我到目前为止所得到的:
<p:ajaxStatus onstart="showStatusDialog();" onsuccess="hideStatusDialog();" onerror="hideStatusDialog();"/>
<script type="text/JavaScript">
var statusDlgTimer = null;
function showStatusDialog()
{
if (statusDlgTimer === null)
{
statusDlgTimer = setTimeout("statusDialog.show()", 700);
}
}
function hideStatusDialog()
{
if (statusDlgTimer !== null)
{
clearTimeout(statusDlgTimer);
statusDialog.hide();
statusDlgTimer = null;
}
}
</script>
只要AJAX调用中没有错误发生,这就完美无缺。我正在使用OmniFaces FullAjaxExceptionHandler来处理AJAX /非AJAX异常。
我的假设是,由于在呈现错误页面时重新加载JavaScript,因此永远不会检测到对statusDlgTimer的引用!== null,但我还没有找到一个好的解决方法。
答案 0 :(得分:4)
FullAjaxExceptionHandler
基本上用错误页面的内容替换整个HTML文档树,因此<p:ajaxStatus>
&#34;迷路了#34;并且永远不会调用它的oncomplete
。您基本上也需要从错误页面的HTML源代码中调用hideStatusDialog()
。也许是这样的:
<h:outputScript target="body">hideStatusDialog();</h:outputScript>
更好的是,在全局JS文件中使用$(document).ajaxStart()
,ajaxComplete()
和ajaxError()
,而不是整个<p:ajaxStatus>
。
答案 1 :(得分:2)
在一位同事的帮助下,我实际上找到了另外两个工作,后者类似于BalusC的解决方案。