2010-09-09 2 views
35

Я хотел бы добавить поддержку сочетаний клавиш на пару страниц в своем веб-приложении, перехватив обработчик события нажатия клавиши объекта документа, а не атрибут accesskey.Переопределение клавишной панели браузера

Проблема заключается в том, что каждый браузер имеет свои собственные комбинации клавиш, поэтому невозможно создать набор комбинаций клавиш, которые работают на всех веб-браузерах и все же согласованы (например, было бы глупо, если ярлык для сохранения был Ctrl + Сдвиг + S в то время как один для удаления был Alt + D.)

Так что я решил, что это будет только проще переопределить ярлыки браузера в целом в несколько страниц с моим ,

Все недостатки в стороне, возможно ли это? Если так, то как ты это делаешь?

+2

На личной ноте, пожалуйста, не перекрывая общие ярлыки браузера, которые согласуются между браузерами, такими как 'Cw',' 'Ct', CSt' ... Некоторые из продуктов Google, переопределять общие ярлыки браузера и его невероятно раздражает ! –

+1

Трудно узнать, что такое «обычные» ярлыки пользователей. Например, многие пользователи используют 'C-e' или это относительно хорошо, чтобы переопределить? Было бы здорово иметь диаграмму процентов пользователей, которые используют каждый ярлык браузера. – JKillian

ответ

12

Там отличный охват этого здесь: http://unixpapa.com/js/key.html

Что касается ли это то, что должно быть сделано, достаточно несколько ключей StackOverflow то вопрос РЕДАКТОР Override без нарушения слишком много (при наведении на кнопки на панели инструментов) ,

+3

Вам нужно обработать событие * keydown * с 'e.preventDefault(); e.stopPropagation(); '. При работе с keydown нужно помнить, что это может произойти несколько раз, если пользователь удерживает нажатой клавишу дольше. – ShitalShah

+7

Вы должны ответить на вопрос непосредственно на Stack Overflow, а не на ссылку где-то в другом месте (внешние ссылки могут нарушить или изменить или не напрямую ответить на вопрос). См. [Ответы, содержащие только ссылки в других местах «хорошие ответы»?] (Http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). – mgiuca

+0

Я действительно ненавижу способ, которым Ctrl-L украл, когда я использую редактор вопросов StackOverflow. Сложнее выполнять поиск в Интернете при редактировании вопросов. –

29
onkeydown = function(e){ 
    if(e.ctrlKey && e.keyCode == 'S'.charCodeAt(0)){ 
    e.preventDefault(); 
    //your saving code 
    } 
} 
+5

Во многих ситуациях я не думаю, что это сработает. С такими ключами, как «вкладка», многие браузеры будут перехватывать команду до того, как скрипт сможет правильно изменить поведение ключа. – Trafalmadorian

+4

'event.preventDefault' работает только в браузерах, совместимых с W3C, а не (скажем) доминирующем браузере в общей сети Microsoft - если, конечно, вы не используете библиотеку jQuery, которая добавляет ее в для тебя. –

+3

T.J.> Вы имеете в виду, что jQuery может переопределять сочетания клавиш даже в IE? –

8

Вот мое решение этой проблемы:

Большинство (если не все) ярлыки браузера будут перекрываться. Только системные, например Alt + Вкладка или Windows ключ не будет.

document.onkeydown = overrideKeyboardEvent; 
document.onkeyup = overrideKeyboardEvent; 
var keyIsDown = {}; 

function overrideKeyboardEvent(e){ 
    switch(e.type){ 
    case "keydown": 
     if(!keyIsDown[e.keyCode]){ 
     keyIsDown[e.keyCode] = true; 
     // do key down stuff here 
     } 
    break; 
    case "keyup": 
     delete(keyIsDown[e.keyCode]); 
     // do key up stuff here 
    break; 
    } 
    disabledEventPropagation(e); 
    e.preventDefault(); 
    return false; 
} 
function disabledEventPropagation(e){ 
    if(e){ 
    if(e.stopPropagation){ 
     e.stopPropagation(); 
    } else if(window.event){ 
     window.event.cancelBubble = true; 
    } 
    } 
} 
+4

Это не останавливает ALT + E из меню браузера Edit. –

Смежные вопросы