【发布时间】:2017-12-06 14:45:58
【问题描述】:
我一直在搜索很多与范围和选择相关的问题(大部分由 @tim-down 回答),但我无法完全得到我需要的东西,尽管我已经接近了。
我想在当前聚焦的文本节点中搜索单词foo。如果我找到它 - 将其替换为 bar 并将插入符号位置设置在替换单词的末尾。例如:
"Lorem ipsum dolor foo amet, consectetur adipiscing elit."
变成:
"Lorem ipsum dolor bar amet, consectetur adipiscing elit."
// -------------------^--- caret position
我的尝试
我目前所拥有的只是中途 - 它删除了文本,但没有添加任何内容。不过,我不确定这是不是最好的方法:
function replacer(search, replace) {
var sel = window.getSelection();
if (!sel.focusNode) {
return;
}
var startIndex = sel.focusNode.nodeValue.indexOf(search);
var endIndex = startIndex + search.length;
if (startIndex === -1) {
return;
}
var range = document.createRange();
range.setStart(sel.focusNode, startIndex);
range.setEnd(sel.focusNode, endIndex);
range.insertNode(document.createTextNode("bar"));
sel.removeAllRanges();
sel.addRange(range);
}
document.addEventListener("keypress", function() {
replacer("foo", "bar");
});
<div contenteditable="true" style="width: 600px; height: 300px;">Lorem ipsum dolor foo amet, consectetur adipiscing elit.</div>
注意:我只关心与 Chrome 的兼容性。
【问题讨论】:
-
如果您的 contenteditable 中有多个
foo怎么办?应该发生什么,光标应该放在哪里? -
@vsync 插入符号应该放在最后出现的
foo
标签: javascript range selection contenteditable