我用jsf1.1,commandlink的onclick属性无效,怎么调用我的js函数啊?

fourfire 2008-04-11
UIComponent footer = this.getFacet("footer");
String clientId = this.getClientId(context);
if (footer != null) {
List cs = footer.getChildren();
for (Iterator iterator = cs.iterator(); iterator.hasNext();) {
UIComponent o = (UIComponent) iterator.next();
System.out.println(o.getClass());
if(o instanceof HtmlCommandLink)
{
((HtmlCommandLink)o).setOnclick("alert(''),return false;");
}
}
}
我用这个没作用
ltian 2008-04-11
用JSF作一个通用的翻页子页面没那么麻烦,估计你是走错路了。
ltian 2008-04-11
看样子你好像在后台Java代码中动态地为HtmlCommandLink设置了js脚本。那么你可以在FireFox察看源码功能中看看生成的网页中你的js脚本被render了。因为你的描述过于简单,所以无法判断你的问题出在什么地方。很少需要在后台用java为JSF组件动态加入JS,这样网页功能不直观,你应该在JSF文件为组件直接写JS代码。如果需要处理某些变量,通过绑定表达式把变量引入到JS脚本中。
ltian 2008-04-11
fourfire 写道
UIComponent footer = this.getFacet("footer");
String clientId = this.getClientId(context);
if (footer != null) {
List cs = footer.getChildren();
for (Iterator iterator = cs.iterator(); iterator.hasNext();) {
UIComponent o = (UIComponent) iterator.next();
System.out.println(o.getClass());
if(o instanceof HtmlCommandLink)
{
((HtmlCommandLink)o).setOnclick("alert(''),return false;");
}
}
}
我用这个没作用

在JSF1.1中,要注意的一个问题是:当JSF网页第一次被请求时,JSF只按照标记的内容来render html,这时JSF 的 UIComponent 树,好像是以viewroot为根的UIComponent组件树并没有被生成, 当用户第二次提交这个JSF页面时,才会生成以viewroot为根的UIComponent组件树。就这个问题,我已同JSF规范开发者通过邮件讨论过。可能在JSF以后的规范中能改进,这主要是当时的JSP2.0规范没有考虑到JSF的要求。JSP2.1以后的规范考虑了同JSF的整合,可能这些问题会被解决,但是好久没用JSF了,知道现在怎么样了。
所以,在JSF1.1中,当网页第一次被请求时,backbean中的代码:
UIComponent footer = this.getFacet("footer");
得到的footer肯定是null,所以你期望的逻辑没有得到执行。
ltian 2008-04-11
如果使用JSF1.1一定要注意的是,JSF第一次被请求的时,JSF框架所执行的行为和JSF页面再次被请求时的行为有很大区别。
受影响的还有:
如果你想动态显示一个有action的控件(render 属性绑定一个变量),比如commandButton之类的,如果根据业务逻辑,这个控件在JSF页面第一次被请求时没有被render,那么,当用户进行某些操作后并提交网页后,这个控件被render了,那么它的action是无效。避免的方法就是render它,但是把它的高宽设置为0。

用好JSF首先应好好阅读JSF规范,尤其是有关生命周期那一章,对照JSF框架的源码看看,很快就能取得很大进步。JSF不是那么容易上手,但是也不是十分难以理解。
fourfire 2008-04-11
ltian 写道
用JSF作一个通用的翻页子页面没那么麻烦,估计你是走错路了。

翻页已经搞定了,增加查询和导出的功能
stenlylee 2008-04-19
JSF1.1的commandButton onclick事件无法使用,要用mousedown代替
terryzhou 2008-05-04
jsf1.1中onclick会自动生成代码...要btn执行你定义的js.必须在后面加return false;

相关讨论