我有一个inputField或其他标记,我想要禁用unitl用户点击它。
某事like this,但我无法在JSF中使用它。
$("div").click(function (evt) {
$(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});
我添加了disabled = true"到我的输入字段,并在<上设置div值h:形式> (在这种情况下,所有父标签只有一个),类似于j_idt13和输入字段的div,所以" div"值看起来像 j_idt13:inputID
有人可以帮我解决jQuery solutin吗?
我想知道它可以在JSF中完成,以及如何完成。
答案 0 :(得分:7)
您需要通过服务器端切换,而不是通过客户端切换。 JSF作为基于状态组件的MVC框架以这种方式保护以防止被篡改/被黑客入侵的请求,其中最终用户使用客户端语言/工具(如HTML或JS)来操纵HTML DOM树和/或HTTP请求参数,以便JSF的结果disabled
,readonly
甚至rendered
属性已被更改。
想象一下,如果JSF开发人员在这样的布尔属性中检查用户的角色会对管理员角色进行检查会发生什么,例如disabled="#{not user.hasRole('ADMIN')}"
,并且黑客操纵它的方式使得非管理员不再禁用它用户。这正是您只能通过服务器端更改上述属性(以及required
属性和所有转换器,验证器,事件侦听器等)的原因。
您可以在任何ClientBehaviorHolder
组件中使用<f:ajax>
来达到要求。您可以让JSF通过<div>
生成HTML <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>
使用此@ViewScoped
托管bean(@RequestScoped
因commandButton/commandLink/ajax action/listener method not invoked or input value not updated的#5中提到的原因而无法运行):
@Named
@ViewScoped
public class Bean implements Serializable {
private boolean enabled;
public void toggle() {
enabled = !enabled;
}
public boolean isEnabled() {
return enabled;
}
}
不相关: