HTML和JSF PrimeFaces - 为什么当onClick存在时actionListener不执行?

时间:2014-03-19 22:09:42

标签: javascript html jsf primefaces controller

我使用HTML和JSF Primefaces,对于系统的这一部分,PrimeFaces没有启用(不知道为什么),问题是:

我有一个按钮

<h:commandButton id="btnPrint"
    onclick = "switchDisabled();"
    actionListener="#{componentTrackingController.printReport()}"
    value="Print Report"
/>

onClick它的执行和运行良好(它只是禁用其他一些按钮) 但是actionListener不是。事实上,当我删除&#34; onClick&#34; action,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>    

2 个答案:

答案 0 :(得分:0)

我不熟悉jsf / PrimeFaces,但是对于这个问题:Primefaces onclick and onsuccess differences

尝试使用“oncomplete”:

<h:commandButton id="btnPrint"
    oncomplete = "switchDisabled();"
    actionListener="#{componentTrackingController.printReport()}"
    value="Print Report"
/>

来自PrimeFaces文档(3.5):

  

oncomplete :在ajax请求完成时执行的Javascript处理程序。

答案 1 :(得分:0)

根据我的评论,它会立即执行。 有几种方法可以解决这个问题,(ajax挂钩)或javascript中的setTimeout。

<h:commandButton id="btnPrint"
    onclick = "setTimeout(function(){ switchDisabled() }, 1000);"
    actionListener="#{componentTrackingController.printReport()}"
    value="Print Report"
/>

这会绑定一个时间来在1秒(1000毫秒)内调用你的switchDisabled标签 - 因此你的ajax等应该已经运行并绑定它,你会发现你可以将它改为500甚至更少,但你不希望它在你的提交被调用之前解雇它。

请参阅:http://www.w3schools.com/jsref/met_win_settimeout.asp 了解更多信息