如何使用javascript禁用/重新启用JSF组件?
我正在开发一个JavaEE应用程序JSF2+richfaces 3.3.3+facelets 我想在加载页面时禁用我的h:selectOneMenu,当它使用onload功能完成加载时,我想重新启用我的组件。 我有这样的想法:如何使用javascript禁用/重新启用JSF组件?,java,javascript,jsf,Java,Javascript,Jsf,我正在开发一个JavaEE应用程序JSF2+richfaces 3.3.3+facelets 我想在加载页面时禁用我的h:selectOneMenu,当它使用onload功能完成加载时,我想重新启用我的组件。 我有这样的想法: <ui:define name="infosHead"> <script type="text/javascript"> window.onload = function() { document.ge
<ui:define name="infosHead">
<script type="text/javascript">
window.onload = function() {
document.getElementById("forme1_myform:valueCh").disabled = false;
alert("here");
}
</script>
</ui:define>
<ui:define name="infosBody">
<h:form id="forme1_myform" target="_blank">
<h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="true" >
<f:selectItems value="#{mybean.values}" />
<a4j:support event="onchange"
ajaxSingle="true"
limitToList="true"
reRender="id1,id2,...."
ignoreDupResponses="true"
action="#{mybean.actionme}"
oncomplete="getId();"/>
</h:selectOneMenu>
</h:form>
</ui:define>
这很好用。
但是我的bean没有得到任何东西mybean.value==null
就好像他认为这个部件还是不能使用一样
我怎样才能让它工作呢?我找到了这个解决方案
<ui:define name="infosHead">
<script type="text/javascript">
window.onload = function() {
updateName(false); // sets 'disabled' from true to false
}
</script>
</ui:define>
<ui:define name="infosBody">
<h:form id="forme1_myform" target="_blank">
<h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="#{mybean.render}" >
<f:selectItems value="#{mybean.values}" />
<a4j:support event="onchange"
ajaxSingle="true"
limitToList="true"
reRender="id1,id2,...."
ignoreDupResponses="true"
action="#{mybean.actionme}"
oncomplete="getId();"/>
</h:selectOneMenu>
</h:form>
<a4j:form>
<!-- this is where it's going to reRender my component -->
<a4j:jsFunction name="updateName" reRender="valueCh">
<a4j:actionparam name="param1" assignTo="#{mybean.render}" />
</a4j:jsFunction>
</a4j:form>
</ui:define>
这是mybean的内容:
public class MyBean implements Serializable {
private List<SelectItem> values;
private String value;
private Boolean render = true; // the page loads with element disabled
public void actionme(){...}
//getters & setters
}
我找到了这个解决办法
<ui:define name="infosHead">
<script type="text/javascript">
window.onload = function() {
updateName(false); // sets 'disabled' from true to false
}
</script>
</ui:define>
<ui:define name="infosBody">
<h:form id="forme1_myform" target="_blank">
<h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="#{mybean.render}" >
<f:selectItems value="#{mybean.values}" />
<a4j:support event="onchange"
ajaxSingle="true"
limitToList="true"
reRender="id1,id2,...."
ignoreDupResponses="true"
action="#{mybean.actionme}"
oncomplete="getId();"/>
</h:selectOneMenu>
</h:form>
<a4j:form>
<!-- this is where it's going to reRender my component -->
<a4j:jsFunction name="updateName" reRender="valueCh">
<a4j:actionparam name="param1" assignTo="#{mybean.render}" />
</a4j:jsFunction>
</a4j:form>
</ui:define>
这是mybean的内容:
public class MyBean implements Serializable {
private List<SelectItem> values;
private String value;
private Boolean render = true; // the page loads with element disabled
public void actionme(){...}
//getters & setters
}
问题是您只在客户端启用组件。在服务器端,它将始终被禁用=true。要实现这一目标,您必须: a。将组件的disabled属性分配给最初为“true”的托管bean属性 禁用={myController.valueChDisableStatus} b。在h:form insert window.onload=callScript中 c。最后,在myControllersomeAction方法中,将valueChDisableStatus属性设置为false
我现在无法检查解决方案,但我相信它可以正常工作。问题是您只在客户端启用组件。在服务器端,它将始终被禁用=true。要实现这一目标,您必须: a。将组件的disabled属性分配给最初为“true”的托管bean属性 禁用={myController.valueChDisableStatus} b。在h:form insert window.onload=callScript中 c。最后,在myControllersomeAction方法中,将valueChDisableStatus属性设置为false
我现在无法检查解决方案,但我相信它会很好地工作。这两种解决方案对我都不起作用 虽然从托管bean值设置元素的disabled属性可以很好地工作,并且通过javascript更改其值也可以很好地工作,但是一旦提交表单,仍然无法访问someaction方法,以便将valueChDisableStatus属性设置为false。此外,我发现,即使我的托管bean有一个isDisabled和一个setDisabledboolean值,当然,在提交表单后从未调用setDisabled方法,尽管isDisabled是。因此,我无法找到使用这些解决方案将托管bean disabledElement值更改为false的方法 我确实找到了一个对我有用的解决方案,不过在这个链接上:
基本上,它建议默认情况下,所有元素都应该从JSF角度启用,所有启用和禁用都应该通过Javascript完成。它确实指出,在这个解决方案中,客户端和服务器状态暂时不同步。。。但不管暂时的不匹配,它对我的场景都非常有效。这两种解决方案对我都不起作用 虽然从托管bean值设置元素的disabled属性可以很好地工作,并且通过javascript更改其值也可以很好地工作,但是一旦提交表单,仍然无法访问someaction方法,以便将valueChDisableStatus属性设置为false。此外,我发现,即使我的托管bean有一个isDisabled和一个setDisabledboolean值,当然,在提交表单后从未调用setDisabled方法,尽管isDisabled是。因此,我无法找到使用这些解决方案将托管bean disabledElement值更改为false的方法 我确实找到了一个对我有用的解决方案,不过在这个链接上:
基本上,它建议默认情况下,所有元素都应该从JSF角度启用,所有启用和禁用都应该通过Javascript完成。它确实指出,在这个解决方案中,客户端和服务器状态暂时不同步。。。但是它在我的场景中运行得非常好,而不考虑暂时的不匹配。它在没有该功能的情况下运行吗?你能发布bean代码吗?启用和禁用组件是可行的。但是,从列表中获取我选择的元素的值是不可行的。当我将h:selectOneMenu的属性disabled设置为false时,我得到所选元素的值。它在没有函数的情况下工作吗?你能发布bean代码吗?启用和禁用组件是可行的。但是,从列表中获取我选择的元素的值是不可行的。当我将h:selectOneMenu的属性disabled设置为false时,我得到了所选元素的值。您和博客作者似乎没有意识到JSF这样做是为了防止黑客篡改请求。另请参见a.o.和第5页,在您的特定情况下,它的危害性可能较小,但当情况取决于登录用户的角色/组时,这是一个严重的安全漏洞。您和博客作者似乎没有意识到JSF这样做是为了防止黑客篡改请求。另请参见a.o.和我的第5页 在您的特定情况下,它的危害较小,但如果情况取决于登录用户的角色/组,则这是一个严重的安全漏洞。