JSF 2.0 javascript onload/oncomplete



在使用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",也许它会起作用。

好了,我想明白了。

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

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

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

当然,我还需要定义checkDownloadFile来做我在原始文章中做的事情。

我也为oncomplete找到了答案。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();
        }
    }

相关内容

  • 没有找到相关文章

最新更新