Вставка HTML перед элементом в CKEditor

каков наилучший способ программной вставки HTML (представляющего виджет CKEditor) перед существующим элементом в CKEditor?

редактируемый контент не находится в фокусе и в настоящее время не редактируется.

например, предположим, что содержимое редактора являются:

<h1>Here's a title</h1>
<h2>Here's a subtitle</h2>
<p>Here's a paragraph</p>
<p>Here's a paragraph</p>
<p>Here's a paragraph</p>

теперь, скажем, у меня есть ссылка на второй <p> элемент. Каков наилучший способ вставки html перед этим тегом? (Имея в виду, что HTML, который я хочу вставить будет станьте виджетом Ckeditor после вставки.)

большое спасибо за любую помощь,

Михаил

3 ответов


С в текущем API невозможно вставить строку HTML в определенную позицию без привлечения выделения (редактировать: так как CKEditor 4.5.0 можно-читайте ниже), потому что editor.insertHtml метод вставляет в позицию выбора. Однако, если у вас есть простая ситуация, что ваша строка HTML содержит только один элемент (с некоторыми предками), то вы можете легко использовать editor.insertElement на более низком уровне, когда вы можете укажите диапазон, в который вы хотите вставить элемент:

var range = editor.createRange(),
    element = CKEDITOR.dom.element.createFromHtml( elementHtml );

// Place range before the <p> element.
range.setStartAt( elementP, CKEDITOR.POSITION_BEFORE_START );
// Make sure it's collapsed.
range.collapse( true );

// Insert element at the range position.
editor.editable().insertElement( element, range );

как вы можете видеть этот код использует editable.insertElement, которым пользуется editor.insertElement.

PS. Запомните это insertElement не будет передавать и инициализировать виджет. Вы можете найти больше об этом здесь -CKEditor, инициализировать виджет добавлен с insertElement.

С 4.5.0

введен CKEditor 4.5.0 editor.editable().insertHtmlIntoRange() а также


Если вы хотите вставить элемент между или за пределами пунктов тег С CKEditor.POSITION_BEFORE_START флаг не будет работать, потому что элемент все равно будет помещен внутри на <p></p> узел.

однако С CKEditor.дом.узел.insertBeforeMe () метод разместит новый элемент перед любым узлом редактора без его упаковки или ограничения его текстовым узлом.

var startRange = editor.getSelection(); //Cursor position
var parent = startRange.getStartElement(); //The parent <p> or <span> of the cursor

var e1 = CKEDITOR.dom.element.createFromHtml("<h3>Subtitle before paragraphs</h3>");
parent.insertBeforeMe(e1); //Places new node before the specified node

надеюсь, что это помогает!


его гладко просто, как это

$(document).ready(function(){
    $("#add1").click(function(){
       CKEDITOR.instances.editor2.insertHtml( '<ul><li>Computers & Electronics</li></ul>' );
    });
 });