在使用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();
}
}