Java 如何使用JSF显示/隐藏组件?
如何使用JSF显示/隐藏组件? 我目前正试图在javascript的帮助下做同样的事情,但没有成功。 我不能使用任何第三方库 谢谢| Abhi检查下面的代码。 这是下拉菜单。在此情况下,如果选择“其他”,则文本框将显示,否则文本框将隐藏Java 如何使用JSF显示/隐藏组件?,java,javascript,jsf,Java,Javascript,Jsf,如何使用JSF显示/隐藏组件? 我目前正试图在javascript的帮助下做同样的事情,但没有成功。 我不能使用任何第三方库 谢谢| Abhi检查下面的代码。 这是下拉菜单。在此情况下,如果选择“其他”,则文本框将显示,否则文本框将隐藏 function show_txt(arg,arg1) { if(document.getElementById(arg).value=='other') { document.getElementById(arg1).style.display="block"
function show_txt(arg,arg1)
{
if(document.getElementById(arg).value=='other')
{
document.getElementById(arg1).style.display="block";
document.getElementById(arg).style.display="none";
}
else
{
document.getElementById(arg).style.display="block";
document.getElementById(arg1).style.display="none";
}
}
The HTML code here :
<select id="arg" onChange="show_txt('arg','arg1');">
<option>yes</option>
<option>No</option>
<option>Other</option>
</select>
<input type="text" id="arg1" style="display:none;">
函数show_txt(arg,arg1)
{
if(document.getElementById(arg.value=='other'))
{
document.getElementById(arg1.style.display=“block”;
document.getElementById(arg.style.display=“无”;
}
其他的
{
document.getElementById(arg.style.display=“block”;
document.getElementById(arg1.style.display=“无”;
}
}
此处的HTML代码:
对
不
其他
或者您可以查看此链接
使用h名称空间中大多数(如果不是所有)标记上可用的“rendered”属性
<h:outputText value="Hi George" rendered="#{Person.name == 'George'}" />
通常,您需要通过其。此示例使用带有请求范围绑定的JSF2 Facelets视图来获取另一个控件的句柄:
显示/隐藏
功能切换(id){
var元素=document.getElementById(id);
if(element.style.display=='block'){
element.style.display='none';
}否则{
element.style.display='block'
}
}
具体如何做到这一点取决于您正在使用的JSF版本。请参阅这篇关于旧JSF版本的博文:。您应该使用
标记和属性呈现。如果将true
设置为rendered,则不会显示
的内容。您的XHTML文件应该有如下内容:
java:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
private boolean showPassword = false;
private String password = "";
public boolean isShowPassword(){
return showPassword;
}
public void setPassword(password){
this.password = password;
}
public String getPassword(){
return this.password;
}
}
实际上,您可以在不使用JavaScript的情况下实现这一点,只使用JSF的rendered
属性,将要显示/隐藏的元素封装在一个本身可以重新呈现的组件中,例如至少在JSF2中的panelGroup。例如,下面的JSF代码根据第三个下拉列表的值显示或隐藏两个下拉列表中的一个或两个。AJAX事件用于更新显示:
一个显而易见的解决方案是使用javascript(不是JSF)。要通过JSF实现这一点,您应该使用AJAX。在本例中,我使用单选按钮组来显示和隐藏两组组件。在backbean中,我定义了一个布尔开关
private boolean switchComponents;
public boolean isSwitchComponents() {
return switchComponents;
}
public void setSwitchComponents(boolean switchComponents) {
this.switchComponents = switchComponents;
}
当开关为真时,将显示一组组件,当开关为假时,将显示另一组组件
<h:selectOneRadio value="#{backbean.switchValue}">
<f:selectItem itemLabel="showComponentSetOne" itemValue='true'/>
<f:selectItem itemLabel="showComponentSetTwo" itemValue='false'/>
<f:ajax event="change" execute="@this" render="componentsRoot"/>
</h:selectOneRadio>
<H:panelGroup id="componentsRoot">
<h:panelGroup rendered="#{backbean.switchValue}">
<!--switchValue to be shown on switch value == true-->
</h:panelGroup>
<h:panelGroup rendered="#{!backbean.switchValue}">
<!--switchValue to be shown on switch value == false-->
</h:panelGroup>
</H:panelGroup>
注意:在ajax事件中,我们呈现组件根。因为一开始没有渲染的组件不能被渲染
另外,请注意,如果“ComponentRoot”和单选按钮位于不同的组件层次结构下。您应该从根目录(formroot)引用它 您想在页面生成期间显示/隐藏它,还是对已生成页面上的某些操作作出反应?第一个可以通过JSF标签的“rendered”属性实现,后者可以通过JavaScript实现。当页面呈现时,组件应该是不可见的,当用户单击图像时,组件应该显示出来。如果你能告诉我的JS方法,这将是伟大的!如果您可以使用JSF 2.0,
标记将允许您轻松地更新页面的一部分,而不是触发完整的页面刷新。这是HTML+JS,在我的例子中也适用,但是我在使用JSF时遇到了问题。@abhi如果您想单击图像,然后显示组件,那么就给图像一个id,并在IMG tag上使用onClick事件,谢谢Ricky,但这正是我正在做的,对我来说不起作用。当我点击图片时什么也没发生!这个想法非常正确,但是如果希望能够像AJAX事件一样动态显示/隐藏组件,则应该在panelGroup内部的组件上使用rendered属性,而不是在panelGroup本身上。如果在panelGroup上使用rendered,并且其条件最初为false,则在第一次尝试更新它时会出现错误,因为它在页面上不存在。应该注意的是,这将使用ajax并创建额外的服务器请求。虽然这可能更可取,但有时我会选择基于javascript的解决方案。应该注意的是,如果您还想提交表单,则只提交rendered=true的输入字段(或此处的SelectOneMenus)。这是迄今为止最简单、最好的方法。谢谢你的回答。完全同意@jake long:你把JS和JSF混为一谈了。虽然您可能会造成混乱,但这不符合模块化开发中的最佳实践。