我建立了一个自己的所见即所得编辑器。
我有这个简单的html
<div contenteditable="true" class="editor"></div>
当我在div中选择文本时:
,然后按“ B”按钮将所选文本加粗:
我的光标在第一行中,在“ hello”一词之前。 我想要的是,光标位于加粗文本的后面。
当我单击按钮时,将调用此函数:(参数元素为:“ b”)
function handleToolbarButtonClick(element) {
let selection = window.getSelection();
let editor = $('.wysiwyg-editor .editor[contenteditable]');
if (selection.baseOffset === selection.anchorOffset &&
selection.baseOffset === selection.extentOffset &&
selection.baseOffset === selection.focusOffset) {
//Toggle the html element tag.
Wysiwyg.config.tags[element].enabled = Wysiwyg.config.tags[element].enabled
? false
: true;
} else {
//Wrap the selected text
wrapSelectedText(element);
}
//Focus editor to set the cursor position
let range = new Range();
editor.focus();
}
当我单击按钮并且未选择任何内容时,我想启用粗体样式。 是否选择了内容,我想用此功能包装内容。
function wrapSelectedText(wrapelement) {
if (window.getSelection) {
// not IE case
let selectedText = window.getSelection();
let selectedRange = selectedText.getRangeAt(0);
let newElement = document.createElement(wrapelement);
let documentFragment = selectedRange.extractContents();
newElement.appendChild(documentFragment);
selectedRange.insertNode(newElement);
selectedText.removeAllRanges();
} else if (document.selection && document.selection.createRange && document.selection.type !== "None") {
// IE case
let range = document.selection.createRange();
let selectedText = range.htmlText;
let newText = '<' + wrapelement + '>' + selectedText + '</' + wrapelement + '>';
document.selection.createRange().pasteHTML(newText);
}
}
如果仅将enable属性切换为粗体并使编辑器聚焦,则光标将位于旧位置。 但是我不知道如何将光标设置为最后一个位置,或者将光标设置为加粗的单词的末尾。
你知道吗?
当我单击按钮并且所选文本以粗体显示时,您知道删除粗体标记的好方法吗?
国王问候
P.S .:我在Codepen上创建了此函数 Example