2011-12-28 26 views
3

我有一个链接到支持bean中的事件列表器的JSF ajax关键事件。在JSF 2的AjaxBehaviorEvent中捕获KeyCode

JSF文件中的代码如下所示。

<h:inputText id="txtDescription" value="#{institutionController.current.description}" disabled="#{institutionController.modifyControlDisable}" > 
    <f:ajax event="keyup" listener="#{institutionController.changeDetailsEvent}" /> 
</h:inputText> 

backing bean中的代码如下所示。

public void changeDetailsEvent(AjaxBehaviorEvent event) { 
} 

我想根据按键实现不同的逻辑,如下面显示的伪代码。

public void changeDetailsEvent(AjaxBehaviorEvent event) { 
    If (event.key = Key.enter) { 
     do something; 
    } else if (event.key = Key.Escape) { 
     so something else; 
    } else { 
     do nothing; 
    } 

} 

有人可以告诉我这是如何做的后台bean吗?

回答

6

AjaxBehaviorEvent不包含任何有关JavaScript event对象的信息。你需要传递你想要的信息。这可以通过隐藏的输入字段来实现,该字段的值将由JavaScript预填。例如,

<h:inputText value="#{bean.input}" onkeyup="document.getElementById('#{keyCode.clientId}').value=event.keyCode"> 
    <f:ajax event="keyup" execute="@this keyCode" listener="#{bean.listener}" /> 
</h:inputText> 
<h:inputHidden id="keyCode" binding="#{keyCode}" value="#{bean.keyCode}" /> 

(请注意,隐藏字段的id包括在execute,使其获得对Ajax请求提交的一起,也请注意,binding用于能够动态地获得为了设置键码值在document.getElementById()生成的客户端ID,您可以备选地也硬编码,如果是固定的客户端ID)

private String input; 
private int keyCode; 

public void listener() { 
    switch (keyCode) { 
     case 13: 
      // Enter key was pressed. 
      break; 
     case 27: 
      // Escape key was pressed. 
      break; 
     default: 
      // Other key was pressed. 
      break; 
    } 
} 

您可以在Mozilla DOM reference中找到所有有效keyCode值的概览。

+0

我们可以在JavaScript中做到这一点。 例如,我想显示警报“你按下了钥匙 - 'A'” – 2014-06-23 12:01:47

+0

炉排。再次感谢。 – 2014-09-08 08:17:22

+0

@BalusC:也许这是JSF 2.3的建议?我听到越来越多的人关于这样的事情。 [PrimeFaces已经在几个组件中添加了这个功能](https://github.com/primefaces/primefaces/commit/93100401e15ea70c92ae3014e9ad7673c3e4129b) – Kukeltje 2015-12-10 09:14:09