5

我需要将 Primefaces AJAX 状态对话框的显示延迟 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,但我还没有找到一个好的解决方法。

4

2 回答 2

4

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

<h:outputScript target="body">hideStatusDialog();</h:outputScript>

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

于 2013-09-20T12:41:30.890 回答
2

在一位同事的帮助下,我实际上找到了另外两个解决方法,后者类似于 BalusC 的解决方案。

  1. 通过设置变量 'var displaydialog = false' onload 并将其设置为 true,然后再设置对话框超时。在实际显示变量之前,我在中间函数中检查了相同的变量。有点困难和hackish,但它奏效了。
  2. 我的 JavaScript 包含在我的 Facelets 模板中,错误页面也使用了该模板。通过创建另一个模板,我能够使用 ui:insert 来避免将 JavaScript 完全插入错误页面,并且不会显示对话框。我选择了这个解决方案。
于 2013-09-20T12:59:24.000 回答