gpt4 book ai didi

javascript - 更改 contenteditable 后恢复光标位置

转载 作者:技术小花猫 更新时间:2023-10-29 12:33:52 25 4
gpt4 key购买 nike

有这样的html:

<div contenteditable="true" class="value research-form thumbnail">
Some text here
</div>

div 的内容应该在用户键入时动态突出显示一些单词,例如:

 <div contenteditable="true" class="value research-form thumbnail">
Some text here <span style="background-color: yellow">highlight</div> it
</div>
<script>
$(document).ready(function () {
var input = $('#textarea').on('input', function (event) {
var newText = input.text().replace('highlight', '<span style="background-color: yellow">highlight</div>');
input.html($.parseHTML(newText));
});
});
</script>

但是有一个问题:当我刷新 div 中的文本时,光标移动到输入文本的开头。

有什么方法可以在更改 contenteditable 值后恢复光标位置?还是有其他方法可以达到同样的效果?

最佳答案

我找到了解决方案。

完整代码如下:

<div class="container" style="margin-top: 10px">

<div class="thumbnail value" contenteditable="true">

</div>

</div>

<script>
$(document).ready(function () {
function getCaretCharacterOffsetWithin(element) {
var caretOffset = 0;
var doc = element.ownerDocument || element.document;
var win = doc.defaultView || doc.parentWindow;
var sel;
if (typeof win.getSelection != "undefined") {
sel = win.getSelection();
if (sel.rangeCount > 0) {
var range = win.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(element);
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
}
} else if ((sel = doc.selection) && sel.type != "Control") {
var textRange = sel.createRange();
var preCaretTextRange = doc.body.createTextRange();
preCaretTextRange.moveToElementText(element);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
caretOffset = preCaretTextRange.text.length;
}
return caretOffset;
}

function setCaretPosition(element, offset) {
var range = document.createRange();
var sel = window.getSelection();

//select appropriate node
var currentNode = null;
var previousNode = null;

for (var i = 0; i < element.childNodes.length; i++) {
//save previous node
previousNode = currentNode;

//get current node
currentNode = element.childNodes[i];
//if we get span or something else then we should get child node
while(currentNode.childNodes.length > 0){
currentNode = currentNode.childNodes[0];
}

//calc offset in current node
if (previousNode != null) {
offset -= previousNode.length;
}
//check whether current node has enough length
if (offset <= currentNode.length) {
break;
}
}
//move caret to specified offset
if (currentNode != null) {
range.setStart(currentNode, offset);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}

function onInput(event) {
var position = getCaretCharacterOffsetWithin(input.get(0));
var text = input.text();
text = text.replace(new RegExp('\\btest\\b', 'ig'), '<span style="background-color: yellow">test</span>');
input.html($.parseHTML(text));
setCaretPosition(input.get(0), position);
}

var input = $('.value').on('input',onInput);

//content should be updated manually to prevent aditional spaces
input.html('simple input test example');
//trigger event
onInput();
});
</script>

关于javascript - 更改 contenteditable 后恢复光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26139475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com