当我们输入autoComplete时,primefaces会自动突出显示第一个显示的项目。所以当我们按下回车键时,该项目将被选中。如何更改enter键的行为,因此在按下时,只需在backing bean属性中提交输入的文本。 我知道我们可以按ESC按钮然后继续,但用户不喜欢它。
我正在使用primefaces 5.0
& jsf 2.1.11
答案 0 :(得分:1)
有什么帮助我解决答案here和here的相同问题。基本上,你必须覆盖2种不同的行为。
第一个是第一个结果的默认选择,可以将其添加到您的自动完成中(如第一个链接中接受的答案所述,版本5.1.5,5.0.14和5.2的primefaces中提供) :
autoHighlight="false"
要覆盖的第二件事是按下Enter时的行为,因为您希望提交包含自动填充的表单。为此,只需将此代码添加到包含表单或自动完成:
onkeyup="if (event.keyCode == 13) {
document.getElementById('[searchFormId]:[submitButtonId]').click();
return false; }"
更改方括号之间的ID为您自己的ID已经完成。
PS:我知道这是一个相当古老的问题,但它仍适用于当前版本的primefaces(当回答这个问题时为6.1)。而且我也认为将这两种变化结合在一起是有帮助的。答案 1 :(得分:0)
说实话,这感觉就像一个错误。 Richfaces隐含地这样做(在建议时提交输入)。我还没有找到官方修复,所以我做了一些研究,结果发现最简单的方法是覆盖解决按键的JS功能。整个自动完成js是here。您只需要覆盖bindKeyEvents函数,以便同样声明它:
PrimeFaces.widget.AutoComplete.prototype.bindKeyEvents = function () {
然后从前面提到的JS中添加此特定函数的其余代码。我省略了代码,因此它更具可读性。然后,您希望找到一个开关,该开关可以解析具有映射到它们的某些行为的不同键。并根据代码:
case keyCode.ENTER:
case keyCode.NUMPAD_ENTER:
添加如下内容:
if (highlightedItem.length == 0) {
document.getElementById("<your_form_id>").click();
_self.hide();
} else {
highlightedItem.click();
}
此外,请确保在自动完成组件上关闭了forceSelection和autohighlight。
JS中的问题是,即使您没有从建议中选择任何项目,它仍然会触发尝试单击项目的事件......甚至不存在。
这是我说的最简单的方法...你也可以创建自己的自动完成实现并覆盖那里的行为。但这是很多工作,如果你只需要这个功能,我建议覆盖JS功能。
为了使用您的自定义覆盖原始JS,您需要确保在原始JS之后加载。要做到这一点,你可以使用h:outputScript,或者只是像你习惯的那样加载javascript ......但是在正文中(不是头部)。
还有一种比指定表单ID更有趣的方式。但是我浪费了太多时间来寻找一个我必须快速完成它的解决方案。