SelectOneMenu 在按下向上或向下箭头键时触发 ajax

SelectOneMenu fire ajax when up or down arrow key is pressed

我需要在我专注于 selectOneMenu 时按下向上箭头键或向下箭头键时触发 ajax 调用。

这是我的代码,我首先只尝试使用向上键(它不起作用,我尝试了几种变体)

<h:selectOneMenu id="id" disabled="#!Bean.disabled}" value="#{Bean.value}" styleClass="style" onkeypress="if (event.keyCode == 38) { onchange(); return false; }">
  <f:selectItems id="idItem" value="#{Bean.options}" var="option" />
  <f:ajax event="change" execute="@this" render="group"/>
</h:selectOneMenu>

提示:Tab 键触发它并移动焦点(如果值改变)。我不希望 Tab 键触发它。

只需将您的 f:ajax 事件更改为 keyupchange 事件将不会发送任何 ajax 请求,除非您的 selectOneMenu 失去焦点(你的提示也证实了这一点 "Tab key is firing it and moving the focus ").

它将像这样工作:

<f:ajax event="keyup" execute="@this" render="group"/>

更新:

我根据 BalusC 的评论更新了我的答案,即您希望仅在触发向上键或向下键时触发 ajax 请求,因此我建议您直接调用 javascript 函数 f:ajax 在幕后调用,因此您可以添加对 jsf.ajax.request(source, event, options) 函数的直接调用,您可以找到有关该函数的更多信息 here.

为了使用该方法,您必须像这样在 XHTML 文件中添加 JSF 的内置 JavaScript 库:

<h:outputScript library="javax.faces" name="jsf.js"/>

然后像这样更改您的代码:

<h:selectOneMenu id="id" disabled="#!Bean.disabled}" value="#{Bean.value}" styleClass="style" 
         onkeyup="if (event.keyCode == 38 || event.keyCode == 40) { jsf.ajax.request(this, event, { render: 'form:group'}); return false;}">
   <f:selectItems id="idItem" value="#{Bean.options}" var="option" />
</h:selectOneMenu>

注意: 请注意,在 jsf.ajax.request()render 选项中,我指定了你想要的组件的确切 ClientID render 而不仅仅是组件 id(form 在这里是 h:form 的 id),如果你只想使用 id group,你必须将 prependId="false" 添加到你的 h:form.