在使用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”,也许它会起作用。
答案 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();
}
}