2011-12-28 58 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