我的Rangy库可以在IE < 9和其他主要浏览器中统一不同的API,并在Range对象上提供getNodes()
函数,这将帮助您处理部分问题:
function getSelectedNodes() {
var selectedNodes = [];
var sel = rangy.getSelection();
for (var i = 0; i < sel.rangeCount; ++i) {
selectedNodes = selectedNodes.concat( sel.getRangeAt(i).getNodes() );
}
return selectedNodes;
}
在所有浏览器中获取所选文本都很容易。在Rangy中只需要使用以下代码:
var selectedText = rangy.getSelection().toString()
没有使用Rangy:
function getSelectedText() {
var sel, text = "";
if (window.getSelection) {
text = "" + window.getSelection();
} else if ( (sel = document.selection) && sel.type == "Text") {
text = sel.createRange().text;
}
return text;
}
关于字符偏移量,您可以针对选择中的任何节点
node
做如下处理。请注意,这并不一定代表文档中可见的文本,因为它没有考虑折叠的空格、通过 CSS 隐藏的文本、通过 CSS 放置在正常文档流之外的文本、
<br>
和块元素隐含的换行符以及其他细微差别。
var sel = rangy.getSelection();
var selRange = sel.getRangeAt(0);
var rangePrecedingNode = rangy.createRange();
rangePrecedingNode.setStart(selRange.startContainer, selRange.startOffset);
rangePrecedingNode.setEndBefore(node);
var startIndex = rangePrecedingNode.toString().length;
rangePrecedingNode.setEndAfter(node);
var endIndex = rangePrecedingNode.toString().length;
alert(startIndex + ", " + endIndex);
parentContainer()
没有帮助:两个分支不能保证返回相同的内容,因为 IE 的TextRange
的parentElement()
方法总是会返回一个元素,而commonAncestorContainer
可能是一个文本节点。此外,没有必要进行任何浏览器嗅探(如使用msie
所示):您可以轻松检测到所需的对象和方法。 - Tim DowngetSelection
函数;window.getSelection
和getSelection
是同一件事,因此通过覆盖内置函数,您将无法再访问内置的getSelection
,而是会不断调用自己的getSelection
。 - Sapphire_Brick