#javascript #ckeditor #fckeditor
#javascript #ckeditor #fckeditor
Вопрос:
Есть предложения или обходные пути для этой ошибки?
http://dev.ckeditor.com/ticket/6436
мне действительно нужно обойти эту ошибку, поскольку мне нужно удалить целые divs с одним пробелом в области редактора в CKEditor. но при вставке divs становятся вложенными из-за ошибки. Таким образом, удаление отдельных divs становится невозможным.
Ответ №1:
Вот обходной путь, который я, наконец, разработал —http://thecamelcase.com/2011/06/reining-in-the-cursor-in-ckeditor /
Ответ №2:
Я столкнулся с этой же проблемой, и, к сожалению, ссылка на исправление, сделанное ghostCoder, больше не доступна.
В дополнение к проблеме с вложенными divs, мы принудительно вставили как обычный текст (поэтому данные вставляются как обычный текст, если не используется «вставить из word»), и мы используем div в качестве нашего режима ввода. Во вставленных данных разрывы строк были заменены тегами <br />, тогда как мы хотели, чтобы каждая строка была оболочкой внутри элемента.
Вот как я в конечном итоге решил проблему. Вы должны знать, что мы не изменяли параметр конфигурации autoParagraph, поэтому по умолчанию он равен true, и я не рекомендую отключать его на уровне конфигурации. Я постараюсь хорошо закодировать это решение, чтобы вы получили хорошее представление о том, что здесь на самом деле сделано.
config.on.instanceReady = function(e) {
var enterMode = e.editor.config.enterMode, elem = 'div';
if(enterMode === CKEDITOR.ENTER_P) {
elem = 'p';
}
// We didn't encounter any issues when using br as enterMode so
// continue only if enterMode is div or p element
if(enterMode === CKEDITOR.ENTER_DIV || enterMode === CKEDITOR.ENTER_P) {
// Disable autoParagraph in initialization to avoid nested div issue.
// When autoParagraph is manipulated this way it will still be active
// later on so if you write some inline content in source mode it
// will be properly wrapped inside <p> or <div> element.
e.editor.config.autoParagraph = false;
// Handle paste event to get rid of <br /> line breaks issue
e.editor.on('paste', function(evt) {
var data = '';
// Stop event, handle everything here manually
evt.stop();
// Get data either from event's text or html property
if(evt.data.text) {
// Remove HTML markup from pasted data
data = evt.data.text.replace(/(<([^>] )>)/ig, '');
// Replace all line breaks with </div><div> or </p><p> markup
// And wrap the whole content inside <div> or <p> element
data = '<' elem '>'
data.replace(/rn|r|n/g, '</' elem '><' elem '>')
'</' elem '>';
} else {
// If data was not pasted as plain text just
// get data as is from event's html property
data = evt.data.html;
}
// Insert HTML data to editor
evt.editor.insertHtml(data);
// Fire afterPaste manually as we have stopped the event
// and afterPaste wouldn't get triggered otherwise
evt.editor.fire( 'afterPaste' );
}, e.editor.element.$);
}
};