2014-12-09 6 views
1

Использование PF 5.1, JSF 2.2.7 на Glassfish 4.1.SelectOneMenu сбрасывает события и срабатывает пожар на ALT-прессе

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

Bean:

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 на окнах или CMD на mac он вызовет слушателя, а также сбросит выпадающий список. Это происходит, когда выпадающее меню не имеет значения по умолчанию (когда оно уже включено 2 или 3). И это означает, что я не могу, например, нажать ALT + TAB, чтобы проверить что-то в другой открытой программе - когда я вернусь, он будет сброшен.

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

ответ

5

Это ошибка в JavaScript, связанной с <p:selectOneMenu>. Это не различать клавиши управления (Alt, Ctrl, и т.д.) из клавиш символов (, В, , и т.д.) при фильтрации пунктов меню с помощью клавиатуры.

В основном, в определении объекта 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, чтобы они могли правильно ее исправить на своей стороне. Как только исправление будет выпущено, вы можете удалить настраиваемый скрипт.

+0

Большое спасибо BalusC. Хорошая работа. –

+0

Добро пожаловать. – BalusC

+0

@BalusC: Благодарим вас за отличную поддержку, мы исправили эту проблему в файлах 5.1 и 5.2 как ваше предложение. Теперь мы обновили до primfaces 6.0, и теперь у нас возникает такая же проблема. в 6.0 они использовали keydown. Я попробовал ваше решение, но не повезло. Пожалуйста, помогите мне. – Srikanth

3

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

Большое спасибо BalusC!

Но обратите внимание не меняют «KeyUp» к «нажатием клавиши» для фильтра линии ниже:

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

Только для убегания ключа ручки:

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

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

Спасибо всем

-1

Thankq очень BaluC

Небольшой совет: я работаю с primefaces 5.2 и выше выпуска моделируются только в FIRFOX, оставаясь IE и хром работает нормально. Поэтому я модифицирована JS код, как показано ниже

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

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

+0

Если решение BalusC работает во всех браузерах, добавление проверки броузера, чтобы просто сохранить старый код для других браузеров, является плохим выбором. Браузерные проверки должны использоваться как можно меньше. Предпочтительно не – Kukeltje