在非 IE 浏览器中执行此操作的方法是从selectionRange
中获取一个对象。范围有一个开始和结束边界,范围的每个边界都表示为一个节点内的偏移量;如果边界在文本节点内,则此偏移量将是字符偏移量。
例如,如果以下是一个文本节点并且选择由竖线分隔:
"red |widget| blue widget"
...那么您从选择中获得的范围将在文本节点内具有 4 的起始偏移量。
以下将为您提供一个表示选择的范围并提醒开始边界:
var sel = window.getSelection();
var selectedRange = sel.rangeCount ? sel.getRangeAt(0) : null;
if (range) {
alert("Offset " + selectedRange.startOffset
+ " in node " + selectedRange.startContainer.nodeName);
}
Ranges 可以与其他 Ranges 进行比较,因此如果您想知道,例如,如果当前选择出现在上述文本节点中的单词“blue”之后,您可以创建一个包含单词“blue”的 Range,并将其与所选范围:
// Assume the text node is stored in a variable called textNode
var blueRange = document.createRange();
blueRange.setStart(textNode, 11);
blueRange.setEnd(textNode, 15);
var selectionIsAfterBlue =
(selectedRange.compareBoundaryPoints(Range.END_TO_START, blueRange) == 1);
在 IE 中,这些都不起作用,而且一切都以不同的方式完成,通常难度更大。要将其规范化为单一一致的界面,您可以使用我的Rangy库。