【发布时间】:2018-02-03 06:13:33
【问题描述】:
我想创建脚本,将<span> 添加到 contenteditable div 的每个字母。例如:
如果你在 contenteditable div 中写一些东西,在 HTML 代码中,你会看到:
<div contenteditable="true">
SomeText
</div>
我必须做些什么才能看到这样的东西:
<div contenteditable="true">
<span>S</span>
<span>o</span>
<span>m</span>
<span>e</span>
<span>T</span>
<span>e</span>
<span>x</span>
<span>t</span>
</div>
我写了一些代码(使用Rangy),但它不起作用。您可以在下面看到该代码,但我不推荐它,因为它太长而且正如我所说的那样不起作用。
$('#Box').keypress(function() {
setTimeout(function() {
var selLenght = getCaretCharacterOffsetWithin(document.getElementById('Box'));
var precedingChar = "",
sel, range, precedingRange;
sel = rangy.getSelection();
range = sel.getRangeAt(0).cloneRange();
range.setStart(document.getElementById('Box'), 0);
sel.setSingleRange(range);
sel.removeAllRanges();
range.setStart(document.getElementById('Box'), selLenght - 21);
sel.setSingleRange(range);
/*
var newElem = document.createElement('span');
newElem.className = 'test';
$(newElem).html(range.extractContents());
range.insertNode(newElem);
$('#MainBox > span:empty').remove();
*/
rangy.getSelection().move('character', 0);
});
});
function getCaretCharacterOffsetWithin(element) {
var caretOffset = 0;
if (typeof window.getSelection != "undefined") {
var range = window.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(element);
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
} else if (typeof document.selection != "undefined" && document.selection.type != "Control") {
var textRange = document.selection.createRange();
var preCaretTextRange = document.body.createTextRange();
preCaretTextRange.moveToElementText(element);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
caretOffset = preCaretTextRange.text.length;
}
return caretOffset;
}
div{
width: 400px;
height: 200px;
border: 1px solid black;
}
<script src="https://github.com/timdown/rangy/blob/master/lib/rangy-core.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div contenteditable="true" id="Box"></div>
如何在 JavaScript 和/或 JQuery 和/或免费用于商业用途的外部库中执行类似操作?
感谢您的帮助。
【问题讨论】:
-
例如,在按下提交按钮后,您是否需要在按键时执行此操作?您需要
contentediablediv 还是可以使用textarea? -
我在按键事件和 contenteditable div 中需要这个
标签: javascript html css contenteditable