如何在JavaScript中禁用/启用JSF输入字段?

4
我有一个inputField或其他标签,我想在用户点击之前禁用它。
类似这个,但我无法在JSF中使其工作。
$("div").click(function (evt) {
    $(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});

我在input字段中添加了disabled=true属性,并将div的值设置为<h:form>(在这种情况下只有一个父标签),类似于j_idt13和input字段的div,所以"div"的值看起来像j_idt13:inputID

有人能帮我用jQuery解决吗?

我想知道是否可以在JSF中完成,以及如何完成。

1个回答

8
你需要通过服务器端来切换它,而不是客户端。JSF作为一个基于状态的组件MVC框架,以此保护免受篡改/黑客请求的影响,其中最终用户使用客户端语言/工具如HTML或JS来操纵HTML DOM树和/或HTTP请求参数,从而改变JSF的disabledreadonly甚至rendered属性的结果。
想象一下,如果JSF开发人员针对管理员角色在布尔属性中检查用户角色,例如disabled="#{not user.hasRole('ADMIN')}",而黑客以这样的方式操纵它,使得非管理员用户也能够使用它。这正是为什么你只能通过服务器端来更改所提到的属性(以及required属性和所有转换器、验证器、事件监听器等)。
您可以在任何ClientBehaviorHolder组件中使用<f:ajax>来实现要求。 您可以让JSF通过<h:panelGroup layout="block">生成一个HTML <div>,这也是一个ClientBehaviorHolder
<h:form>
    <h:panelGroup layout="block">
        Click this div to toggle the input.
        <f:ajax event="click" listener="#{bean.toggle}" render="input" /> 
    </h:panelGroup>
    <h:inputText id="input" ... disabled="#{not bean.enabled}" />
</h:form>

使用这个@ViewScoped管理的bean(@RequestScoped由于commandButton/commandLink/ajax action/listener method not invoked or input value not updated中提到的原因不起作用):
@Named
@ViewScoped
public class Bean implements Serializable {

    private boolean enabled;

    public void toggle() {
        enabled = !enabled;
    }

    public boolean isEnabled() {
        return enabled;
    }

}

另请参阅:


与具体问题无关,如果您真的想知道如何通过JS / jQuery获取JSF组件的HTML表示,请转到以下答案:


非常感谢!为什么在<h: panelGrid>内不起作用,有任何原因吗? - helloWorld
不客气。既然你是新来的,请记得在它有助于理解和解决具体问题时标记答案为已接受。至于新问题,显然你使用的方式不正确(例如,钩子到代表网格单元的<h:panelGroup>而不是div,在这种情况下,只需嵌套另一个div以便正确表示div;只需查看生成的HTML输出即可获得提示)。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接