1

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

4

3 回答 3

6

这是与<p:selectOneMenu>. 通过键盘过滤菜单项时,它不区分控制键(AltCtrl等)和字符键(A、、、、等)。B12

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

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

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

  3. 节省。

  4. 利润。

同时,将此问题报告给 PrimeFaces 人员,以便他们可以正确地修复它。修复发布后,您可以删除自定义脚本。

于 2014-12-10T10:39:09.347 回答
3

我只有一个关于 BalusC 好答案的评论。我遇到了同样的问题,这个解决方案解决了它。

首先非常感谢 BalusC !

但请注意不要将以下过滤器行的“keyup”更改为“keypress”:

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

仅用于转义键句柄:

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

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

谢谢大家

于 2015-09-30T10:11:10.860 回答
-1

非常感谢BaluC

小建议:我正在使用 primefaces 5.2 及更高版本的问题仅在 firfox 中进行模拟,剩余的 IE 和 chrome 工作正常。所以我修改了如下的js代码

(window.navigator.userAgent.indexOf("Firefox")>0) ? "keyup.ui-selectonemenu" : "keypress.ui-selectonemenu"

正如你所说,当我们给过滤器 =“真”时,我给了转义键句柄和过滤器工作正常。但是如果没有给出 filter="true",当关注 selectonemenu 时,如果我们单击一个键(字符),则相关值将聚焦。例如:如果单击“s”,则“s”开头的单词将成为焦点。此功能不起作用

于 2016-02-03T12:32:06.530 回答