【问题标题】:jquery is not working for making command button enable/disable in JSF [duplicate]jquery不适用于在JSF中启用/禁用命令按钮[重复]
【发布时间】:2015-05-28 23:35:00
【问题描述】:

这是我的查询。我正在为许可协议页面设计 UI(在 JSF 中),其中“下一步”按钮将根据用户接受或拒绝许可协议的选择启用或禁用。接受和拒绝按钮是单选按钮。我为此使用jquery。这是jquery sn-p:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js">
    $('#pg2\\:accept').click(function() {
        alert("hello");
        if ($(this).is(':checked'))
            $('#next').removeAttr('disabled');
        else
            $('#next').attr('disabled', 'disabled');    
    });
    }
</script>

这是我的 JSF 代码:

<h:panelgroup id="pg2">
    <h:selectOneRadio id="radios" layout="pageDirection">
        <f:selectItem id="accept" itemValue="#{true}" itemLabel=ACCEPT/>
        <f:selectItem id="decline" itemValue="#{false}" itemLabel=DECLINE/>
    </h:selectOneRadio>
</h:panelGroup>

<h:commandButton id="next" action="welcome" value="Next" widgetVar="nxt" />

编辑:用 Jsf 组件替换 primefaces 组件,因为我不能在我的代码中使用 primefaces

【问题讨论】:

  • &lt;p:commandButton&gt; 有自己的 disabled 属性,您可以根据条件设置该属性。不需要摆弄额外的 JavaScript/jQuery 代码。 (在这种情况下,id 可能已被添加,除非您将 &lt;h:form&gt;prependId 设置为 false,这反过来又很讨厌,应该始终保持不变(默认为 true)。它是不仅仅是next。查看呈现的HTML将有助于获得与按钮对应的正确id
  • 此外,PrimeFaces 是一个基于 jQuery 的 JSF 组件库。手动包含 jQuery 是完全没有必要的,只会导致冲突。
  • 我将用 jsf 组件替换 primeface 组件,因为我本质上需要 jquery。我最近知道我不能在我的代码中使用 primefaces。
  • 这仍然适用于&lt;h:commandButton&gt;s。 &lt;h:commandButton&gt; 还具有 disabled 属性,该属性需要一个布尔值,您可以有条件地设置该值。如果您仅在客户端使用 JavaScript/jQuery 禁用组件,则其服务器端状态仍将保持活动状态并且可被利用。

标签: jquery jsf


【解决方案1】:

使用tiny提到的&lt;p:commandButton&gt;disabled属性,您可以使用它来控制此按钮的禁用/启用,您需要在为&lt;h:selectOneRadio&gt;分配值后使用&lt;f:ajax&gt;中的ajax调用在你的 bean 中像这样 value="#{myBean.booleanVar}" 并使用 render 属性并分配你的按钮的 ID,它将根据你的选择启用/禁用。

在您的 xhtml

<h:panelGroup id="pg2">
    <h:selectOneRadio id="radios" value="#{myBean.disableButton}" layout="pageDirection">
        <f:selectItem id="accept" itemValue="#{true}" itemLabel="ACCEPT"/>
        <f:selectItem id="decline" itemValue="#{false}" itemLabel="DECLINE"/>
        <f:ajax render="next" execute="@this"/>
    </h:selectOneRadio>
</h:panelGroup>
<h:commandButton id="next" action="welcome" value="Next" widgetVar="nxt" disabled="#{!myBean.disableButton}"/>

private boolean disableButton;

// setter / getter

public boolean isDisableButton() {
    return disableButton;
}

public void setDisableButton(boolean disableButton) {
    this.disableButton = disableButton;
}

【讨论】:

  • @BalusC:是的,我也尝试了您的方法..但它不起作用。此外,我必须仅使用 jquery 来执行此任务。即使我需要用 jsf 组件替换 primefaces 组件,那也可以。但是 jquery 是强制性的。 :(
  • @BalusC 你说得对,很抱歉,我刚刚更新了我的答案。再次抱歉。
  • 你还是听不懂我在问什么。我必须仅使用 jquery 来执行此任务。请参阅我在问题中发布的 jquery sn-p。我必须仅使用 jquery 来执行此任务。不使用 ajax。
【解决方案2】:

将 jquery 与 jsf 一起用于此类任务是不正确的方法,因为 h:commandButton 的“disabled”属性可以达到目的。

您应该使用“disabled”属性来实现此功能。(正如 Tiny 在 cmets 中建议的那样)

但是,如果您强烈要求使用 jquery 来完成此任务,那么您可以通过以下方式实现它:

由于您是从 cdn 加载 jquery,您必须使用 &lt;script&gt; 标签来加载它。 (但在 jsf 中&lt;h:outputScript&gt; 建议从本地系统加载 jquery)并使用&lt;h:outputScript&gt; 编写自定义脚本。

加载 jquery 和自定义脚本如下:

<h:head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<h:outputScript>
    $(document).ready(function() {
        $('#next').attr('disabled', 'disabled'); 
        $("input:radio[value='true']").click(function() {
            $('#next').removeAttr('disabled');
        });
        $("input:radio[value='false']").click(function() {
            $('#next').attr('disabled', 'disabled');   
        });
     });
</h:outputScript>
</h:head>

您的&lt;h:panelgroup id="pg2"&gt; 中有错字,应该是&lt;h:panelGroup id="pg2" &gt;,并且“itemLabel”属性接受字符串类型值。

所以你的 jsf 代码是:

<h:panelGroup id="pg2">
   <h:selectOneRadio id="radios" layout="pageDirection">
       <f:selectItem id="accept" itemValue="#{true}" itemLabel="ACCEPT"/>
       <f:selectItem id="decline" itemValue="#{false}" itemLabel="DECLINE"/>
   </h:selectOneRadio>
</h:panelGroup>

<h:commandButton id="next" action="welcome" value="Next" widgetVar="nxt" />

【讨论】:

  • 谢谢。该 outputScript 标记正在工作,我用警报检查了它。这是工作。但是按钮仍然没有禁用:(
  • 检查您的浏览器控制台,您是否发现任何错误?
  • prependId="false" 添加到您的&lt;h:form&gt;
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 2010-11-17
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多