1

当我的页面被加载时,我执行以下 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 的事实。

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

4

2 回答 2

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');
    }
})();
于 2011-09-27T12:58:30.640 回答
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);
  };
};
于 2011-09-27T14:47:01.240 回答