【发布时间】:2016-05-26 22:13:15
【问题描述】:
正如标题所说,在通过单击选定区域取消选择后,我试图在内容可编辑的 div 中找到用户的插入符号位置。
虽然从 Document.getSelection() 调用中根据锚/焦点节点和锚/焦点偏移等属性生成范围来获取插入符号位置在大多数情况下都可以正常工作,但我注意到当我突出显示一个文本块时通过在选择范围内单击取消选择,与(例如)“mouseup”事件相关的函数调用仍然认为在此期间选择了选择范围。
如果您要在调用“mouseup”的函数中放置一个断点(在本例中为以下代码中的 showCaretPos()),这显然是正确的,当文本仍在时,该函数在“mouseup”上调用它处于选中状态。
然而,在“mouseup”相关函数被触发后再次运行一个函数来检查插入符号的位置时,我们会得到插入符号应该在哪里的正确偏移量。
之后,插入符号被放置在用户在他们的选择中单击的位置,我想知道是否有一种方法可以在取消选择后根据节点和偏移量。
基本上是第二个示例链接,但为了粘贴方便而放在一起:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<title>Sandbox</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
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>
</body>
<script>
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;
</script>
</html>
来自问题Get a range's start and end offset's relative to its parent container的示例1
JSFiddle:http://jsfiddle.net/TjXEG/900/
来自问题Javascript: How to detect if a word is highlighted的示例2
JSFiddle http://jsfiddle.net/timdown/SW54T/
【问题讨论】:
标签: javascript jquery html rich-text-editor