обходной путь для ошибки ckeditor, исправляющей ошибку divs?

#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.$);
    }
};