1

在使用 MyFaces 1.1 + Tomahawk + ​​Ajax4JSF 的长期项目之后,我正在使用 Myfaces 2.0。2.0 绝对是一个巨大的进步。虽然我似乎无法让 onload javascript 工作。我把这个记在脑海里:

<script type="text/javascript">
    window.onload = function () {
        var fileDownload = document.getElementById('userManagementForm:fileDownload');
        if (fileDownload.value == 'true') {
            fileDownload.value = false;
            window.open('Download');
        }
    }                   
    </script>

但它不执行。我看了一下源代码 myfacecs JS,我注意到他们用 onload 做了一些事情。没有过多了解细节,但它似乎阻止了我覆盖 onload 事件的尝试。有没有其他方法可以解决这个问题,也许是直接调用 JSF 库?

另一个问题,关于同一主题。Ajax4JSF 有一个属性“oncomplete”,它可以让您在 Ajax 请求完成后运行一些 Javascript。MyFaces 2.0 中是否有与 f:ajax 等效的功能?想一想我没有尝试过event="oncomplete",也许它会起作用。

4

1 回答 1

4

好的,所以我想通了。

稍后在页面顶部加载脚本会被覆盖

如果我在页面末尾加载脚本,它会覆盖 onload,但它也会破坏 JSF 机制。所以更好的解决方案是使用 JSF 的 onload 东西并将脚本放在页面末尾。在深入研究 JSF 源代码后,我找到了该功能。

<script type="text/javascript">
        myfaces._impl.core._Runtime.addOnLoad(window, checkDownloadFile);
</script>

当然,我必须定义 checkDownloadFile 来完成我在原始帖子中所做的工作。

我也想出了oncomplete。f:ajax 标记有一个 onevent 属性,该属性被调用 3 次。执行前一次,执行后两次。我相信在完成请求后立即执行一次,然后在更新页面组件后再次执行。回调函数接受一个具有状态的事件参数。所以在你的回调函数中你检查状态来决定是否做某事。状态为开始、完成和成功。所以就我而言,我有:

<f:ajax execute="userManagementForm" event="click" onevent="myEvent" render="userManagementForm:results userManagementForm:workarea userManagementForm:fileDownload" />

然后是脚本:

    function myEvent(e) {
        if (e.status == 'success') {
            checkDownloadFile();
        }
    }
于 2011-04-07T09:13:21.560 回答