h:commandLink没有触发form.submit事件

时间:2011-09-27 11:11:45

标签: jsf-2 commandlink

当我的页面被加载时,我执行以下JS脚本,用于在提交任何表单时显示弹出窗口(请稍候......)。

jQuery(function(){
  jQuery("form").submit(function(){jQuery('#wait-link').trigger('click');return true;});
});

使用 h:commandButton 标记时效果很好,但是当我使用 h:commandLink 标记时,它不起作用,因为表单是由java脚本提交的(来自jar jsf-impl.jar中的文件jsf.js,如下所示

mojarra.jsfcljs = function jsfcljs(f, pvp, t) {
  mojarra.apf(f, pvp);
  var ft = f.target;
  if (t) {
    f.target = t;
  }
  f.submit();
  f.target = ft;
  mojarra.dpf(f);
};

为了解决这个问题,我复制了 WEB-INF / resources / javax.faces / jsf.js 下的 jsf.js 文件并对其进行了修改以触发表单提交使用jQuery的方法。这很好但是:

1)我不喜欢我触及 jsf.js 文件的事实,因为它可能会在较新版本的JSF中发生变化。

2)我不喜欢我在 jsf.js 文件中使用jQuery的事实。

有没有更好的解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:2)

您应该使用jsf.ajax.*,因为它是JSF2规范的一部分。在那里你有jsf.ajax.addOnEvent(callback),它可以做你想要的。

在你的监听器中挂钩后,你可以使用尽可能多的jQuery。

<强>更新

如果你想从自己的JS中拦截它,而不需要触摸他们的东西,你可以这样做:

(function() {
    var oldjsfcljs = mojarra.jsfcljs;

    mojarra.jsfcljs = function() { 
        console.log('my stuff before');
        oldjsfcljs.apply(this, arguments);
        console.log('my stuff after');
    }
})();

答案 1 :(得分:1)

正如Bodgan建议更好的解决方案是在页面加载时执行以下代码,我不知道JS中的术语是什么,但似乎是对我的重写。

jQuery(function(){
  var oldjsfcljs = mojarra.jsfcljs; // save a pointer to the old function

  mojarra.jsfcljs = function jsfcljs(f, pvp, t) {
    jQuery(jq(f.id)).trigger('submit');
    oldjsfcljs.apply(this, arguments);
  };
});

function jq(myid) {
  return '#' + myid.replace(/(:|\.)/g, '\\$1');
}

注意:jq()方法仅用于转义表单ID中的特殊字符。

更新:上面的代码似乎有效,但如果您在表单中有参数,那么我不得不重写mojarra.jsfcljs函数,如下所示:

jQuery(function(){
  mojarra.jsfcljs = function jsfcljs(f, pvp, t) {
    mojarra.apf(f, pvp);
    var ft = f.target;
    if (t) {
      f.target = t;
    }

    // trigger the submit event manually.
    jQuery(jq(f.id)).trigger('submit');

    f.submit();
    f.target = ft;
    mojarra.dpf(f);
  };
};