Нормализация CodeMirror OnKeyEvent с помощью jQuery - PullRequest
3 голосов
/ 05 мая 2011

Я использую 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 так же, как и следующий парень, где мне больше всего нужно (и браузер-агностицизм только начало).

1 Ответ

3 голосов
/ 19 мая 2011

$.Event - для создания пользовательских событий, то есть для их последующего самостоятельного запуска. Вы хотите $.event.fix.

var cm = CodeMirror.fromTextArea(someTextArea, {
    onKeyEvent : function (editor, e) {
        hotkey($.event.fix(e));
    }
});
...