Primefaces p:当onclick事件返回true时,menuitem不会触发事件

Rad*_*FID 1 javascript jsf primefaces jsf-2

我正在使用PrimeFaces p:menuitem组件执行删除.为了添加确认步骤,我使用了onclick显示JavaScript确认对话框的事件.在我的代码下面:

<p:menuitem icon="fa fa-fw fa-remove"
    title="#{message.global_remove}"
    value="#{message.global_remove}"
    actionListener="#{componentListMB.delete(cp.id)}"
    onclick="return confirm('#{message.component_list_confirm_deletion}')"
    update=":component_list" />
Run Code Online (Sandbox Code Playgroud)

当用户确认删除时,不会触发该操作,而是#在URL的末尾添加a .

为什么在p:commandButton一切正常的情况下不会触发事件?


我正在使用:

  • JSF 2.1.7
  • Primefaces 6.0

acm*_*acm 5

当用户确认删除时,不会触发该操作,而是#在URL的末尾添加a .

Primefaces实际上是将您p:menuitemaHTML标记呈现为HTML标记,使用onclick该元素的事件来执行自己的Ajax请求.例如

onclick="PrimeFaces.ab({...});return false;"
Run Code Online (Sandbox Code Playgroud)

请注意,他们在元素return false;的末尾添加了一个,因此不会出现在URL中.which prevents the default browser behavioura#

添加confirm函数时,它将放置在onclick元素的开头,如下所示:

onclick="return confirm('confirm?');PrimeFaces.ab({...});return false;"
Run Code Online (Sandbox Code Playgroud)

如果您不确认,则不会#出现URL,因为阻止了默认行为.如果您确认它将出现.但是,因为您return首先调用语句,所以Ajax操作永远不会被执行.

你可以达到预期的行为改变你p:menuitemonclick活动如下:

onclick="if (!confirm('#{message.component_list_confirm_deletion}')) return false;"
Run Code Online (Sandbox Code Playgroud)

为什么在p:commandButton一切正常的情况下不会触发事件?

Primefaces以不同的方式对待p:commandButton.它包装用户onclick和Primefaces Ajax函数,将它们中的每一个放在一个单独的函数中,并将它们发送到Primefaces#bcn按顺序执行函数.返回的第一个false停止处理剩余的函数.的onclick在生成的HTML将如下:

onclick="PrimeFaces.bcn(this, event, [function(event){return confirm('confirm?')},function(event){PrimeFaces.ab({...});return false;}]);"
Run Code Online (Sandbox Code Playgroud)