当我的页面被加载时,我执行以下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的事实。
有没有更好的解决方案来解决这个问题?
答案 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);
};
};