Я действительно нашел решение.Это не идеально, и я рассматриваю возможность интегрировать codemirror , как предложено Mrchief.Единственная проблема заключается в том, что мое текущее решение позволяет мне редактировать разметку, которая будет сохранена в серверной части и отображена позже.Это действительно WYSIWYG.Я должен отметить, что мой редактор является частью большей contenteditable статьи, в которой я хочу, чтобы добавить некоторые фрагменты кода.
1004 * Используя редактор, как CodeMirror было бы удивительным, но Id должны лишить его перед сохранением и мойблоки кода должны отображаться в виде текстовой области (а не в виде RSS, как раньше).
В любом случае, для всех, кто интересуется здесь, есть мое решение / хак.вложенные теги <pre>
и т. д. в contenteditables, если они заключены в элемент с contenteditable="false"
.Поэтому вместо вставки:
<pre>some code</pre
я вставил:
<code contenteditable="false"><pre>code snippet here</pre>
Затем я добавил делегата следующим образом.
var getFirstRange = function() {
var sel = rangy.getSelection();
return sel.rangeCount ? sel.getRangeAt(0) : null;
}
contenteditablediv
.delegate('pre', 'keydown', function(event) {
switch(event.keyCode) {
case 13:
var range = getFirstRange(),
added = false,
newline = document.createTextNode('\r\n');
if (range) {
range.insertNode(newline);
range.setEndAfter(newline);
range.setStartAfter(newline);
var sel = rangy.getSelection();
sel.setSingleRange(range)
added = true;
}
if (added) {
event.preventDefault();
}
break;
case 9:
// insert a tab
var range = getFirstRange(),
tab = document.createTextNode('\t');
if (range) {
range.insertNode(tab);
var sel = rangy.getSelection();
range.setEndAfter(tab);
range.setStartAfter(tab);
sel.setSingleRange(range)
}
return false;
}
}).delegate('pre', 'click', function() {
$(this).attr('contenteditable', true);
}).delegate('pre', 'blur', function() {
$(this).removeAttr('contenteditable');
});
Это событие происходит.Я добавил удаление клика / размытия, чтобы переключить contenteditable на внутреннем предварительном теге, чтобы после этого это не сохранялось, но это можно сделать на стороне сервера.Это позволяет мне вставлять символы \ t в клавишу табуляции и \ r \ n вместо br.