您所说的听起来像是DOM Range,它在除 Internet Explorer 之外的所有主要浏览器中都实现了。根据 HTML 中的字符偏移量指定位置不是一个好主意,因为 innerHTML 的实现差异很大。DOM Range 有一个开始和结束边界,每个边界都根据一个节点和该节点内的偏移量来指定。在您的示例中,您可以创建一个表示位置的 Range:
var span = pNode.childNodes[1];
var spanText = span.firstChild;
var range = document.createRange();
// Next line takes into account whitespace at the start of the text node
range.setStart(spanText, 6);
// For illustration, create a range that contains the letter "a" and selects it
range.setEnd(spanText, 7);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
一旦有了 Range,就可以将它用于各种事情,例如插入节点、定义用户选择以及对 Range 封装的内容应用格式。
IE 定义了一个完全不同的对象,称为TextRange,它具有完全不同的基于文本的方法,但用途大致相同。要获得与上一个示例等效的 TextRange,可以使用以下命令:
var textRange = document.body.createTextRange();
textRange.moveToElementText(pNode);
textRange.moveStart("character", 17);
textRange.collapse();
// For illustration, create a range that contains the letter "a" and selects it
textRange.moveEnd("character", 1);
textRange.select();