在 Glassfish 4.1 上使用 PF 5.1、JSF 2.2.7。
我有一个简单的例子,selectOneMenu
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:form>
<p:selectOneMenu value="#{testBean.text}">
<p:ajax listener="#{testBean.test()}" update="outputpanel"/>
<f:selectItem itemLabel="1" itemValue="1"/>
<f:selectItem itemLabel="2" itemValue="2"/>
<f:selectItem itemLabel="3" itemValue="3"/>
</p:selectOneMenu>
<p:outputPanel id="outputpanel">
#{testBean.text}
</p:outputPanel>
</h:form>
</h:body>
</html>
豆:
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class TestBean implements Serializable
{
private String text;
public String getText() {
return text;
}
public void setText(String text) {
System.out.println("settext: " + text);
this.text = text;
}
public void test() {
System.out.println("test called");
}
}
它按预期工作,除了如果下拉列表具有焦点并且我在 Windows 上按 ALT 或在 mac 上按 CMD,它将调用侦听器并重置下拉列表。当下拉列表未达到其默认值时(当它已经在 2 或 3 上时),会发生这种情况。这意味着我无法按 ALT + TAB 在另一个打开的程序中检查某些内容 - 当我回来时,它将被重置。
为什么会有这种邪恶的行为以及如何避免它?我宁愿不要按 ALT 来触发event="change"
并重置组件。
与<p:selectOneMenu>
相关的JavaScript中的一个错误。通过键盘过滤菜单项时,它不会区分控制键(Alt、Ctrl 等)和字符键(A、B、1、2 等)。
基本上,在primefaces.js
文件中的PrimeFaces.widget.SelectOneMenu
对象定义中,on("keyup.ui-selectonemenu", function...)
必须替换为 .on("keypress.ui-selectonemenu", function...)
。仅当按下字符键时,才会触发keypress
事件。这样,也可以删除整个switch
检查。
获取
/javax.faces.resource/primefaces.js.xhtml?ln=primefaces
的副本,并将其另存为 Web 应用程序中的/resources/primefaces/primefaces.js
。WAR 中的资源具有比 JAR 中的资源更高的加载优先级。按 Ctrl+F 在
keyup.ui-selectonemenu
上并将其替换为keypress.ui-selectonemenu
。救。
利润。
同时,将此问题报告给PrimeFaces的人,以便他们可以正确修复它。发布修补程序后,可以删除自定义脚本。
我只有一个关于BalusC的评论很好的答案。我遇到了同样的问题,这个解决方案解决了它。
首先非常感谢BalusC!
但请注意,不要将以下过滤器行的"键"更改为"按键":
this.filterInput.on("keyup.ui-selectonemenu",function(...
仅适用于逃生键手柄:
c.ESCAPE:a.handleEscapeKey(d);break}}).on("keypress.ui-selectonemenu"
否则,您将遇到过滤器无法正常工作的问题。例如,输入的第一个字符不会过滤列表。
感谢大家
BaluC
小建议:我正在使用 Primeface 5.2 及以上版本问题仅在 Firfox 中模拟,其余 IE 和 Chrome 工作正常。所以我修改了js代码,如下所示
(window.navigator.userAgent.indexOf("Firefox")>0) ? "keyup.ui-selectonemenu" : "keypress.ui-selectonemenu"
正如您所说,当我们给出 filter="true" 时,我为转义键句柄和过滤器提供了正常工作。 但是如果不给出filter="true",当焦点在selectonemenu上时,如果我们单击一个键(字符),那么相关值将聚焦。示例:如果单击"S",则"S"开头的单词将聚焦。此功能不起作用