Я использую CodeMirror вместе с jQuery для обеспечения подсветки синтаксиса в любимом PoC-проекте. Это было здорово, пока я не осознал, что CodeMirror, кажется, захватывает события нажатия клавиш на DOM таким образом, что он не дает работать горячим клавишам приложений global , когда я в настоящее время набираю текстовую область с поддержкой CM .
Для простоты предположим, что у меня на странице есть следующий слушатель:
var hotkey = function (e) {
if (e.shiftKey) { alert('foo'); }
};
$(document).keypress(hotkey);
Это будет работать везде на странице, кроме случаев, когда у меня в фокусе текстовая область CM.
Чтобы попытаться обойти это, я попытался использовать параметр CM onKeyEvent, а также попытаться нормализовать объект event
, передаваемый обработчиком CM, с помощью jQuery.Event
, например, так:
var cm = CodeMirror.fromTextArea(someTextArea, {
onKeyEvent : function (editor, event) {
hotkey($.Event(event));
}
});
Это успешно передает события keydown
и keypress
на мой обработчик hotkey
.
Проблема в том, что «нормализованный» объект event
не выглядит достаточно нормализованным, так как ссылка на что-то тривиальное, как e.shiftKey
в области действия hotkey
, возвращает undefined
. (Я получаю e.type
правильно как keydown
или keypress
, хотя, поэтому я знаю, что передаю объект event
.)
Есть ли что-то, чего я здесь упускаю, из-за чего у моего event
отсутствуют свойства, или я просто облажался?
Я определенно мог бы просто вернуться назад и получить доступ к необработанным свойствам событий, но, эй, я бы очень хотел иметь возможность использовать нормализованные объекты jQuery так же, как и следующий парень, где мне больше всего нужно (и браузер-агностицизм только начало).