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

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

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

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

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

有人可以用jQuery solutin帮我吗?

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

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

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

您可以在任何ClientBehaviorHolder组件中使用来实现该要求。 您可以让JSF通过生成HTML

,它也是ClientBehaviorHolder

   Click this div to toggle the input.     

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

 @Named @ViewScoped public class Bean implements Serializable { private boolean enabled; public void toggle() { enabled = !enabled; } public boolean isEnabled() { return enabled; } } 

也可以看看:

  • 当用户可以通过CSS,HTML,JavaScript,jQuery实现UI时,JSF的需求是什么?
  • 为什么JSF会在服务器上保存UI组件的状态?

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

  • 如何使用jQuery选择JSF组件?
  • 我怎么知道JSF组件的id,所以我可以在Javascript中使用