jsf - 在表单中按 Enter 时执行的默认操作

标签 jsf action default form-submit enter

我有一个 jsf 1.2 表单,其中有两个按钮和几个输入字段。第一个按钮丢弃输入的值并使用数据库中的值重新填充页面,第二个按钮保存输入的值。当用户在光标位于其中一个输入字段时按 Enter 键、提交表单并执行与第一个按钮关联的操作时,就会出现问题。

代码如下所示:

<h:commandButton action="#{bean.reset}" value="Reset" />
<h:commandButton action="#{bean.save}" value="Save" />

<!-- h:datatable with several h:inputText elements -->

是否可以将特定按钮声明为按 Enter 时的默认操作?这种行为实际上是在某处指定的吗?

最佳答案

这不是 JSF 特有的。这是 HTML 特有的。 HTML5 forms specification section 4.10.22.2基本上指定第一个出现的 <input type="submit">相同的“树顺序”中的元素 <form>因为 HTML DOM 树中的当前输入元素将在按下 Enter 键时被调用。

基本上有两种解决方法:

  • 使用 JavaScript 捕获 Enter 键按下并调用所需的按钮。

      <h:form onkeypress="if (event.keyCode == 13) { document.getElementById('formid:saveid').click(); return false; }">
    

    如果表单中有文本区域,您希望将 JS 放在所有非文本区域输入元素上,而不是表单上。另请参阅Prevent users from submitting a form by hitting Enter .

    <小时/>
  • 交换 HTML 中的按钮并使用 CSS float 将它们交换回来。

      <div style="width: 100px; clear: both;">
          <h:commandButton action="#{bean.save}" value="Save" style="float: right;" />
          <h:commandButton action="#{bean.reset}" value="Reset" style="float: left;" />
      </div>
    

    它可能只需要一些像素微调。当然把CSS放在自己的.css中文件;使用style这是不好的做法,上面的例子是为了简洁起见。

    <小时/>

如果您碰巧使用 PrimeFaces,从 3.2 开始您可以使用 <p:defaultCommand> 以声明方式标识在表单中按 Enter 键时应调用的按钮。

<h:form>
    <p:defaultCommand target="save" />
    ...
    <h:commandButton id="reset" action="#{bean.reset}" value="Reset" />
    <h:commandButton id="save" action="#{bean.save}" value="Save" />
</h:form>

它在幕后使用 JavaScript 来附加 keydown家长的听众 <h:form>依次检查是否在非文本区域/按钮/链接元素中按下了 Enter 键,然后调用 click()在目标元素上。基本上与本答案中提到的第一个解决方法相同。

关于jsf - 在表单中按 Enter 时执行的默认操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485851/

相关文章:

java - primefaces 数据表中的单选按钮和复选框

jsf - 是否建议使用h :outputText for everything?

java - 按下按钮后在另一个面板内打开另一个面板

c++ - 为什么我的 C++ 子类需要显式构造函数?

jsf - Richfaces 和 Primefaces 彼此兼容吗?

java - 如何重新使用此表

swift - 通过模态 segue 为按钮创建操作。无法控制拖动,Swift

java - NetBeans 平台 : Toolbar and Actions

c++ - 使用 C++ 子类实例作为默认参数?

C++ struct 默认构造函数 mbed