选择一菜单在 ALT 按下时重置并触发更改事件



在 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中的一个错误。通过键盘过滤菜单项时,它不会区分控制键(AltCtrl 等)和字符键(AB12 等)。

基本上,在primefaces.js文件中的PrimeFaces.widget.SelectOneMenu对象定义中,on("keyup.ui-selectonemenu", function...)必须替换为 .on("keypress.ui-selectonemenu", function...) 。仅当按下字符键时,才会触发keypress事件。这样,也可以删除整个switch检查。

  1. 获取/javax.faces.resource/primefaces.js.xhtml?ln=primefaces的副本,并将其另存为 Web 应用程序中的/resources/primefaces/primefaces.js。WAR 中的资源具有比 JAR 中的资源更高的加载优先级。

  2. 按 Ctrl+F 在keyup.ui-selectonemenu上并将其替换为 keypress.ui-selectonemenu

  3. 救。

  4. 利润。

同时,将此问题报告给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"开头的单词将聚焦。此功能不起作用

最新更新