Горячие клавиши jQuery: запретить IE запускать собственные ярлыки, такие как Alt + H - PullRequest
1 голос
/ 18 февраля 2011

С помощью горячих клавиш jQuery я пытаюсь связать ярлыки типа Alt + H , Alt + C с некоторыми конкретными действиями в моем сайт. Распространение события останавливается (как и должно быть) во всех браузерах, кроме IE. Прежде всего, возможно ли этого добиться? Если да, то как?

Вот пример кода:

jQuery(document).bind('keydown', 'Alt+H',
     function (event)
     {
        $this.toggleMenu( 'H' );
        if(jQuery.browser.msie) {
            event.cancelBubble = true;
        }
                    else
                    {
            event.stopPropagation();
        }
        return false;
     } );

В IE выполняется строка $this.toggleMenu( 'H' );, но затем, похоже, cancelbubble не работает (браузер открывает меню «Справка»)

1 Ответ

1 голос
/ 12 апреля 2013

Это всегда странная вещь (из-за встроенных в браузер горячих клавиш и т. Д.), Но мне повезло с использованием события onKeyUp.

Проблема с отключением клавиатуры состоит в том, что она может толькоотправлять по одному ключу за раз.Так что, если вы нажмете ALT, это один из триггеров нажатия клавиш, а затем C - второй.KeyPress также имеет пробники в некоторых средах, потому что клавиши-модификаторы, такие как ALT и CTRL, не считаются нажатиями клавиш (я думаю ... кто-нибудь может объяснить это лучше?).

Если вы используете keyup, вы можете проверить, используется ли ALTудерживается при проверке ключа.Все еще отрабатывает изломы, но попробуйте это (я только проверял в win7: ie9 и chrome):

$(window).keyup(function (e)
{
    // warning: only tested with EN-US keyboard / locale

    // check whether ALT pressed (and not ALT+CTRL, ALT+SHIFT, etc)
    var key = e.key || String.fromCharCode(e.keyCode);
    if (e.altKey && !e.ctrlKey && !e.shiftKey && key)
    {
        // if ALT pressed, handle the keycode shortcut
        var keyPressed = key.toUpperCase(); // normalize input
        switch (keyPressed)
        {
            case "C":
                // do stuff for ALT-C
                break;
            case "H":
                // do stuff for ALT-H 
                break;
        }
    }
});

Проблемы / Вопросы:

  • Использует jQuery, но чисто решение JSне слишком сложный
  • Можно ли предотвратить поведение браузера по умолчанию, отменив событие?
  • Будет ли оно работать в браузерах, отличных от Chrome и IE9?(вероятно, FF и Safari)
  • Если пользователь отпускает клавишу ALT ДО отпускания буквенной клавиши, она не работает
  • Если пользователь нажимает буквенную клавишу ПЕРЕД нажатием клавиши ALT, она не работает
  • Попытка с использованием атрибутов ACCESSKEY, но это только устанавливает фокус. Я хотел щелкнуть гиперссылку и / или запустить событие click () для некоторого элемента на основе некоторой комбинации ALT-X.
  • Хотя это можетбыть приемлемым для корпоративного веб-приложения (так как поддержка локали и браузера обычно является более узкой, а пользователи обычно обучаются работе с программным обеспечением), это может быть неприемлемо для веб-сайтов (из-за большого количества используемых браузеров проблемы локализации связаны с тем, чтодобавьте к сложности и т. д.) ... придется подумать об этом еще.

Надеюсь, это поможет кому-то ... не стесняйтесь вызывать конструктивную критику, так как это функция, которую клиенты ВСЕГДАспрашивать о том, когда я создаю их веб-приложений.(они привыкли к устаревшим приложениям на основе форм 80-х и 90-х годов и нуждаются в широкой поддержке клавиатуры, что понятно, особенно когда они за это платят!)

...