【问题标题】:Action of <h:commandButton> not getting invoked when "disabled=true" is set当设置“disabled=true”时,<h:commandButton> 的操作不会被调用
【发布时间】:2013-12-03 01:23:57
【问题描述】:

我希望在选中 T&C 复选框时启用提交按钮。虽然我的书面逻辑工作正常,但 h:commandButton 的操作即使在选中复选框后启用,也不会被调用。最初,该按钮被禁用。如果我删除 disabled="TRUE" 属性,代码可以正常工作,但它不能达到目的。这是我的代码:

<script type="text/javascript">
$(document).ready(start);
function start() {

    $('.testing').click(
            function() {
                if ($(document.getElementById('form2:check'))
                        .is(':checked')) {
                    $(document.getElementById('form2:saveForm'))
                            .removeAttr('disabled');
                } else {
                    $(document.getElementById('form2:saveForm')).attr(
                            'disabled', 'disabled');
                }
            });
                 }
</script>

JSP 代码:

<h:form id="form2">
    <div class="testing">
        <h:selectBooleanCheckbox id="check" />
                Agree           
            <li class="buttons ">
                <div class="center">
                    <h:commandButton id="saveForm" styleClass="btTxt submit"
                        type="submit" value="Submit"
                        action="#{declarationFormBean.formSubmit}" disabled="true"></h:commandButton>
                </div>
            </li>
</h:form>

请帮忙。

【问题讨论】:

    标签: jsf action commandbutton


    【解决方案1】:

    这是因为您只是在使用 JavaScript/jQuery 的 JSF 生成的 HTML 表示中删除 disabled 属性。这不会对实际 JSF 组件中的 disabled 属性进行任何更改,在解码操作事件期间会参考该属性。

    这实际上是 JSF 的一件好事TM,因为否则任何黑客都可以通过操纵 HTML DOM 树来绕过任何 JSF disabledreadonlyrendered 属性虽然它们最初被用来阻止它们,就像rendered="#{request.isUserInRole('ADMIN')}"。

    你需要通过JSF而不是JS/jQuery来启用按钮。

    <h:selectBooleanCheckbox binding="#{check}">
        <f:ajax render="saveForm" />
    </h:selectBooleanCheckbox>
    <h:commandButton id="saveForm" ... disabled="#{not check.value}" />
    

    就是这样。不需要自定义 JS/jQuery 混乱,也不需要任何额外的 JSF bean 属性。上面的代码是完整的。

    另见:

    【讨论】:

    • 感谢您的回答,但我已经尝试过您在类似问题中给出的 。它向我显示未知标签。在项目 proerties -> Project Facets 我可以看到 JavaServer Faces 版本为 2.2 那么为什么会出现这个问题?
    • 您是在使用 JSP 而不是 Facelets (XHTML) 吗?
    • 你不应该再使用 JSP 了。它已弃用,并在 4 年前由 Facelets 继承。您需要改用 Facelets。 &lt;f:ajax&gt; 等新的 JSF 2.0 标记仅在 Facelets 中可用,在 JSP 中不可用。看到有人在 JSP 上使用 JSF 2.2 实际上是相当令人惊讶的。没有一个理智的教程表明这一点。请确保您通过最近的 JSF 2.x 目标资源学习 JSF,而不是通过过时的 JSF 1.x 资源。与 JSF 1.x 相比,JSF 2.x 中的许多事情都以不同的方式完成(阅读:更好!)。
    • 只在 JSP 中做吗?应用程序的其余部分工作正常,我这样做只是为了改善用户体验。
    • 一种方法是使用onclick="submit()" 而不是&lt;f:ajax&gt;。另一种方法是继续使用此自定义 JS/jQuery 混乱,然后添加隐藏输入以指示 JSF 重新启用按钮。即使它有效,但绝对没有继续使用已弃用的技术的意义。是时候迁移了。
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多