0

选择文本时,选择开始和结束的确切位置会有所不同,有时它从前一个元素的末尾开始,有时在文本节点的开头。我正在尝试对此进行规范化,使其始终从包含文本的元素的开头开始,并在包含文本的元素的末尾结束,并使其在浏览器中保持一致。

例如<b>mouse></b><i>cat</i>

选择“cat”时,chrome 似乎总是做正确的事情并返回一个带有 startContainer cat 和 startOffset 0 的选择。Firefox 和偶尔的 IE8 通常会从前一个元素(鼠标)的末尾开始,startOffset 为 5

我试图解决这个问题的粗略尝试没有成功:

  var sr=rangy.getSelection().getRangeAt(0);
  var sc=sr.startContainer;
  if(sc.nodeType!=3||sr.startOffset==sc.length)
    {
    sr.setStartAfter(sc);   //move start to next node in range
    }
  rangy.getSelection().setSingleRange(sr);
  console.log(sr.inspect());

我错过了什么?

4

1 回答 1

0

好的,我想我已经破解了它,但我非常愿意接受有关如何改进它的评论或建议。不知何故,它缺乏优雅,我觉得应该有更好的方法。这个问题似乎只需要在 Firefox 中修复。Chrome 和 IE8 似乎从未在包含文本的元素之外进行选择。无论如何,这似乎对我有用。(至今)

var sr=rangy.getSelection().getRangeAt(0);
var sc=sr.startContainer,ec=sr.endContainer;
if(sc.nodeType!=3||sr.startOffset==sc.length)
  {
  sc=(sc.nextSibling)?sc.nextSibling:sc.parentNode.nextSibling;
  if(sc.nodeType!=3)sc=sc.firstChild;
  sr.setStart(sc,0);
  }
if(ec.nodeType!=3||sr.endOffset==0)
  {
  ec=(ec.previousSibling)?ec.previousSibling:ec.parentNode.previousSibling;
  if(ec.nodeType!=3)ec=ec.lastChild;
  sr.setEnd(ec,ec.length);
 }
rangy.getSelection().setSingleRange(sr);
console.log(sr.inspect());
于 2013-04-15T10:48:43.283 回答