SelectOneMenu сбрасывает и запускает событие изменения при нажатии ALT

Использование PF 5.1, JSF 2.2.7 на Glassfish 4.1.

У меня есть этот простой пример с 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");
}

}

Он работает, как и ожидалось, за исключением того, что, если выпадающий список имеет фокус, и я нажимаю ALT в Windows или CMD в Mac, он вызывает слушатель и также сбрасывает выпадающий список. Это происходит, когда раскрывающийся список не имеет значения по умолчанию (когда он уже установлен на 2 или 3). А это значит, что я не могу, например, нажать ALT + TAB, чтобы проверить что-то в другой открытой программе - когда я вернусь, это будет сброшено.

Почему это злое поведение и как его избежать? Я бы предпочел не нажимать на ALT, чтобы уволить event="change" и перезагрузите компонент.

3 ответа

Решение

Это ошибка в JavaScript, связанная с <p:selectOneMenu>, Он не отличает управляющие клавиши (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. Ctrl + F на keyup.ui-selectonemenu и заменить это на keypress.ui-selectonemenu,

  3. Сохранить.

  4. Прибыль.

А пока сообщите об этой проблеме ребятам из PrimeFaces, чтобы они могли исправить ее на своей стороне. После того, как исправление выпущено, вы можете удалить настроенный скрипт.

У меня только комментарий о BalusC хороший ответ. Я получаю ту же проблему, и это решение ее решает.

Сначала большое спасибо BalusC!

Но обратите внимание, не меняйте 'keyup' на 'keypress' для строки фильтра ниже:

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

Только для рукоятки управляющей клавиши:

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

В противном случае у вас будут проблемы с фильтром, который не будет работать должным образом. Например, первый введенный символ не будет фильтровать список.

Спасибо всем

Спасибо большое BaluC

Небольшой совет: я работаю с простыми версиями 5.2 и выше, проблема симулируется только в firfox, остальные IE и chrome работают нормально. Так что я изменил код JS, как показано ниже

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

как вы сказали, я дал дескриптор escape-ключа, и фильтр работает нормально, когда мы даем filter="true". Но без указания filter="true", когда мы фокусируемся на selectonemenu, тогда, если мы нажмем одну клавишу (символ), тогда будет сосредоточено соответствующее значение. пример: если щелкнуть "s", начнется слово "s". Эта функция не работает

Другие вопросы по тегам