gpt4 book ai didi

javascript - 当多行内容可编辑时,替换光标前的单词

转载 作者:搜寻专家 更新时间:2023-10-31 08:13:25 24 4
gpt4 key购买 nike

我想替换 contenteditable div 中光标前的单词(另请参见 Detect the last written word when typing TAB in a textarea or contenteditable div)。

以下代码:

  1. 完全适用于 contenteditable div 的第一段

  2. 不适用于 contenteditable div 的下一段:

    Uncaught IndexSizeError: Failed to execute 'setStart' on 'Range': The offset 71 is larger than the node's length (38).

我应该如何修改以下代码以使其在 contenteditable div 的第 2 行中按 TAB 键时起作用?

document.addEventListener("keydown", function(e) {
var elt = e.target;
if (elt.isContentEditable)
{
if (e.keyCode == 9) {
e.preventDefault();
elt.focus();
range = document.getSelection().getRangeAt(0).cloneRange();
range.collapse(true);
range.setStart(elt, 0);
var words = range.toString().trim().split(' ');
var lastWord = words[words.length - 1];
if (lastWord) {
var wordStart = range.toString().lastIndexOf(lastWord);
var wordEnd = wordStart + lastWord.length;
range.setStart(elt.firstChild, wordStart);
range.setEnd(elt.firstChild, wordEnd);
range.deleteContents();
document.execCommand('insertText', false, "hello\nnewline");
elt.normalize();
}
}
}
});
<div contenteditable>Hello, click here and press TAB to replace this WORD<br>Also click here and press TAB after this ONE</div>


注意:我已经测试了来自 Replace specific word in contenteditable 的答案但是当 contenteditable div 中有多行时它不起作用。

最佳答案

这个有效:

document.addEventListener("keydown", function(e) {
var elt = e.target;
if (elt.isContentEditable)
{
if (e.keyCode == 9) {
e.preventDefault();
elt.focus();
sel = document.getSelection();
sel.modify("extend", "backward", "word");
range = sel.getRangeAt(0);
console.log(range.toString().trim());
range.deleteContents();
var el = document.createElement("div");
el.innerHTML = '<b>test</b> and a <a href="hjkh">link</a>';
var frag = document.createDocumentFragment(), node;
while (node = el.firstChild) {
frag.appendChild(node);
}
range.insertNode(frag);
range.collapse();
}
}
});
<div contenteditable>Hello, press TAB to replace this WORD<br>Also press TAB after this ONE</div>

这是一个 full solution对于 textarea 和 contenteditable div

关于javascript - 当多行内容可编辑时,替换光标前的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50817526/

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