我正在使用CodeMirror和jQuery在宠物PoC项目上提供语法高亮显示。它一直做得很好,直到我意识到CodeMirror似乎以这样一种方式捕获DOM上的按键事件,当我当前在启用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
对象似乎没有被规范化,因为在hotkey
范围内引用e.shiftKey
这样的小事会返回undefined
。(我确实得到e.type
正确的keydown
或keypress
虽然,所以我知道我在传递一个event
对象。)
是否有什么我错过了这里,导致我的event
有缺失的属性,或者我只是搞砸了?
我当然可以返回并访问原始事件属性,但是,嘿,我真的很希望能够像下一个人一样在我需要的任何地方使用jquery规范化对象(浏览器不可知论只是开始)。
$.Event
用于创建自定义事件,即稍后自己触发它们。你想要$.event.fix
.
var cm = CodeMirror.fromTextArea(someTextArea, {
onKeyEvent : function (editor, e) {
hotkey($.event.fix(e));
}
});