如何保存和恢复anchorNode / anchorOffset& focusNode / focusOffset?

时间:2013-04-24 10:09:33

标签: javascript range getselection addrange

在以下代码中:

var s=window.getSelection();
var sr=s.getRangeAt(0);

console.log(s.anchorOffset+" "+s.focusOffset);

s.removeAllRanges();
s.addRange(sr);

console.log(s.anchorOffset+" "+s.focusOffset);

替换范围时会交换anchorOffset和focusOffset。即,无论选择从哪一端实际开始和结束,锚都会重置到选择的最左端并将焦点重置到最右边。添加范围(或至少未存储)时,似乎忽略了锚点和焦点,并且默认并假定左锚点和右焦点。

这是一个该死的麻烦!

我并不抱太大希望,但我有什么办法可以解决这个问题。我真的很想能够恢复原来的锚和焦点位置。

在chrome和firefox中也一样。

修改

好的已经找到了部分答案:

var s=window.getSelection();
var sr=s.getRangeAt(0);

console.log(s.anchorOffset+" "+s.focusOffset);

var aN=s.anchorNode,aO=s.anchorOffset,fN=s.focusNode,fO=s.focusOffset;

s.removeAllRanges();
s.addRange(sr);

s.collapse(aN,aO);
s.extend(fN,fO);

console.log(s.anchorOffset+" "+s.focusOffset);

然而,这在IE9 +中不起作用,因为IE没有实现extend方法。那么问题就变成了,如何让IE在这方面发挥出色呢?

1 个答案:

答案 0 :(得分:1)

没有。这在IE中是不可能的。我在一年前提出了bug in the IE bug tracker,建议他们实施extend(),但事情并没有发生,现在他们已经关闭了似乎不太可能在短期内发生的错误。

更新:IE错误已重新打开,因此有希望。

以下是我对两个类似问题的回答: