gpt4 book ai didi

javascript - 如何根据插入符号位置突出显示文本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:27:43 25 4
gpt4 key购买 nike

我想要一个按钮来为当前选定的文本添加高亮显示。我计划用选择的插入位置来做到这一点。我有以下代码:

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 showCaretPos() {
var el = document.getElementById("test");
var caretPosEl = document.getElementById("caretPos");
caretPosEl.innerHTML = "Caret position: " + getCaretCharacterOffsetWithin(el);
}

document.body.onkeyup = showCaretPos;
document.body.onmouseup = showCaretPos;
Non-editable text. Editable is below:
<div id="test" contenteditable="true">Hello, some <b>bold</b> and <i>italic and <b>bold</b></i> text</div>
<div id="caretPos"></div>

上面的代码找到插入符号的位置。我现在如何使用插入符号位置仅突出显示该文本位置。

可能的想法现在从上方获取插入符位置 substr()添加亮点。 str.substr(above caret position) .

实现此目标的最佳方法是什么?

编辑

我不想更改颜色选择。我只想使用插入符号位置然后添加一个用作荧光笔的 div。例如:

Hi, my name is Bob.

现在,我使用插入符号位置来跟踪我的文本选择的位置。现在,我用原始文本替换了文本,但也用一个 div 来进行文本选择。

假设我想突出显示短语name is。我正在使用这种使用插入符位置的方法来不突出显示该短语的每个实例。只有短语所在的确切位置。例如,假设我的文本有两次 name is 短语,它只会突出显示与插入符号位置匹配的短语。然后,将文本替换为:<div id='highlight'> name is </div>

最佳答案

在下面的代码片段中有 2 个函数做同样的事情,除了第一个使用 <span>。第二个使用 <div> .函数的作用本质上是......

  1. ...删除选定的内容(文本)...
  2. ...创建一个 <span><div> ...
  3. ...设置 backgroundColor变黄……
  4. ...然后将内容附加到 <span/div> ...
  5. ...然后最后是<span/div>被插入 range .

<span>如您所见,这可能是更好的选择。使用 <div>简直是一团糟。

片段

var spanEdit = document.getElementById('spanEdit');
var divEdit = document.getElementById('divEdit');

function highlightSpan() {
var range = document.getSelection().getRangeAt(0);
var contents = range.extractContents();
var node = document.createElement('span');
node.style.backgroundColor = "yellow";
node.appendChild(contents);
range.insertNode(node);
}

function highlightDiv() {
var range = document.getSelection().getRangeAt(0);
var contents = range.extractContents();
var node = document.createElement('div');
node.style.backgroundColor = "yellow";
node.appendChild(contents);
range.insertNode(node);
}

spanEdit.onkeyup = highlightSpan;
spanEdit.onmouseup = highlightSpan;

divEdit.onkeyup = highlightDiv;
divEdit.onmouseup = highlightDiv;
<div id='spanEdit' contenteditable="true">Highlight inserted span. This uses extractContents() method.</div>
<div>&nbsp;</div>
<div id='divEdit' contenteditable="true">Highlight inserted div. This uses extractContents() method.</div>

这些函数改编自此 post

关于javascript - 如何根据插入符号位置突出显示文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173074/

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