【问题标题】:JSF 2.0 disable an inputText during inputJSF 2.0 在输入期间禁用 inputText
【发布时间】:2015-02-25 03:11:52
【问题描述】:

抱歉,如果这个问题已经得到解答,但我找不到任何符合我需要的答案或示例。

我有一个 JSF (2.0) 页面,其中给用户一个代码(如验证码),并且必须在 inputText 字段中输入该确切代码。一旦用户正确输入代码(并且焦点仍在 inputText 字段上),我想禁用(或者,甚至更好地隐藏)该 inputText 字段。

这行得通:

<h:inputText id="code" value="#{myBean.code}">
    <f:ajax event="keyup" render="code" />
</h:inputText>

但在每次按键时 inputText 字段都会失去焦点,因此该解决方案是不可接受的。我也尝试过设置 readonly="true"(使用支持 bean 布尔值),但它没有将 inputText 的 readonly 属性设置为 true,即使它将相应的支持 bean 的相应布尔值设置为 true:

<h:inputText id="code" value="#{myBean.code}" readonly="#{myBean.hasCodeBeenMatched}">
    <f:ajax event="keyup" />
</h:inputText>

非常感谢任何帮助!

【问题讨论】:

  • 你想在每次按键后询问服务器端,如果当前代码是正确的(增加服务器负载并且对于带宽慢的用户来说很烦人),还是你想在客户端做-side(将正确的验证码发送到浏览器与您想要使用验证码实现的目标相反)。 f:ajax 确实会在每次按键时询问服务器......并且随着字段的新鲜呈现,焦点会丢失。
  • 是的,我愿意在每次按键后承受服务器端验证的带宽冲击。

标签: jsf-2 render


【解决方案1】:

如果您在每次按键后都能进行客户端-服务器通信 - 为什么不采用另一种方法:

  1. 添加一个额外的面板id="removingElement"持有javascript来隐藏客户端的代码输入

    • 描述了一种获取代码输入文本唯一 ID 的方法here
  2. 给这个面板一个rendered='#{myBean.hasCodeBeenMatched}'

  3. 在您的 f:ajax 调用中重新呈现此元素

    &lt;f:ajax event="keyup" execute="@this" render="removingElement" /&gt;

那么,会发生什么:每次击键时,服务器都会检查正确性,但会重新呈现包含 javascript 的面板(您不应该失去焦点)。只要代码正确,面板就会实际呈现并执行其中的 javascript - 隐藏输入文本。

很抱歉没有提供任何工作代码,因为我手头没有工作的 JSF2 环境。无论如何,如果你得到它的工作,请告诉我。希望对你有帮助...

【讨论】:

  • 谢谢,L-Ray。本来希望不用 JS 也能达到这个效果,等有空再试试。
  • 是的,问题在于“渲染”会触发元素的重写——失去焦点。即使在重置焦点时,您也必须小心在验证码中再次获得相同的位置......希望它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2015-06-20
  • 2012-02-25
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
相关资源
最近更新 更多