2013-06-19 38 views
2

我正在使用jsf PrimeFaces(v 3.5.0)庫。 在javascript確認框OK按鈕被選中後,以下代碼不會執行delete如果使用了javascript確認框,JSF`action`不會執行?

<p:commandLink id="deletePGLinkId" 
    action="#{PresetGroupMgmtBean.delete}" 
    onclick="return confirm('Preset Group will be removed. Are you sure you want to continue?');" 
    update=":pmForm:presetPanel :pmForm:messagePanel"> 
     <f:param value="#{item.value.ID}" name="deleteID"></f:param> 
     <h:graphicImage alt="Delete Image" style="border: none" value="./images/x.png" /> 
</p:commandLink> 

我想避免使用PrimeFaces ConfirmDialog,因爲我有這麼多的確認,這將需要時間來寫每一個ConfirmDialog。 Javascript框似乎很容易,但它不起作用。

爲什麼不執行delete

+0

在Firefox 22上爲我工作,看起來更像是一個JSF錯誤,如果您刪除'confirm',您的代碼是否工作? –

+0

@landal:對不起,但這是真正的廢話。 – BalusC

+0

@Alexandre:哪個PF版?這個錯誤至少在3.5以前出現。 – BalusC

回答

3

這是PrimeFaces命令鏈接渲染器中的一個設計錯誤。看看在生成的HTML輸出接近:

onclick="return confirm('Sure?');;PrimeFaces.ab({source:'formId:linkId'});return false;" 

你現在看到了嗎? PrimeFaces.ab()誰負責提交表格將這樣從來沒有被調用!你需要編寫不同的條件:

onclick="if (!confirm('Sure?')) return false;" 

這樣的HTML最終將產生類似如下:

onclick="if (!confirm('Sure?')) return false;;PrimeFaces.ab({source:'formId:linkId'});return false;" 

這樣一來就會正常繼續PrimeFaces.ab()confirm()返回true(它將不會調用return false;聲明)。

莫哈拉使用jsf.util.chain()爲此。更換由<h:commandLink><p:commandLink>,你會看到它在生成的HTML輸出:

onclick="jsf.util.chain(this,event,'return confirm(\'Sure?\');','mojarra.jsfcljs(document.getElementById(\'formId\'),{\'formId:linkId\':\'formId:linkId\'},\'\')');return false" 

這樣您最初的構建會工作。

+0

作品,非常感謝。我實際上有這個行不行:'onclick =「if(confirm('Location will be removed。Are you sure you want to continue?')){return true;} else {return false;}」 。在你的建議之後,這是有效的:'onclick =「if(!confirm('Location will be removed。Are you sure you want to continue?')){return false;}」'。 – Danijel

+0

還有一個問題:當我選擇'OK'時,我曾經執行過塊UI'bui()':'onclick =「if(confirm('Location will be removed。Are you sure you want to continue?')){bui .show();返回true;} else {return false;}「'。似乎不再可能? – Danijel

+0

你應該不會返回true。從onclick返回可以防止調用剩餘的onclick代碼。使用這個:'onclick =「if(!confirm('Sure?'))return false; bui.show();」'。或者,把'bui.show()'放在'onstart'中。 – BalusC