Обнаружение команды + нажатие клавиши в Safari - PullRequest
4 голосов
/ 31 августа 2011

Я пытаюсь перехватить команду + нажатие клавиши в Safari.Я добавил обработчик событий следующим образом:

document.onkeypress = handleKeyPress;

function handleKeyPress(event) {
    if ("+" === String.fromCharCode(event.charCode) && event.metaKey) {
        // my code here
        return false;
    }
    return true;
}

Когда я нажимаю command shift = ( shift = - это + на моей клавиатуре США), оператор if не возвращает true.

Если я удаляю часть event.metaKey оператора if и нажимаю shift = , оператор if возвращает true.

Кроме того, если я изменяю соответствующую строку с «+» на «=» и нажимаю command = (с или без клавиши Shift), оператор if действительно возвращает true.

Есть ли способ на самом деле обнаружить команду + нажатие клавиши (без предположения, что клавиша + это shift = ипроверка на event.shiftKey, так как это не будет верно для некоторых неамериканских клавиатур)?

Ответы [ 3 ]

4 голосов
/ 31 августа 2011

Прежде всего, я не могу рекомендовать использовать ⌘ + в качестве ярлыка, так как это уже что-то значит в Safari (а именно, увеличить страницу). Кто-то может захотеть, чтобы это все еще работало нормально. В зависимости от того, что вы создаете, это может иметь смысл, но не переопределяйте сочетания клавиш по умолчанию, если вы не уверены.

В любом случае: Ключевые события сложны , часто потому, что свойства keyCode / charCode /, которые не всегда совпадают с правильной буквой, поэтому String.fromCharCode не всегда будут давать вам правильную строку. keyIdentifier иногда лучше смотреть, но не всегда (например, его коды буквенных клавиш всегда прописные).

То, что я делал в прошлом (и я не уверен, что это лучший способ сделать это, но он работает нормально), это вместо этого прослушивать события keydown и keyup и клавиши-модификаторы «stack» , То есть всякий раз, когда клавиша нажата, проверьте, является ли она клавишей-модификатором (то есть, является ли она cmd, ctrl, alt или shift). Если это так, добавьте его в «стек» модификаторов. Сделайте обратное на keyup; если выпущенный ключ был модификатором, удалите его из стека.

Теперь, вернувшись в обработчик keydown, если ключ не был клавишей-модификатором, вы можете отправить событие keydown (которое, в отличие от события нажатия клавиши, будет иметь довольно надежное свойство keyIdentifier для проверки), и стек модификаторов вместе с каким-то другим обратным вызовом, который возьмет его оттуда.

В вашем случае такой обратный вызов проверит, что ключ cmd находится в стеке и что keyIdentifier для события keydown - "U + 002B" (который является кодом Unicode для +).

Я собрал пример jsfiddle того, о чем я говорю. Если вы щелкнете на панели «Результат» (чтобы убедиться, что она сфокусирована) и нажмете ⌘ +, она должна отобразить комбинацию клавиш, которую вы использовали, и написать «Успех!» ниже. В противном случае он просто покажет комбинацию клавиш. На моей клавиатуре знак «плюс» доступен напрямую, поэтому я вижу комбинацию клавиш «⌘ +». Но если вам нужно сдвинуть, чтобы набрать знак плюс, вы должны увидеть «⇧⌘ +».

Это обобщенный кусок кода, который подходит для обработки сочетаний клавиш в Safari / Mac, поэтому вы можете использовать его, если хотите. Вы захотите добавить несколько слушателей событий, чтобы сбросить стек модификаторов для событий размытия и тому подобное. В идеале, стек модификаторов будет сбрасываться автоматически, когда вы отпускаете ключи, но поскольку что-то может привести к потере фокуса браузером или наблюдаемым элементом / окном / документом, события keyup не будут обрабатываться, а отпущенные ключи будут выиграны. не могут быть удалены из стека. Поэтому проверьте наличие размытия.

0 голосов
/ 31 августа 2011

К сожалению, я не думаю, что есть ответ.Проблема в том, что для CMD+SHIFT+= нажатие charCode составляет 61 (=), а не 43 (+).Похоже, это общесистемный дизайн, поскольку Mac OS X сама интерпретирует CMD+SHIFT+= как = плюс два модификатора, а не + и COMMAND.

. Я собрал простой jsFiddle дляпокажите это: http://jsfiddle.net/ScuDj/1/

В основном вам придется иметь дело с раскладками клавиатуры, если вы хотите обнаружить COMMAND +.

В качестве альтернативы, вы можете поддерживать только цифровую клавиатуру + - это работает последовательно!(шучу; -)

(Также: я пытался присоединиться к событию textInput, но не смог зарегистрировать его глобально. Я думаю, что это работает только на domNodes. Я не особо использовалэто событие очень много.)

0 голосов
/ 31 августа 2011

Зарегистрируйте объект события на первом уровне объекта окна, например, event = window.EE, затем просмотрите его с помощью Firebug или Safari Tools для веб-разработчиков и посмотрите значения, которые запускаются, когда вы хотите.Так что вы будете знать, с чем сравнивать.

...