Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript禁用/重新启用JSF组件?_Java_Javascript_Jsf - Fatal编程技术网

如何使用javascript禁用/重新启用JSF组件?

如何使用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

我正在开发一个JavaEE应用程序JSF2+richfaces 3.3.3+facelets

我想在加载页面时禁用我的h:selectOneMenu,当它使用onload功能完成加载时,我想重新启用我的组件。 我有这样的想法:

<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页 在您的特定情况下,它的危害较小,但如果情况取决于登录用户的角色/组,则这是一个严重的安全漏洞。