JSF 2.0 javascript onload / oncomplete

时间:2011-04-06 17:01:46

标签: javascript jsf onload myfaces

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

1 个答案:

答案 0 :(得分:4)

好的,所以我想出来了。

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

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

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

当然,我必须定义checkDownloadFile,它可以完成原始帖子中的内容。

我也想到了oncomplete。 f:ajax标签有一个被调用3次的onevent属性。执行前一次和之后两次。我相信在完成请求后立即,然后在更新页面组件后再次。回调函数采用具有状态的事件参数。因此,在您的回调函数中,您可以检查状态以决定是否执行某些操作。状态是开始,完成和成功。所以对于我的情况我有:

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

然后是剧本:

    function myEvent(e) {
        if (e.status == 'success') {
            checkDownloadFile();
        }
    }