我需要将Primefaces AJAX Status对话框的显示延迟X毫秒

mat*_*tsa 5 jsf primefaces omnifaces

我需要将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>
Run Code Online (Sandbox Code Playgroud)

只要AJAX调用中没有错误发生,这就完美地工作.我正在使用OmniFaces FullAjaxExceptionHandler来处理AJAX /非AJAX异常.

我的假设是,因为在呈现错误页面时重新加载JavaScript,所以从未检测到对statusDlgTimer的引用是!== null,但我还没有找到一个好的解决方法.

Bal*_*usC 4

FullAjaxExceptionHandler基本上用错误页面的内容替换整个 HTML 文档树,因此“<p:ajaxStatus>迷失”并且oncomplete永远不会调用它。您基本上还需要hideStatusDialog()从错误页面的 HTML 源内部调用。也许是这样的:

<h:outputScript target="body">hideStatusDialog();</h:outputScript>
Run Code Online (Sandbox Code Playgroud)

更好的是,在全局 JS 文件中使用$(document).ajaxStart(),ajaxComplete()ajaxError()而不是整个<p:ajaxStatus>.