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
проверка также может быть удалена.
Получить копию
/javax.faces.resource/primefaces.js.xhtml?ln=primefaces
и сохранить его как/resources/primefaces/primefaces.js
в вашем веб-приложении. Ресурсы в WAR имеют более высокий приоритет загрузки, чем ресурсы в JAR.Ctrl + F на
keyup.ui-selectonemenu
и заменить это наkeypress.ui-selectonemenu
,Сохранить.
Прибыль.
А пока сообщите об этой проблеме ребятам из 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". Эта функция не работает