gpt4 book ai didi

javascript - 获取范围相对于其父容器的开始和结束偏移量

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:01 26 4
gpt4 key购买 nike

假设我有这个 HTML 元素:

<div id="parent">
Hello everyone! <a>This is my home page</a>
<p>Bye!</p>
</div>

然后用户用鼠标选择“home”。

我希望能够确定有多少字符进入 #parent 他的选择开始(以及有多少字符从 #parent 他的选择结束)。即使他选择了 HTML 标记,这也应该起作用。 (我需要它在所有浏览器中工作)

range.startOffset看起来很有希望,但它只是相对于范围的直接容器的偏移量,并且仅当容器是文本节点时才是字符偏移量。

最佳答案

更新

正如评论中所指出的,我的原始答案(下方)仅返回选择的末尾或插入符号位置。调整代码以返回开始和结束偏移量相当容易;这是一个这样做的例子:

function getSelectionCharacterOffsetWithin(element) {
var start = 0;
var end = 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.startContainer, range.startOffset);
start = preCaretRange.toString().length;
preCaretRange.setEnd(range.endContainer, range.endOffset);
end = 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("EndToStart", textRange);
start = preCaretTextRange.text.length;
preCaretTextRange.setEndPoint("EndToEnd", textRange);
end = preCaretTextRange.text.length;
}
return { start: start, end: end };
}

function reportSelection() {
var selOffsets = getSelectionCharacterOffsetWithin( document.getElementById("editor") );
document.getElementById("selectionLog").innerHTML = "Selection offsets: " + selOffsets.start + ", " + selOffsets.end;
}

window.onload = function() {
document.addEventListener("selectionchange", reportSelection, false);
document.addEventListener("mouseup", reportSelection, false);
document.addEventListener("mousedown", reportSelection, false);
document.addEventListener("keyup", reportSelection, false);
};
#editor {
padding: 5px;
border: solid green 1px;
}
Select something in the content below:

<div id="editor" contenteditable="true">A <i>wombat</i> is a marsupial native to <b>Australia</b></div>
<div id="selectionLog"></div>

这是一个函数,它将获取插入符在指定元素中的字符偏移量;然而,这是一个天真的实现,几乎肯定会与换行符不一致,并且不会尝试处理通过 CSS 隐藏的文本(我怀疑 IE 会正确地忽略此类文本,而其他浏览器不会)。妥善处理所有这些东西会很棘手。我现在attempted it对于我的 Rangy图书馆。

实例:http://jsfiddle.net/TjXEG/900/

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;
}

关于javascript - 获取范围相对于其父容器的开始和结束偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24198028/

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