2012-05-01 3 views
8

В принципе, я использую jQuery Hotkeys plugin г Resig, чтобы захватить и обработать ярлыки как ctrl+o и т.д ...JQuery горячих клавиши ... не так глобальные

ОК, может быть, я не uderstand концепции, но я был под впечатлением, что ctrl+o, вызванный где-либо внутри документа, будет захвачен обработчиком горячих клавиш документа.

Например, следующий код работает вообще ...

jQuery(document).bind('keydown', 'ctrl+o', fn); 

Однако, с треском проваливается, если пользователь запускает горячую клавишу, когда внутри поля ввода.

Это работает только если я делаю следующее:

jQuery('body, input').bind('keydown', 'ctrl+o', fn); 

который очень плохо для моего здоровья, так как она включает в себя связывание этого проклятому обработчику каждый раз, когда новое поле ввода добавляется в DOM. Хуже того, я понятия не имею, с чем нужно связываться в случае сложных виджетов, таких как CodeMirror.

Не знаю, если моя проблема имеет смысл, возможно, я использую неправильный подход? Я также попытался привязки к объектам, но это не сработало: window, document, body, div[contains the whole page]

NB: Вы можете try it out here.

+0

Возможно, вы можете использовать 'on()' здесь? поэтому он будет работать с каждым добавленным материалом. Или я чего-то не хватает? –

+0

@Topener Я не хочу * просто * связывать все * текущие * входы, но любые * будущие * тоже. Красота добавления событий таким образом заключается в том, что вам не нужны глобальные переменные, чтобы содержать ваши функции обработки событий, вы просто делаете это один раз, когда это необходимо. – Christian

+0

Но дело здесь не в том, что я добавляю события, но функциональность горячих клавиш должна делать сама. Я хочу сказать, что это горячая клавиша. Нажатие 'ctrl + s' в редакторе Netbeans дает тот же эффект от этого в списке проектов netbeans (в качестве примера). – Christian

ответ

6

Это на самом деле предназначена функциональность плагина:

// Don't fire in text-accepting inputs that we didn't directly bind to 
if (this !== event.target && (/textarea|select/i.test(event.target.nodeName) || 
    event.target.type === "text")) { 
    return; 
} 
+0

Ну, честно говоря, я не знаю, как исправить свою проблему, не изменяя этот код :( – Christian

+0

Я полагаю, что могу перейти к отключению функции ... затем отправьте патч на Resig's ... – Christian

+0

Да, я не вижу способа обойти это, не модифицируя плагин каким-то образом. –

1

Да, JqueryHotkeys провалились, если пользователь запускает горячую клавишу, когда внутри поля ввода.

В качестве альтернативы, когда я просматривал, я узнал shortcut.js, что обеспечивает аналогичную функциональность, как у Jquery-Hotkeys.

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

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