2013-06-19 35 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