我有一个带有两个按钮和几个输入字段的jsf 1.2表单 . 第一个按钮放弃输入的值,并使用db中的值重新填充页面,第二个按钮保存输入的值 . 当用户在光标位于其中一个输入字段中时按下enter键,表单被提交并且与第一个按钮相关联的操作被执行时,会出现问题 .
代码如下所示:
<h:commandButton action="#{bean.reset}" value="Reset" />
<h:commandButton action="#{bean.save}" value="Save" />
<!-- h:datatable with several h:inputText elements -->
按Enter键是否可以将特定按钮声明为默认操作?这种行为实际上是在某处指定的吗?
6 回答
仅在文本输入字段中忽略ENTER键(source):
您可以使用
h:commandLink
作为第一个按钮,并使用css(如h:commandButton
)进行样式设置 .例如,bootstraps
"btn btn-default"
在commandLink和commandButton上看起来相同 .这不是JSF特有的 . 这是HTML特有的 . HTML5 forms specification section 4.10.22.2基本上指定"tree order"中的第一个出现的
<input type="submit">
元素与HTML DOM树中当前输入元素相同的<form>
将在输入按下时调用 .基本上有两种解决方法:
如果你在表单中有textareas,你想把JS放在所有非textarea输入元素而不是表单上 . 另见Prevent users from submitting a form by hitting Enter .
它可能只需要一些像素微调 . 当然把CSS放在自己的
.css
文件中;使用style
是不好的做法,上面的例子是为了简洁 .如果您碰巧使用PrimeFaces,从3.2开始,您可以使用<p:defaultCommand>以声明方式标识在表单中按Enter键时应调用的按钮 .
它是使用JavaScript的,它将
keydown
监听器附加到父级<h:form>
,后者依次检查是否在非textarea / button / link元素中按下了回车键,然后在目标元素上调用click()
. 基本上与本回答中提到的第一个解决方法相同 .我发现了一种不那么笨拙且运作良好的方法 . 这个想法是隐藏的
commandButton
.不幸的是
display:none
样式无法使用,因为commandButton
将被忽略 .visibility:hidden
不好,因为它保留了组件的空间 .但我们可以使用以下CSS微调样式,使其 visual appearance will be zero 的大小:
And now all it takes is:
这将导致一个不可见的命令按钮,根据第一个下一个提交按钮规则可以激活该按钮 .
要隐藏元素,可以使用css:
style="visibility: hidden"
要在使用primefaces时更改默认操作,可以使用:
<p:defaultCommand target="yourButtonDefault" />
例如:资料来源:Primefaces new component: DefaultCommand
按照BalusC建议使用JavaScript解决问题,我写了一些jQuery代码来完成这项工作:
CodePen:http://codepen.io/timbuethe/pen/AoKJj