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

时间:2014-12-09 16:53:13

标签: jsf primefaces selectonemenu 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>

豆:

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"并重置组件。

3 个答案:

答案 0 :(得分:5)

这是与<p:selectOneMenu>相关联的JavaScript中的错误。它不区分控制键( Alt Ctrl 等)与字符键( A B 1 , 2 等)。

基本上,在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。 WAR中的资源比JAR中的资源具有更高的加载优先级。

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

  3. 保存。

  4. 利润。

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

答案 1 :(得分:3)

我只对BalusC的回答很好。我得到同样的问题,这个解决方案解决了它。

首先非常感谢BalusC!

但要注意不要将'keyup'更改为下面的过滤行'keypress':

this.filterInput.on("keyup.ui-selectonemenu",function(...

仅适用于转义键句柄:

c.ESCAPE:a.handleEscapeKey(d);break}}).on("keypress.ui-selectonemenu"

否则您将遇到过滤器无法正常工作的问题。例如,输入的第一个字符不会过滤列表。

感谢所有

答案 2 :(得分:-1)

非常感谢BaluC

小建议: 我正在使用primefaces 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'开始单词将重点关注。此功能无效