SelectOneMenu在ALT按下时重置并触发更改事件

Jaq*_*har 1 jsf selectonemenu primefaces alt-key

在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>
Run Code Online (Sandbox Code Playgroud)

豆:

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");
}

}
Run Code Online (Sandbox Code Playgroud)

它按预期工作,除非下拉有焦点,我在Windows上按ALT或在Mac上按CMD它将调用监听器并重置下拉列表.当下拉列表不是默认值(当它已经在2或3时)时会发生这种情况.这意味着我不能例如按ALT + TAB来检查另一个打开程序中的内容 - 当我回来时它将被重置.

为什么这种邪恶的行为以及如何避免它呢?我宁愿不按ALT来触发event="change"并重置组件.

Bal*_*usC 6

这是与之关联的JavaScript中的错误<p:selectOneMenu>.它不区分控制键(Alt,Ctrl从字符键等)( ,A,,B 通过键盘过滤菜单项时,等).12

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

  1. 获取一份副本/javax.faces.resource/primefaces.js.xhtml?ln=primefaces并将其保存为 /resources/primefaces/primefaces.js您的webapp.WAR中的资源比JAR中的资源具有更高的加载优先级.

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

  3. 保存.

  4. 利润.

与此同时,向PrimeFaces人员报告此问题,以便他们能够正确地解决这个问题.修复程序发布后,您可以删除自定义脚本.