【问题标题】:jQuery event.preventDefault() does not work on h:commandLinkjQuery event.preventDefault() 在 h:commandLink 上不起作用
【发布时间】:2012-12-17 17:48:45
【问题描述】:

当用户单击取消链接时,我想将 jQuery 对话框显示为conformation-popup。 (“你真的要取消吗?”)

jQuery(#{rich:element('cancel')}).click(function(event) {
    var dialog = jQuery(#{rich:element('cancelDialog')});
    if (dialog.is(':visible')) {
        jQuery(#{rich:element('cancelDialog')}).dialog('close');
    }
    else {
        jQuery(#{rich:element('cancelDialog')}).dialog('open');
        event.preventDefault();
    }
});
<h:commandLink action="cancel" immediate="true" id="cancel" value="cancel" />

对话框正在打开,但事件不会被取消(--> 取消事件会继续进行)。当我改用 h:commandButton 时,它可以工作,但客户希望将其作为链接。

我使用 JSF 2.0 (MyFaces)、jQuery 1.6.1、Spring Webflow 2.3.0.RELEASE 和 JSF Framework Richfaces 4.0.0.FINAL。有谁知道这些框架的解决方案?我不能使用其他框架。

谢谢你, 帕特里克

【问题讨论】:

  • 是一个错误被抛出。检查您的控制台。
  • 为什么event.preventDefault() 只需要“打开”而不是“关闭”?
  • 没有抛出错误(根据 Chrome 控制台)。 event.preventDefault() 仅在“打开”时是必需的,因为用户单击取消链接并显示对话框。在这种情况下,应该取消活动。但这没关系。基本上你可以忽略这个 if - else 东西。如果这个 event.preventDefault() 单独存在,它也不起作用。
  • event.preventDefault() 试图阻止的原生操作是什么。
  • 我不太确定我是否明白你的意思(我对 jQuery 和 JavaScript 完全陌生),但应该防止点击事件。正如我所说,当我使用 commandButton 时,它可以工作。根据 jQuery-Doc,调用此方法会取消默认事件(引用:“如果调用此方法,则不会触发事件的默认操作。”)。所以我认为这将是导航。

标签: jquery jsf richfaces spring-webflow


【解决方案1】:

在函数中使用return false而不是event.preventDefault()

了解更多区别:The difference between ‘return false;’ and ‘e.preventDefault();’

已编辑

既然还是不行,我建议用onmousedown事件代替click,功能一样。 JSF h:commandLink and onclick events

【讨论】:

  • 我也试过了,但也没有用。我也尝试了很多我在互联网上找到的东西(例如 event.stopPropagation()),但没有任何效果。
  • @Patrick,只是为了测试,尝试使用此内容创建一个 JS 函数并调用 commandLink 的“onclick”属性,而不是通过 jQuery 绑定。我不认为有区别,但我的想法不多了:)
  • 好吧,我的最后一个想法是使用 onmousedown 事件而不是单击,具有相同的功能。 JSF h:commandLink and onclick events
  • Mh.现在我只是 onclick="return false;"在 commandLink 上,它起作用了。但我看不出有什么区别。当我在 event.preventDefault() / return false 之前发出警报时;在我的 if-else 中,它出现了。所以应该执行该行。
  • 唯一有意义的是.dialog() 插件(或其他)附加了它自己的点击事件处理程序?
【解决方案2】:

我会这样做:

jQuery(#{rich:element('cancel')}).bind('click', function(event) {
    event.preventDefault();
    var dialog = jQuery(#{rich:element('cancelDialog')});
    var action = (dialog.is(':visible')) ? 'close' : 'open';
    dialog.dialog(action);
});

其实我不会,因为 (a) 我会使用 jQuery 1.7+ 并且 (b) 我不会使用 JSF/Spring。

【讨论】:

  • 嗯,那就不简单了。
猜你喜欢
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多