次のコードでは:
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 が入れ替わります。つまり、アンカーは選択範囲の左端にリセットされ、フォーカスは右端にリセットされます。これは、選択範囲が実際に開始および終了した端に関係ありません。範囲を追加するときにアンカーとフォーカスが無視される(または少なくとも保存されない)ようで、デフォルトで左アンカーと右フォーカスを想定しています。
これはめちゃくちゃ迷惑です!
I don't hold out much hope, but is there any way I'm missing that I can work around this behavior. I would really love to be able to restore the original anchor and focus positions.
Works same in chrome and firefox.
EDIT
Ok have worked out a partial answer:
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);
HOWEVER, this won't work in IE9+ as IE doesn't implement the extend method. So now the question becomes, how to make IE play nice in this regard?