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

时间:2016-09-08 09:20:26

标签: javascript jsf jsf-2 primefaces

我使用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" />

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

为什么在p:commandButton期间没有触发事件一切正常?

我正在使用:

  • JSF 2.1.7
  • Primefaces 6.0

5 个答案:

答案 0 :(得分:5)

  

当用户确认删除时,不会触发操作,而是会在网址末尾添加#

Primefaces实际上是将p:menuitem呈现为a HTML标记,使用元素的onclick事件来执行自己的Ajax请求。 E.g。

onclick="PrimeFaces.ab({...});return false;"

请注意,他们在return false;元素的末尾which prevents the default browser behaviour添加了a,因此网址中不会显示#

添加confirm函数时,它位于onclick元素的开头,如下所示:

onclick="return confirm('confirm?');PrimeFaces.ab({...});return false;"

如果您没有确认,则由于默认行为被阻止,因此网址中不会显示#。如果您确认它将出现。但是,由于您首先调用return语句,因此Ajax操作永远不会执行。

您可以按照以下方式更改p:menuitem onclick事件的预期行为:

onclick="if (!confirm('#{message.component_list_confirm_deletion}')) return false;"
  

为什么在p:commandButton期间没有触发事件一切正常?

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

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

答案 1 :(得分:2)

您可以使用<p:confirm>内的<p:menuitem>进行确认。

编辑:只需在确认()之前移除return,所有内容也应按预期工作。

答案 2 :(得分:0)

您可以尝试将<p:menuitem> actionListener委派给<p:commandButton>。然后在<p:confirm>内嵌套<p:commandButton>以获取确认消息。然后通过onclick的{​​{1}}属性触发您的命令按钮。

答案 3 :(得分:0)

  

使用confirm()而不返回不能解决问题。相反,即使取消确认对话框,它也会提交表单。我想知道在使用

之前是否有使用onclick事件的解决方法

您应在确认对话框中的取消按钮上重置值,否则您将在页面加载时获取新数据。

答案 4 :(得分:0)

使用p:confirmDialog:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

 UIApplicationState state = [application applicationState];
 if (state == UIApplicationStateActive)
  {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"MyApp"
                                                    message:notification.alertBody
                                                   delegate:self cancelButtonTitle:@"OK"
                                          otherButtonTitles:@"SNOOZE",@"DISMISS",nil];
    alert.delegate = self;
    [alert show];

 [[UIApplication sharedApplication] cancelLocalNotification:notification];
 }
}