我正在使用HTML和JSF Primefaces,对于系统的这一部分,Primefaces没有启用(不知道为什么),问题是:
我有一个按钮
<h:commandButton id="btnPrint"
onclick = "switchDisabled();"
actionListener="#{componentTrackingController.printReport()}"
value="Print Report"
/>
onClick的执行和工作良好(它只是禁用一些其他按钮)但actionListener不是。事实是,当我删除"onClick"行时,actionsListener工作得很好。
我的JavaScript代码很简单(但我认为问题不在这里)
<script type="text/javascript">
function switchDisabled(){
askDisabled(document.getElementById('mainForm:cboURdependences'));
askDisabled(document.getElementById('mainForm:btnPrint'));
askDisabled(document.getElementById('mainForm:btnCloseReport'));
}
function askDisabled(elem){
if (elem.disabled != true){
elem.disabled = true;
}else{
elem.disabled = false;
}
}
</script>
根据我的评论,它正在立即这样做。有几种方法可以解决这个问题,(ajax钩子)或javascript中的setTimeout。
<h:commandButton id="btnPrint"
onclick = "setTimeout(function(){ switchDisabled() }, 1000);"
actionListener="#{componentTrackingController.printReport()}"
value="Print Report"
/>
这绑定了一个超时调用你的switchDisabled标签在1秒(1000ms) -因此你的ajax等应该已经运行,它绑定它,你会发现你可能会把它改变为500或更少,但你不希望它在你的提交被调用之前触发它。
参考:http://www.w3schools.com/jsref/met_win_settimeout.asp查看更多信息
我不熟悉jsf/PrimeFaces,但根据这个问题:PrimeFaces的onclick和onsuccess差异
尝试使用"oncomplete":
<h:commandButton id="btnPrint"
oncomplete = "switchDisabled();"
actionListener="#{componentTrackingController.printReport()}"
value="Print Report"
/>
摘自PrimeFaces文档(3.5):
oncomplete: ajax请求完成时执行的Javascript处理程序。