我的Rangy库将通过统一 IE < 9 和所有其他主要浏览器中的不同 API,并getNodes()
在其 Range 对象上提供一个函数,为您提供帮助:
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();
没有范围:
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);