Клавиша ZK CTRL или горячая клавиша создают проблему с разными браузерами?

Я реализовал прослушиватель клавиш CTRL в структуре ZK. Однако у меня проблема с Firefox и Chrome.

Если я нажму CTRL+R или CTRL+A или CTRL+S, событие моего приложения срабатывает, но в Firefox и Chrome также срабатывает событие по умолчанию CTRL; обновить, выбрать все и сохранить соответственно. Например, если я нажимаю CTRL+A, мое событие срабатывает и выделяется весь текст на странице.

Может ли кто-нибудь сказать мне, это проблема ZK или я делаю что-то не так.

Примечание. События запускаются для всей страницы, а не только для текстового поля.

В ZUL я использовал:

<window apply="org.zkoss.bind.BindComposer"
        viewModel="@id('vm') @init('com.web.viewmodel.MyViewModel')"
        width="100%" height="100%" mode="embedded" ctrlKeys="^a^q^r^s^d"
        onCtrlKey="@command('doFireCtrlKeyEvent',code=event.getKeyCode())">

.. и в моей Java ViewModel я использовал следующее, этот метод поймает событие и передаст его соответствующему ViewModel:

@Command
public void doFireCtrlKeyEvent(@ContextParam(ContextType.VIEW) Component view, @org.zkoss.bind.annotation.BindingParam("code") String ctrlKeyCode) {
    int keyCode = Integer.parseInt(ctrlKeyCode);
    String ctrlKey = "";
    switch (keyCode) {
    case 65:
        ctrlKey = "CTRL+A";
        break;
    case 81:
        ctrlKey = "CTRL+Q";
        break;
    case 82:
        ctrlKey = "CTRL+R";
        break;
    case 83:
        ctrlKey = "CTRL+S";
        break;
    case 68:
        ctrlKey = "CTRL+D";
        break;
    }

    Map map = new HashMap();
    map.put("ctrlKeyCode", ctrlKey);

    Tabpanel tabPanel = mainTab.getSelectedPanel();
    Tab tab = mainTab.getSelectedTab();

    Include inc = (Include) tabPanel.getChildren().get(0);
    if (inc != null) {
        if (inc.getFirstChild() instanceof Window) {
            Window win = (Window) inc.getFirstChild();
            Map maps = win.getAttributes();
            Binder bind = (Binder) maps.get("binder");
            if (bind == null)
                return;
            bind.postCommand("doCtrlKeyAction", map);
        }
        if (inc.getFirstChild() instanceof Hbox) {
            Hbox hbox = (Hbox) inc.getFirstChild();
            Map maps = hbox.getAttributes();
            Binder bind = (Binder) maps.get("binder");
            if (bind == null)
                return;
            bind.postCommand("doCtrlKeyAction", map);
        }
    }
}

person Subodh Joshi    schedule 01.07.2013    source источник


Ответы (2)


Это просто обычное поведение - используйте как клавиши ctrl, так и действие по умолчанию, если ничего не находится в фокусе.

В качестве обходного пути вы можете использовать другой фокусируемый компонент (например, «а») в качестве второго прослушивателя клавиш управления, прослушивая событие щелчка документа и событие фокуса окна, и сфокусировать компонент «а», чтобы он мог обрабатывать клавиши управления при нажатии на нефокусируемые компоненты/сфокусированные окна.

простой пример: http://zkfiddle.org/sample/f9ejg7/5-Ctrlkeys-prevent-default

person benbai123    schedule 01.07.2013
comment
то вы также можете прослушивать событие фокуса окна, пожалуйста, обратитесь к обновленному образцу выше - person benbai123; 02.07.2013
comment
Хм, нам нужно добавить дополнительный компонент с переопределением метода jquery, тогда он должен работать ... это устранило проблему? но можем ли мы сделать что-то еще - person Subodh Joshi; 02.07.2013
comment
Вероятно, не может, должен существовать фокусируемый элемент dom и иметь фокус, чтобы он мог сначала получить ключевое событие, а затем предотвратить значение по умолчанию. - person benbai123; 02.07.2013

Боюсь, невозможно изменить/отключить элементы управления клавиатурой на уровне браузера из нашего приложения (читай: из JavaScript); это вопрос безопасности и удобства использования.

Существуют подключаемые модули как для Firefox, так и для Chrome (последний разработан Google), чтобы изменить эти элементы управления на уровне браузера... но это не не поможет вам, поскольку вам потребуется, чтобы все ваши пользователи перенастроили свои браузеры.

Используя нативные HTML-элементы, вы получаете множество элементов управления бесплатно. Например: выберите все в текстовых полях. Если ваш вариант использования не может работать в этих пределах, я бы посоветовал вам избегать этого подхода (или этих клавиатурных команд), поскольку это конфликт удобства использования.

person Sean Connolly    schedule 01.07.2013