0

テキストを選択する場合、前の要素の最後から始まることもあれば、テキストノードの最初から始まることもあるなど、選択の開始と終了の正確な場所にいくつかのバリエーションがあります。これを正規化しようとしているので、常にテキストを含む要素の先頭から始まり、テキストを含む要素の最後で終わり、ブラウザ間で一貫性が保たれます。

例えば<b>mouse></b><i>cat</i>

「cat」を選択すると、chrome は常に正しいことを行い、startContainer cat と startOffset 0 で選択を返すように見えます。

これを修正する私の大まかな試みは成功しませんでした:

  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 に答える