在以下代码中:
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在这方面发挥出色呢?
答案 0 :(得分:1)
没有。这在IE中是不可能的。我在一年前提出了bug in the IE bug tracker,建议他们实施extend()
,但事情并没有发生,现在他们已经关闭了似乎不太可能在短期内发生的错误。
更新:IE错误已重新打开,因此有希望。
以下是我对两个类似问题的回答: