我正在创建一个计算器,用户可以通过单击虚拟小键盘来执行各种操作。现在我想限制用户只通过点击按钮选择各种字符,他/她不应该使用键盘输入值。我尝试使用readonly="true"
,但是当我们点击任何按钮时,它既不验证输入也不设置bean中的值。
我们在jsf中有任何此类限制吗?
答案 0 :(得分:16)
这是JSF防范篡改/攻击请求的效果,其中黑客试图通过操纵HTML DOM和/来规避readonly
(和disabled
)属性或HTTP请求。
而不是
<x:inputXxx ... readonly="true">
使用
<x:inputXxx ... readonly="#{facesContext.currentPhaseId.ordinal eq 6}">
或
<x:inputXxx ... readonly="#{not facesContext.postback or facesContext.renderResponse}">
这可确保readonly
仅在呈现响应阶段有效,而不是在所有其他JSF阶段有效。因此,当JSF即将在应用请求值阶段解码输入组件时,它会以这种方式考虑readonly="false"
。
答案 1 :(得分:2)
第一行数字的key codes为48-57,因此您可以编写一个函数来禁用这些字符上的按键。
像这样的东西
function disableEnter(event) {
var charCode = (event.which) ? event.which : event.keyCode;
if (charCode > 31 && (charCode > 47 || charCode < 58)) {
return false;}
} else return true;
}
<h:inputText onkeypress="return disableEnter(event);" />
答案 2 :(得分:1)
我找到了另一种解决方法:
function stopEvent(event){
event.stopPropagation();
event.preventDefault();
}
onkeyup="stopEvent(event)" onkeydown="stopEvent(event)" onkeypress="stopEvent(event)"