0

このリンクの情報は正確ですか?

https://developer.mozilla.org/en-US/docs/DOM/Selection

この文書によると:

anchorOffset: 選択のアンカーが anchorNode 内でオフセットされている文字数を返します。

FireFox を試してみると、定義が常に正しいとは限らないようです。場合によっては、オフセット プロパティが childNode の数を表しているように見えることがあります。予備テストに基づいて、次のコードが機能します。

var sel = window.getSelection() ;
var points = new Array( 0, 0 ) ;
var offset = new Array( sel.anchorOffset, sel.focusOffset ) ;
var nodes = new Array( sel.anchorNode, sel.focusNode ) ;

if ( isText )
    points = offset ;

for ( j = 0 ; j < 2 && ! isText ; j++ ) {
    var kids = nodes[j].childNodes ;
    for ( var i = 0 ; i < offset[j] ; i++ )
        points[j] += kids[i].textContent.length ;
    }

まず、こんな経験をした人はいますか?第二に、 isTextの値を決定するための信頼できる方法を見つけようとして、まだ実験中です。

いくつかの点で、この投稿は部分的に質問であり、部分的に答えです。うまくいけば、コメントは新しい詳細を反映します。

4

1 に答える 1

1

MDN の定義が間違っています[UDPATE: MDN を修正しました]anchorOffsetand anchorNode(およびfocusNodeand ) は、 RangefocusOffset境界と同じように機能します。オフセットは、テキスト ノード (テキスト、文字データ、およびコメント ノード) 内の文字数、または他のすべてのノード タイプで選択アンカーの前にある子ノードの数です。実際には、ご覧のとおり、選択境界は常にテキスト ノード内にあるとは限りません。明らかな例は、キャレットが 2 つの隣接する画像の間にある場合です (キャレットはパイプ文字で表されます)。anchorNode

<div contenteditable="true"><img src="1.png">|<img src="2.png"></div>

また、Firefox は、特に選択によってブロック要素全体 ( など<p>) が選択されている場合に、選択境界を要素内のオフセットとして返すことがよくあります。他のブラウザーはこれを行う傾向がなく、テキスト ノード内でオフセットを返すことを好みます。

についてisTextは、私が正しく理解している場合、完全な実装は次のようなものになります。これは私自身のコードから取得したものです。

function isCharacterDataNode(node) {
    var t = node.nodeType;
    return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment
}
于 2013-02-07T14:37:27.107 に答える