我试图渲染一个按钮,应该最初渲染禁用,并在某些时候启用客户端操作。我使用来自a4j的组件,代码如下:
<a4j:commandButton id="myButton" disabled="true" onclick="myFunction()">
问题是当disabled属性设置为true时,事件不会附加到组件上,导致以下html代码:
<input type="button" onclick="return false" ... />
所以当我尝试通过javascript启用时,按钮是启用的,但按钮没有事件侦听器附加。
到目前为止,我能想到的只有两个解决方案:
- 将disabled属性的值赋给bean属性并呈现按钮。
- 通过javascript在加载页面上显示初始启用和禁用
两个选项都可以工作,但它们不是很干净,我不想每次启用按钮时都向服务器请求
这就是像JSF这样基于有状态组件的MVC框架的工作原理。作为防止篡改/黑客请求的一部分,框架在准备应用请求值时重新评估输入元素的disabled
(和rendered
)属性。否则,终端用户将能够调用服务器端限制不允许的操作或提交值,这可能会为攻击敞开大门。
你提到的两种解决方案都很好。如果您不想让最终用户篡改/破解它,我会选择第一个。这很容易通过ajax实现。