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

hel*_*rld 3 jquery jsf

我有一个inputField或其他标记,我想要禁用unitl用户点击它.

像这样的东西,但我不能让它在JSF中工作.

$("div").click(function (evt) {
    $(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});
Run Code Online (Sandbox Code Playgroud)

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

有人可以用jQuery solutin帮我吗?

我想知道它可以在JSF中完成,以及如何完成.

Bal*_*usC 7

您需要通过服务器端切换它,而不是通过客户端切换它.JSF作为基于状态组件的MVC框架以这种方式保护以防止被篡改/被黑客入侵的请求,其中最终用户使用客户端语言/工具(如HTML或JS)来操纵HTML DOM树和/或HTTP请求参数,以便JSF的结果disabled,readonly甚至rendered属性都被改变了.

想象一下,如果JSF开发人员在这样的布尔属性中检查用户的角色,就像这样管理角色会发生什么,disabled="#{not user.hasRole('ADMIN')}"并且黑客操纵它的方式使得非管理员用户不再禁用它.这正是您只能required通过服务器端更改上述属性(以及属性和所有转换器,验证器,事件侦听器等)的原因.

您可以<f:ajax>在任何ClientBehaviorHolder组件中使用以满足要求.你可以让JSF生成一个HTML <div>via <h:panelGroup layout="block">,它也是一个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>
Run Code Online (Sandbox Code Playgroud)

使用此@ViewScoped托管bean(@RequestScoped由于未调用commandButton/commandLink/ajax动作/侦听器方法的#5中提到的原因或未更新输入值而无法工作):

@Named
@ViewScoped
public class Bean implements Serializable {

    private boolean enabled;

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

    public boolean isEnabled() {
        return enabled;
    }

}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


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