Как обернуть выделенный текст в ckeditor
Я хотел обернуть выбранные слова в CKEditor в элемент <p>.
Откуда:
<p>This is a paragraph. And this is Selected text.</p>
Кому:
<p>This is a paragraph. And this is</p>
<p class="myclass">Selected text.</p>
Я нашел код:
( function() {
CKEDITOR.plugins.add( 'qna', {
init: function( editor ) {
editor.addCommand( 'insertQnA', {
exec : function( editor ) {
if(CKEDITOR.env.ie) {
editor.getSelection().unlock(true);
var selected_text = editor.getSelection().getNative().createRange().text;
} else {
var selected_text = editor.getSelection().getNative();
}
editor.insertHtml('[before]' + selected_text + '[after]');
}
});
editor.ui.addButton( 'qna', {
label: 'Insert QnA',
command: 'insertQnA',
icon: this.path + 'images/qna.png'
});
}
});
})();
Я хотел заменить [before] и [after] на <p class"myclass"> и </p>, но это не работает.
Я довольно новичок в JS/Jquery. Надеюсь, вы сможете пролить на это свет.
Правка: из ответа Спона.
( function() {
CKEDITOR.plugins.add( 'qna', {
init: function( editor ) {
editor.addCommand( 'insertQnA', {
exec : function( editor ) {
editor.applyStyle(new CKEDITOR.style({
Element : 'p',
Attributes : { class : 'Myclass' },
Styles : { color : '#ff0000','font-family' : 'Courier'}
}));
}
});
editor.ui.addButton( 'qna', {
label: 'Insert QnA',
command: 'insertQnA',
icon: this.path + 'images/question.png'
});
}
});
})();
Приведенный выше код обертывает выбранный текст / слова в элемент <span> для некоторых неизвестная причина.
Пример:
От...
<p>This is a paragraph. And this is Selected text.</p>
К...
<p>This is a paragraph. And this is <span>Selected text.</span></p>
Это не то, чего я хочу.
5 ответов:
exec : function( editor ) { var selected_text = editor.getSelection().getSelectedText(); // Get Text var newElement = new CKEDITOR.dom.element("p"); // Make Paragraff newElement.setAttributes({style: 'myclass'}) // Set Attributes newElement.setText(selected_text); // Set text to element editor.insertElement(newElement); // Add Element }Это все исправит.. Это часть Exec, как вы можете видеть.
Дубликат см. Stackoverflow: CKEditor Selection wrapping
editor.applyStyle(new CKEDITOR.style({Element : 'p', Attributes : { class : 'Myclass' }, Styles : { color : '#ff0000','font-family' : 'Courier' } ));Этот фрагмент кода гарантирует, что если у вас есть выбор нескольких уровней блоков, то вы сохраните одну и ту же структуру. (Если вы сделаете свой P. myclass встроенным вне курса).
<p>This is a paragraph. And this is </p><p> Selected text.</p>Этот пример будет объединен и выведен в виде:
<p>This is a paragraph. </p><p class="myClass">And this is Selected text.</p>Но этот пример:
<div>This is a paragraph. And this is</div><div> Selected text.</div>Этот пример будет объединен и выведен в виде:
<div>This is a paragraph. <P class="myclass">And this is</p></div><div><P class="myclass"> Selected text.</p></div>
Стоит отметить CKEDITOR.синтаксис стиля (по-видимому) изменился в CKEditor 4; чтобы использовать редактор.applyStyle () (что предпочтительнее в некоторых случаях, чтобы вы не получили кучу вложенного HTML), измените строфу
editor.applyStyle()во втором примере вопроса на:editor.applyStyle(new CKEDITOR.style({ element : 'p', attributes : { class : 'Myclass' }, styles : { color : '#ff0000','font-family' : 'Courier'} }) );Обратите внимание, что все клавиши теперь записаны в нижнем регистре.
Было бы действительно полезно, если бы они задокументировали это-единственная документация там на данный момент говорит "TODO..."!
Он работает как для изображения, так и для текста в ckeditor
var selection = CKEDITOR.instances['content'].getSelection(); if (selection.getType() == CKEDITOR.SELECTION_ELEMENT) { var selectedContent = selection.getSelectedElement().$.outerHTML; } else if (selection.getType() == CKEDITOR.SELECTION_TEXT) { if (CKEDITOR.env.ie) { selection.unlock(true); selectedContent = selection.getNative().createRange().text; } else { selectedContent = selection.getNative(); console.log("The selectedContent is: " + selectedContent); } }Здесь содержание-textarea id
Если вы хотите универсальное решение, которое работает как с выделением текста, так и с любым количеством элементов, то это будет работать:
var selectedHtml = ""; var selection = editor.getSelection(); if (selection) { selectedHtml = getSelectionHtml(selection); } editor.insertHtml('something' + selectedHtml + 'something');Вам понадобятся две дополнительные функции:
Обратите внимание, что в CKEditor 4.5 у вас действительно есть функция/** Get HTML of a range. */ function getRangeHtml(range) { var content = range.extractContents(); // `content.$` is an actual DocumentFragment object (not a CKEDitor abstract) var children = content.$.childNodes; var html = ''; for (var i = 0; i < children.length; i++) { var child = children[i]; if (typeof child.outerHTML === 'string') { html += child.outerHTML; } else { html += child.textContent; } } return html; } /** Get HTML of a selection. */ function getSelectionHtml(selection) { var ranges = selection.getRanges(); var html = ''; for (var i = 0; i < ranges.length; i++) { html += getRangeHtml(ranges[i]); } return html; }getHtml, поэтомуgetRangeHtmlможно упростить с помощьюcontent.getHtml(). Смотрите documentFragment doc.
Comments