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

How to save and restore anchorNode/anchorOffset & focusNode/focusOffset?

本文关键字:anchorNode anchorOffset focusOffset focusNode 恢复 何保存 保存      更新时间:2023-09-26

在以下代码中:

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之前吗?