【问题标题】:rangy fix boundaries范围广泛的修复边界
【发布时间】:2013-04-15 04:18:20
【问题描述】:

选择文本时,在选择开始的情况下有一些变化,因为它在有时它的末尾开始,它在上一个元素的末尾开始,有时在TextNode的开始时。我正在尝试对此进行规范化,使其始终从包含文本的元素的开头开始,并在包含文本的元素的末尾结束,并使其在浏览器中保持一致。

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

When selecting "cat", chrome always seems to do the right thing and return a selection with startContainer cat and startOffset 0. Firefox and occasionally IE8 will often start at the end of the previous element (mouse) with 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());

我错过了什么?

【问题讨论】:

    标签: javascript rangy


    【解决方案1】:

    好的,我想我已经破解了它,但我非常愿意接受 cmets 或有关如何改进它的建议。不知何故,它缺乏优雅,我觉得应该有更好的方法。这个问题似乎只需要在 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());
    

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2022-06-20
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多