【发布时间】:2020-10-15 00:13:21
【问题描述】:
我需要将光标位置的元素(在可编辑的div内)分成两部分,然后在其之间插入一个自定义元素。
在进行更改之前: (竖线“|”表示光标的位置。我用“|”表示光标所在的位置给你。但实际上,这个字符在文本中是不存在的。)
<div contenteditable="true">
<span style="font-size='14px'">this is | a test</span>
<p>other paragraphs .....</p>
</div>
修改后:
<div contenteditable="true">
<span style="font-size:'14px'">this is </span><span style="font-size:'16px'">new text|</span><span style="font-size:'14px'">a test</span>
<p>other paragraphs .....</p>
</div>
需要注意的是,修改后,光标必须插入到新的自定义元素最后一个字母之后。
我试了一下,但是:
let sel = window.getSelection();
let range = sel.getRangeAt(0);
if (range.startContainer.parentNode.nodeName === 'SPAN') {
let sel, range, cloneNode1, cloneNode2, cloneText, allContents, contentsBeforeCursor, contentsAfterCursor, newNode
sel = window.getSelection();
range = document.createRange();
range.selectNode(sel.anchorNode);
cloneNode1 = range.commonAncestorContainer.cloneNode();
cloneNode2 = cloneNode1.cloneNode();
cloneText = range.cloneContents();
allContents = cloneText.textContent;
contentsBeforeCursor = allContents.substring(0, sel.anchorOffset);
contentsAfterCursor = allContents.substring(sel.anchorOffset, allContents.length);
cloneNode1.textContent = contentsBeforeCursor
cloneNode2.textContent = contentsAfterCursor
newNode = document.createElement('SPAN');
for (let i = 0; i < cloneNode1.attributes.length; i++) {
let attr = cloneNode1.attributes.item(i);
newNode.setAttribute(attr.nodeName, attr.nodeValue);
}
newNode.style.fontSize = '13px';
range.selectNode(sel.anchorNode.parentNode);
range.deleteContents();
range.insertNode(cloneNode1)
range.insertNode(newNode)
range.insertNode(cloneNode2)
newNode.focuse();
https://jsfiddle.net/nekooee/0h8zcfv4/43/
这是为了改变 SPAN 中间的字体。 CKEditor 也是如此。
【问题讨论】:
-
@ggorlen 我编辑了我的问题并添加了最少的尝试代码。谢谢
-
获取 div 的
innerHTML。说:var innerHTML=div.innerHTML。然后:innerHTML.split("|").join("element to be inserted here")。然后:div.innerHTML=innerHTML。或者,一行:div.innerHTML=div.innerHTML.split("|").join("element to be inserted here")。 -
如果要拆分周围的元素,则需要获取打开和关闭部分并复制它们:关闭、插入、打开。使用
split&join或.indexOf... -
@iAmOren 谢谢。您的第一个代码无法使用,因为您已经考虑了所有 div 内容。那里还有其他元素。只能根据光标获取元素。您发表的第二条评论是正确的。但是不知道怎么写?
-
@iAmOren 我用了“|”显示光标所在的位置。但实际上,文本中并不存在这个字符。请帮帮我。
标签: javascript html