在以下代码中:
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中工作相同。
编辑
Ok,我算出了部分答案:
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在这方面发挥良好?
No。这在IE中是不可能的。一年前,我在IE bug跟踪器中提出了一个bug,建议他们实现extend()
,但它没有发生,现在他们已经关闭了这个bug,似乎不太可能很快发生。
更新:IE bug已经重新打开,所以有希望。
以下是我对两个类似问题的回答:
- https://stackoverflow.com/a/4802994/96100
- 在选择中,focusOffset可以在anchorOffset之前吗?